개발저장소

[Java] 연산자 본문

Programming Language/Java

[Java] 연산자

개발소 2024. 4. 10. 01:17

연산자(Operator)

연산자란, 하나 이상의 피연산자를 취하여 연산을 수행하는 기호이다. 연산의 결과로 새로운 값을 생성한다.

Java는 다음과 같은 연산자를 제공한다.

  • 부호/증감 연산자
  • 산술 연산자
  • 비교 연산자
  • 논리 연산자
  • 비트 연산자
  • 대입 연산자
  • 삼항 연산자

 

1. 부호/증감 연산자

부호 연산자는 변수의 부호를 유지하거나 변경한다.

연산식 설명
+ 피연산자 피연산자의 부호 유지
- 피연산자 피연산자의 부호 변경

 

+ 연산자는 잘 사용되지 않고, - 연산자는 변수값의 부호를 변경할 때 사용된다. 부호를 변경할 때, 타입에 유의해야 한다. 예를 들어, byte 타입의 변수를 - 연산한다면 int 타입 변수에 대입해야 한다.

 

증감 연산자는 변수의 값을 1 증가시키거나 감소시키는 연산자이다.

연산식 설명
++ 피연산자 피연산자의 값을 1 증가/감소 시킴
전위 증감 연산자라고 한다.
-- 피연산자
피연산자 ++ 다른 연산을 수행한 후, 증가/감소 시킴
후위 증감 연산자라고 한다.
피연산자 --

 

전위 증감 연산자는 피연산자의 값을 증감시킨 후 다른 연산을 수행한다.

반대로 후위 증감 연산자는 다른 연산을 먼저 수행한 후 피연산자를 증감시킨다.

int x = 1;
int y = 1;
int result1 = ++x + 10; // x를 1 증가시킨 후, int result1 = 2 + 10;을 연산한다. result1은 12가 된다.
int result2 = y++ + 10; // int result2 = 1 + 10;을 연산한 후, y를 1 증가시킨다. result2에는 11이 저장된다.

 

결과적으로 x와 y는 둘 다 2로 증가했지만, 그 과정에서 result는 다른 결과가 저장되었다.

 

 

2. 산술 연산자

산술 연산자는 더하기(+), 빼기(-), 곱하기(*), 나누기(/), 나머지(%) 5개이다. 곱셈은 *를 사용하고 나눗셈은 /를 사용한다. % 연산자는 나눗셈을 한 후, 나머지를 출력한다.

 

 

3. 비교 연산자

비교 연산자는 동등 또는 크기를 평가해서 boolean 타입으로 출력한다. 조건문이나 반복문에 주로 사용된다.

구분 연산식 설명
동등 비교 == 두 피연산자의 값이 같은지 검사
!= 두 피연산자의 값이 다른지 검사
크기 비교 > 왼쪽 피연산자가 큰지 검사
>= 왼쪽 피연산자가 크거가 같은지 검사
< 왼쪽 피연산자가 작은지 검사
<= 왼쪽 피연산자가 작거가 같은지 검사

 

실수를 비교할 때, 부동 소수점을 유의해야 한다. 부동 소수점을 사용한 실수 타입은 정확한 값을 표현할 수 없고, float과 double 타입의 정밀도도 차이 난다. 문자열을 비교할 때는 동등 비교 연산자 대신, equals()와 !equals()를 사용한다.

 

 

4. 논리 연산자

논리 연산자는 AND, OR, XOR, NOT 연산을 수행한다. 역시 조건문이나 반복문에 주로 사용된다.

입력 연산 결과
a b AND OR XOR NOT
a && b a || b a ^ b ! a
true true true true false false
true false false true true false
false true false true true true
false false false false false true

 

&&와 &는 결과는 같지만 연산 과정이 조금 다르다. AND 연산은 피연산자 중 하나라도 false라면 출력 결과가 false가 되는 특징이 있다. &&는 앞의 피연산자가 false라면 뒤의 피연산자는 무시하고 바로 false를 출력한다. 그렇기에 &보다 더 빠르고 효율적이다. ||도 마찬가지로 앞의 피연산자가 true라면 뒤의 피연산자는 무시하고 바로 true를 출력한다.

 

 

5. 비트 연산자

비트 연산자는 비트 논리 연산자와 비트 이동 연산자가 있다.

비트 논리 연산자는 bit 단위로 논리 연산을 수행한다. AND(&), OR(|), XOR(^), NOT(~)이 존재하며, 1을 true, 0을 false라고 생각하면 논리 연산자와 일치한다.

 

비트 이동 연산자는 비트를 좌우로 밀어서 이동시키는 연산을 수행한다.

구분 연산식 설명
이동
(Shift)
a << b 정수 a의 각 비트를 b만큼 왼쪽으로 이동
왼쪽 비트는 버리고, 오른쪽 빈자리는 0으로 채운다.
a × 2b와 동일한 결과가 된다.
a >> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동
오른쪽 비트는 버리고, 왼쪽 빈자리는 최상위 부호 비트와 같은 값으로 채운다.
a / 2b와 동일한 결과가 된다.
a >>> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동
왼쪽 빈자리는 무조건 0으로 채운다.

 

우측 이동 연산자 >>와 >>>의 차이는 음수일 경우 두드러진다. >>>를 사용할 경우, 부호 비트를 무시하고 0으로 채우기 때문에 비트 패턴만 고려해야 하는 경우 적합하다.

 

 

6. 대입 연산자

대입 연산자는 우측 피연산자를 좌측의 변수에 대입한다. 단순히 값을 대입하는 단순 대입 연산자(=)와, 정해진 연산을 수행 후 결과를 대입하는 북합 대입 연산자(+=, -=, *= 등)이 있다.

 

 

7. 삼항 연산자

삼항 연산자는 총 3개의 피연산자를 가진다. ( 피연산자1 ? 피연산자2 : 피연산자3 )

피연산자1은 조건식이 오고, 이 값이 true일 경우 피연산자2가, false인 경우 피연산자3이 선택된다.

int score = 65;
char pass = (score >= 60) ? 'P' : 'F'; // 60점 이상은 합격, 미만은 불합격

 

 

 

오버플로우 / 언더플로우

타입이 허용하는 범위를 벗어나는 것을 말한다.

정수 타입 연산에서 범위를 넘어가면 에러가 발생하지 않고, 최대값 또는 최소값으로 넘어간다. 예를 들어, byte 타입의 변수가 127에서 1이 더해진다면 최소값인 -128이 된다.

이러한 오버플로우와 언더플로우를 방지하기 위해서는 타입의 범위 내에서 연산이 일어나도록 신경써야 한다.

 

 

ArithmeticException / Infinity / NaN

ArithmeticException은 정수형 피연산자를 0으로 나누거나 나머지 연산한 경우 발생하는 예외이다.하지만 실수형으로 0을 나누거나 나머지 연산한 경우, 예외가 발생하지 않는다.나눗셈 연산은 Infinity(무한대), 나머지 연산은 NaN(Not a Number)를 출력한다. Infinity와 NaN은 더 이상 연산을 할 수 없는 상태이므로, Double.isInfinite() 또는 Double.isNaN() 메소드를 사용해서 결과를 먼저 확인하는 것이 좋다.

'Programming Language > Java' 카테고리의 다른 글

[Java] 클래스 - 2  (0) 2024.04.30
[Java] 클래스 - 1  (0) 2024.04.26
[Java] 제어문  (0) 2024.04.10
[Java] 변수와 타입  (0) 2024.03.29
[Java] Java란?  (0) 2024.01.22