본문 바로가기
Java

[JAVA] Chapter 2. 변수와 연산자

by nyeoo 2023. 11. 7.

1. 변수 선언 규칙

  • 반드시 숫자가 아닌 문자로 시작
  • 공백 포함 불가, 특수기호는 $, _ 만 허용
  • 자바에서 미리 지정한 예약어는 사용불가
  • 공백 포함 불가
  • 변수의 상수화 : final 키워드 + 변수명 대문자
  • 예시 : final double PI = 3.141592;

2. 데이터 타입

자료형 데이터 메모리크기 표현가능범위
boolean 참과거짓 1바이트 true, false
char 문자 2바이트 모든 유니코드 문자
byte 정수 1바이트 -128 ~ 127
short 정수 2바이트 -32768 ~ 32767
int 정수 4바이트 -2147483648 ~ 2147483647
long 정수 8바이트 큰 정수(경을 넘김)
float 실수 4바이트 큰 실수
double 실수 8바이트 더 큰 실수
  • 5 : 정수형
  • 5.0 : 실수형
  • '5' : 문자형
  • "5" : 문자열형

3. 실수 표현 방식

  • 0과 1사이 실수만 해도 무한대이므로 표현이 어려우며, 사용자와 프로그램이 요구하는 값을 정확하게 제시할 수 없으므로 정밀도를 포기하고 표현가능한 데이터 값의 범위를 늘려놓음
  • 자바가 값을 저장할 때도 공식에 따라 근사치로 저장, 꺼내서 쓸 때도 다시 공식에 따라 근사치로 꺼내서 사용함

4. 정수형은 무조건 int 사용?

  • 데이터를 보관만 한다면 메모리를 적게 사용하는 데이터타입을 사용하는 것이 좋으나, 추가적으로 연산이 필요한 경우라면 int를 사용함
  • 즉, byte, short, float은 연산이 필요없는 경우, 빠른 연산을 필요로 하지 않을 때 사용

▶ 연산과정

byte 10 + byte 10  
//→ 00001010 + 00001010  
//→ 연산할 때 4바이트(int 타입)으로 자동변환 (00000000 00000000 00000000 00001010)  
//→ 더한 후 다시 1바이트(byte 타입)로 변환


//-- 같은 관점으로, 실수형은 float 대신, double을 기본적으로 사용. 그 이유는 float에 비해 double은 표현 범위가 더 넓어서 정밀도가 높으며 자바는 실수형을 double형식(8바이트)으로 저장하기 때문임

float a = 0;
double b = 0;

//100,000(십만) 번 반복  
for (int i=1; i<=100000; i++)  
{  
a += 100000;  
b += 100000;  
}

// 결과 출력  
System.out.println("float a : " + (a/100000));  
//--==>> float a : 99996.055

System.out.println("double b : " + (b/100000));  
//--==>> double b : 100000.0

5. 상수

  • 자바는 변수를 선언하고, 상수를 변수에 넣을 때도 이 상수를 메모리공간에 저장함. 이후 상수가 쓸모가 없어지면 메모리공간과의 연결고리가 끊어짐
  • 상수가 저장된 메모리 공간을 Garbage collector가 청소하는 시점에 소멸됨

6. 형 변환

int num1 = 10000000000 -> error  
long num2 = 10000000000 -> error  
//→ 우항의 정수를 자바가 int형으로 저장하기 때문에, int형의 범위를 초과하는 백억은 저장 불가

int num1 = 10000000000L -> error (데이터타입 맞지않음)  
long num2 = 10000000000L -> 실행  
//→ Long 타입을 의미하는 L을 붙이면 에러 나지 않음

float num1 = 3.14 -> error  
float num1 = 3.14F -> 실행  
//→ 우항의 실수를 자바가 double형으로 저장하기 때문에, 형 변환 필요

6-1. 자동 형 변환

6-2. 강제 형 변환(명시적 형 변환)

  • 데이터 타입을 작은 데이터 타입으로 변환하거나, 두 가지 데이터 타입이 자동 변환될 수 없을 때 직접 지정하여 변환하는 것. 이 때 데이터의 일부 정보가 손실될 수 있으므로 주의
int a = 65;  
char b = (char)b;  
System.out.println(b); //A

7. 연산자

 단항 연산자

연산자 의미 예시
+, - 양수, 음수  
++,-- 증감연산자(1 증가, 1 감소) ++a(전위연산) a++(후위연산)

 

산술 연산자(이항 연산자)

연산자 의미
+ 더하기
- 빼기
* 곱하기
/ 나누기 (정수형 나누기에서 몫만 취하고 나머지 버림)
% 나머지 (나머지를 취하고 몫은 버림)

 

복합 대입 연산자(이항 연산자)

연산자 예시 의미
+= a += 3 a = a + 3
-= a -= 3 a = a - 3
*= a *= 3 a = a * 3
/= a /= 3 a = a / 3
%= a %= 3 a = a % 3

 

비교 연산자(이항 연산자)

연산자 예시 의미
>, >= a >= 3 a가 3보다 크거나 같다
<. <= a <= 3 a가 3보다 작거나 같다
== a == 3 a가 3과 같다
!= a != 3 a가 3과 같지 않다

 

 논리 연산자(이항연산자)

연산자 의미
&& 연산자 기준 양쪽의 조건이 모두 참일 때 전체 결과 참 (AND)
|| 연산자 기준 양쪽의 조건 중 하나만 참이면 전체 결과 참(OR)

 

 조건 연산자(삼항 연산자)

(조건식 ? 값1 : 값2);
→ 조건식이 true일 때 값1이 처리되고, false일 때 값2가 처리됨

 

▶ 비트와 관련이 있는 연산자들

 

· 일반 연산자들보다 빠름(연산이 중첩되고 많아질수록)

연산자 의미 예시  
& 비트대상 AND 1&1 → 1 1&0 → 0
| 비트대상 OR 1|1 → 1 1|0 → 1
^ 비트대상 XOR 1^1 → 0 0^0 → 0
~ 비트대상 NOT(피 연산자 모든 비트를 반전시킴) ~11110101 → 00001010  

·  비트 shift 연산자 : 비트열을 이동시키는 연산자

연산자 의미 예시
<< 피연산자 비트열을 왼편으로 두 칸 이동 (남는자리에 0으로 채운다) 00001010 → 00101000
>>> 피연산자 비트열을 오른편으로 두 칸 이동 (남는자리에 0으로 채운다) 00001010 → 00000010
>> 피연산자 비트열을 오른편으로 두 칸 이동 (남는자리에 음수는 1로, 양수는 0으로 채운다) 00001010 → 00000010