03 연산자

winA·2025년 7월 1일

BE/Java

목록 보기
5/16
post-thumbnail

💛 부호/증감 연산자

부호 연산자

변수의 부호를 유지하거나 변경

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

증감 연산자

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

연산식설명
++피연산자피연산자의 값을 1 증가시킴
—피연산자피연산자의 값을 1 감소시킴
피연산자++다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴
피연산자—다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴

💛 산술 연산자

연삭식설명
+덧셈 연산
-뺄셈 연산
*곱셈 연산
/나눗셈 연산
%나눗셈의 나머지를 산출하는 연산
  • 피연산자가 정수 타입이면 연산의 결과는 int 타입이다.
  • 피연산자가 정수 타입이고, 그 중 하나가 long 타입이면 결과는 long 타입이다.
  • 피연산자 중 하나가 실수 타입이면 연산의 결과는 실수 타입이다.

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

오버플로우

타입이 허용하는 최대값을 벗어나는 것

언더플로우

타입이 허용하는 최소값을 벗어나는 것

오버플로우, 언더플로우가 발생하면, 해당 정수 타입의 최소값 또는 최대값으로 되돌아간다.

byte 타입일 경우 최대값 127에서 1을 더하면 128이 되어 오버플로우가 발생하고, 연산 결과는 최소값인 -128이 된다. 그리고 다시 1을 더하면 -127이 된다.

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

산술 연산을 정확하게 계산하고 싶다면 실수 타입의 사용은 지양해야 한다. 정확한 계산이 필요하다면 정수 연산으로 변경하여 연산 과정을 가져야 한다.

package ch03.sec04;

public class AccuracyExample1 {

  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);
  }
}

부동 소수점 방식을 사용하는 실수 타입에서 정확한 계산이 발생하지 않을 수도 있다.

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

숫자를 0으로 나누거나(/), 나머지(%)를 구하고자 하는 경우 예외가 발생(ArithmeticException)한다. 컴퓨터는 무한대의 값을 정수로 표현할 수 없다.

하지만 0.0으로 나누는 경우에는 예외가 발생하는 것이 아닌 Infinity 또는 NaN이 된다. 이 값에서 어떤 값을 연산하더라도 Infinity, NaN의 값이다. 그래서 이 상태에서 연산을 계속 수행하면 안 된다.

Double.isInfinite(), Double.isNaN()을 사용하여 해당 연산의 결과가 Infinity, NaN인지 확인하고 다음 연산을 수행해줘야 한다.

package ch03.sec05;

public class InfinityAndNaNCheckExample {

  public static void main(String[] args) {
    int x = 5;
    double y = 0.0;
    double z = x / y;
//double z = x % y;

//잘못된 코드
    System.out.println(z + 2);
    
//알맞은 코드
    if (Double.isInfinite(z) || Double.isNaN(z)) {
      System.out.println("값 산출 불가");
    } else {
      System.out.println(z + 2);
    }
  }
}

💛 비교 연산자

동등(==, !=), 크기(<, <=, >, >=)를 평가해서 boolean 타입으로 산출

흐름 제어문인 조건문, 반복문에서 실행 흐름을 제어할 때 주로 사용된다.

특징

피연산자의 타입이 다를 경우에는 비교 연산을 수행하기 전에 타입을 일치시킨다. ‘A’==65라면 A를 65로 변환한 다음 비교한다.

0.1f==0.1에서는 false가 반환된다. 부동 소수점을 사용하는 실수타입은 0.1을 정확히 표현할 수 없고, floatdouble 타입의 정밀도 차이 때문에 정확히 같은 값이라고 볼 수 없다.

💛 논리 연산자

구분연산식설명
AND(논리곱)&&, &피연산자가 모두 true일 경우에만 연산 결과가 true
OR(논리합)
XOR(배타적 논리합)^피연산자가 하나는 true이고 다른 하나가 false일 경우에만 연산 결과가 true
NOT(논리 부정)!피연산자의 논리값을 바꿈

흐름 제어문인 조건문, 반복문 등에서 주로 사용된다.

💛 비트 논리 연산자

bit 단위로 논리 연산을 수행한다. 정수 타입(byte, short, int, long)만 피연산자가 될 수 있다. 산출 결과가 1,0으로 산출된다.

구분연산식설명
AND&두 비트 모두 1일 경우에만 연산 결과가 1
OR
XOR^두 비트 중 하나는 1이고 다른 하나는 0일 경우 연산 결과는 1
NOT~보수

자바에서는 바이트 타입이 부호 있는 정수(signed byte)로 처리되기 때문에, 0~255 범위의 부호 없는 바이트(unsigned byte) 값을 사용해야 할 경우가 생긴다. 자바에서는 개발자의 편리성을 위해서 Byte.toUnsignedInt()코드를 제공한다.

💛 비트 이동 연산자

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

구분연산식설명
shifta<<b정수 a의 각 비트를 b만큼 오른쪽으로 이동한다. 오른쪽 빈자리는 0으로 채운다. a2ba*2^b와 동일한 결과이다.
a>>b정수 a의 각 비트를 b만큼 오른쪽으로 이동한다. 왼쪽 빈자리는 최상위 부호 비트와 같은 값으로 채운다. a/2ba/2^b와 동일한 결과이다.
a>>>b정수 a의 각 비트를 b만큼 오른쪽으로 이동한다. 왼쪽 빈자리는 0으로 채운다.

💛 대입 연산자

  • =: 우측의 피연산자의 값을 변수에 저장한다
  • +=: 변수 = 변수 + 피연산자
  • -=: 변수 = 변수 - 피연산자
  • *=: 변수 = 변수 * 피연산자
  • /=: 변수 = 변수 / 피연산자
  • %=: 변수 = 변수 % 피연산자
  • &=: 변수 = 변수 & 피연산자
  • |=: 변수 = 변수 | 피연산자
  • ^=: 변수 = 변수 ^ 피연산자
  • <<=: 변수 = 변수 << 피연산자
  • >>=: 변수 = 변수 >> 피연산자
  • >>>=: 변수 = 변수 >>> 피연산자

💛 삼항 연산자

조건식 ? true일 때 값 : false일 때 값

💛 연산의 방향과 우선순위

  1. 증감(++,—), 부호(+,-), 비트(~), 논리(!)
  2. 산술(*,/,%)
  3. 산술(+,-)
  4. 쉬프트(<<,>>,>>>)
  5. 비교(<,>,<=,>=,instanceof)
  6. 비교(==,!=)
  7. 논리(&)
  8. 논리(^)
  9. 논리(|)
  10. 논리(&&)
  11. 논리(||)
  12. 조건(?:)
  13. 대입(=,+=,-=,*=,/=%=,&=,^=,|=,<≤,>≥,>>≥)

괄호를 사용해서 우선순위를 확실하게 정해주는 것이 좋다.

0개의 댓글