티스토리 뷰

3.1 부호/증감 연산자

부호연산자

  • 연산자의 결과는 int타입
+ 부호 유지
- 부호 변경

 

증감 연산자

++i / --i 값을 1 증가 혹은 감소
i++ / i-- 다른 연산을 먼저 수행한 후에 증가 혹은 감소

 

예시

int x = 1;
int y = 1;

int result1 = ++x + 10;
// x의 값을 먼저 증가 1 + 1 = 2
// result = 2 + 10 -> 12 

int result2 = y++ + 10;
// result = 1 + 10 -> 11
// 그 후에 y의 값을 증가 1 + 1 = 2

 

3.2 산술 연산자

  • byte, short, char, int의 결과는 int
  • long가 있으면 결과는 long
  • 실수가 있으면 결과는 실수 타입
+ 덧셈
- 뺄셈
* 곱셈
/ 나눗셈
% 나머지 구하기

 

 

3.3 오버플로우와 언더플로우

  • 오버플로우: 타입이 허용하는 최대값을 벗어나는 것 -> 타입의 최소값으로 돌아감
  • 언더플로우: 타입이 허용하는 최소값을 벗어나는 것 -> 타입의 최대값으로 돌아감

오버플로우 예시

byte value = 127;
value++;
System.out.print(value); // 128이 되어 오버플로우 발생 -> 최소값인 -127 출력

 

언더플로우 예시

byte value = -127;
value--;
System.out.print(value); // -128이 되어 언더플로우 발생 -> 최대값인 127 출력

 

3.4 정확한 계산은 정수 연산으로

  • 실수 타입은 부동 소수점 방식을 사용하기 때문에 약간의 오차 발생
  • 따라서 정확한 계산은 정수 타입으로 하는 것이 좋다.

(아마도 부동 소수점은 이진수로 실수를 표현하는데 일부 실수를 이진수로 완벽하게 표현하기 어렵다. 때문에 일부 소수는 오차가 발생하는 것 같다.)

 

3.5 나눗셈 연산 후 NaN과 Infinity 처리

정수 / 0 일 때 ArithmeticExecption 발생
5 / 0  
5 % 0

 

실수 / 0.0 혹은 0.0f일 때 Infinity 또는 NaN(Not a Number)이 된다. (예외는 아님)
5 / 0.0 -> Infinity
5 % 0.0 -> NaN

 

  • 먼저 확인하고 연산 수행하는 것이 좋다.
boolean result = Double.isInfinite(변수);
boolean result = Double.isNaN(변수);

 

3.6 비교 연산자

== 동등한지
!= 다른지
> 큰지
>= 크거나 같은지
< 작은지
<= 작거나 같은지
  • 연산 수행 전에 (자동으로) 타입을 일치시킨다.
  • 부동 소수점 방식을 사용하는 실수 타입은 0.1을 정확하게 표현할 수 없어 false가 산출되기 때문에 강제로 타입 변환을 한 후에 비교 연산을 한다.
0.1f == 0.1 -> false
0.1f == (float) 0.1 -> true
  • 문자열 비교는 ==, != 대신 equals()를 사용

 

3.7 논리 연산자

&& 모두 true / 앞이 false면 뒤는 판단하지 않음
& 모두 true / 앞뒤 모두 false인지 판단 후에 결정
|| 모두 false / 앞이 true면 뒤는 판단하지 않음
| 모두 false / 앞뒤 모두 false인지 판단 후에 결정
^ 하나는 true 다른 하나가 false
! 피연산자의 논리값을 바꿈

 

 

3.8 비트 논리 연산자

  • bit 단위로 논리 연산 수행
  • 2진수 0과 1로 저장되는 정수타입만 사용 가능 
  • 실수 타입은 사용 불가능
  • int 타입으로 자동 변환한 후 연산 수행
& 모두 1일 때 1
\ 둘 중 하나만 1일 때 1  
^ 하나는 1 다른 하나가 0일 때 1  
~ 보수

 

 

3.9 비트 이동 연산자

  • 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산 수행

 

3.10 대입 연산자 

 단순 대입 연산자 

= 우측 값을 좌측 변수에 저장

 

복합 대입 연산자

+= 우측의 값과 변수의 값을 더한 후에 변수에 저장
-= 우측의 값과 변수의 값을 뺀 후에 변수에 저장 
*= 우측의 값과 변수의 값을 곱한 후에 변수에 저장 
/= 우측의 값과 변수의 값을 나눈 후에 변수에 저장 
%= 우측의 값으로 변수의 값을 나눈 후에 나머지를 변수에 저장   
&= 우측의 값과 변수의 값을 & 연산 후에 결과를 저장 
|= 우측의 값과 변수의 값을 \| 연산 후에 결과를 변수에 저장
^= 우측의 값과 변수의 값을 ^ 연산 후에 결과를 변수에 저장
<<= 우측의 값과 변수의 값을 << 연산 후에 결과를 변수에 저장
>>= 우측의 값과 변수의 값을 >> 연산 후에 결과를 변수에 저장
>>>= 우측의 값과 변수의 값을 >>> 연산 후에 결과를 변수에 저장 

 

 

3.11 삼항 연산자

조건 `?` 조건이 `true`일 때 연산식 `:` 조건이 `false`일 때 연산식

 


3.12 연산의 방향과 우선순위

  • 연산자 사이에는 우선순위가 있고, 우선순위가 높은 순으로 우선 처리 됨
  • 우선순위가 같을 떄는 연산의 방향에 따라 외쪽에서 오른쪽 -> 으로 연산 수행
  • 대입 연산자는 오른쪽에서 왼쪽 <- 으로 연산 수행
  • 먼저 처리해야할 연산은 괄호()로 묶는 것이 좋다.

 

최근에 올라온 글