[Java] 연산자란 무엇인가?

2024. 8. 1. 15:21Java/연산자

부호/증감 연산자

부호 연산자는 +와 -가 있다. -연산자는 변수값의 부호를 변경할 때 사용된다. 주의할 점은 부호 변경 후의 타입이다. 정수 타입(byte, short, int) 연산의 결과는 int 타입이다.

byte b = 100;
byte result = -b; //컴파일 에러
int result2 = -b; //에러 없음

 

증감 연산자(++, --)는 변수의 값을 1증가시키거나 감소시키는 연산자이다. 피연산자 앞에 오면 먼저 값을 증가(감소) 시키지만, 피연산자 뒤에 오면 다른 연산을 수행한 후에 값을 증가(감소)시킨다. 

public class test {
  public static void main(String[] args) {
    int x = 1;
    int y = 1;
    int result1 = ++x + 10;
    int result2 = y++ + 10;

    System.out.println("result1 = " + result1); //12
    System.out.println("result2 = " + result2); //11
  }
}

산술 연산자

+, -, *, /, %로 5개이다. % 연산자는 나눗셈을 수행한 후에 몫이 아닌 나머지를 산출한다.

 

산출 연산은 다음과 같은 특징을 갖는다. 

 

1. 피연산자가 정수타입이면 연산 결과는 int타입이다. 

2. 피연산자가 정수타입이고 그 중 하나가 long이면 연산의 결과는 long타입이다. 

3. 피연산자 중 하나가 실수 타입이면 연산의 결과는 실수 타입이다. 

오버플로우와 언더플로우

오버플로우와 언더플로우는 타입이 허용하는 최대값 혹은 최소값을 벗어나는 것을 말한다. 실행 에러가 발생하지 않고 해당 정수 타입의 최소값 또는 최대값으로 되돌아간다. 

 

예를 들어 byte는 -128~127의 범위를 갖는다. 그런에 127에 1을 더하면 128이 되는 것이 아니라, -128이 된다. 마찬가지로 -128에서 1을 빼면 127이 된다. 

 

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

부동 소수점 방식을 사용해서 발생한 문제이다. 아래 코드의 결과는 0.3이 나와야 하지만 정확한 값이 나오지 않는다. 실수 타입에서 흔히 발생하는 문제이다. 

public class test {
  public static void main(String[] args) {
    int apple = 1;
    double pieceUnit = 0.1;
    int number = 7;

    double result = apple - number * pieceUnit;
    System.out.println("사과 1개에서 남은 양:" + result);
  }
}

 

 

이 문제를 해결하기 위해서는 0.1에 10을 곱한 다음에 마지막 출력 전에 10.0으로 나누면 된다. 즉, 정수로 계산한 다음에 실수로 변환한 것이다. 

나눗셈 연산 후 NaN과 Infinity 처리

다음 코드에서는 예외가 발생한다. 

int x = 5;
int y = -;
int result = 5/0; //예외 발생

 

만약 좌측 피연산자가 실수이거나 우측 피연산자가 0,0 또는 0.0f이면 예외가 발생하지 않고 Iinfinity 또는 NaN이 된다. 연산 결과가 infinity인지 NaN인지 확인하려면 double.isInfinit()와 double.isNaN()을 사용한다. 맞으면 true 아니면 false를 산출한다. 아래와 같이 사용할 수 있다. 

if(Double.isInfinite(z) || Double.isNaN(z) {
  System.out.println("값 산출 불가")
}

 비교연산자

==, !=, <, <=, >, >=를 평가하여 true 혹은 false를 산출한다. 보통 조건문이나 반복문에서 사용한다. 타입이 다른 경우에는  비교 연산을 위해 타입을 일치시킨다. 

'A' == 65  //true
3 == 3.0 // true

 

예외적으로 부동 소수점 방식으로 인해 0.1f == 0,1은 false가 산출된다. 

 

참고로 문자열을 비교할 때에는 equals()와 !equals()를 사용한다. 

*대소문자 구별을 하고 싶지 않으면 equalsIgnoreCase()를 사용한다. (출저: <<자바의 정석 기초편 p.86>>)

논리연산자

논리 연산자에는 &&, ||, ^, ! 가 있다. ^는 잘 쓰지 않으므로 주의하자. 

&&는 앞의 피연산자가 false라면 바로 false를 산출한다. &는 피연산자 모두를 평가해서 산출 결과를 낸다. ||와 |도 마찬가지이다. 즉, 효율성 면에서는 &&, ||가 더 좋다. 

 

대입연산자

대입 연산자는 단순히 값을 대입하는 단순 대입 연산자와, 정해진 연산 후 결과를 대입하는 복합 대입 연산자가 있다.

삼항연산자

삼항 연산자는 ? 앞의 피연산자는 boolean 변수 또는 조건식이 오므로 조건 연산자라고 한다. 이 값이 true면 콜론 앞의 피연산자가 선택되고, false면 콜론 뒤의 피연산자가 선택된다. 피연산자에 다시 조건식을 넣어서 늘리는 것도 가능하다. 

연산의 방향과 우선순위

연산자는 우선순위가 정해져있다. 같은 우선순위끼리는 왼쪽에서 오른쪽으로 연산을 수행한다. 연산 방향과 우선순위는 다음과 같다. 

만약 순서를 바꾸고 싶다면 괄호()를 이용하면 된다. 

 

-비트 논리 연산자, 비트 이동 연산자 생략

'Java > 연산자' 카테고리의 다른 글

[Java] 연산자 연습문제 풀이  (0) 2024.08.01
[Java] Math.round()로 반올림하기  (0) 2024.08.01