[Java] Chapter 3. 연산자

SeungWoo Cha·2025년 9월 5일

Chapter 3. 연산자

3.1. 부호 / 증감 연산자

  • 부호 연산자(+, -)도 연산자이므로, 연산 결과는 자동으로 int 타입으로 변환된다.

    byte b = 100;
    byte result = -b; // 컴파일 에러 (int로 변환되기 때문)
  • 해결 방법: 강제 형 변환

    byte result = (byte) -b;

3.2. 산술 연산자 (특징)

  • 피연산자가 정수 타입(byte, short, char, int) → 결과는 항상 int
  • 피연산자 중 하나가 long → 결과는 long
  • 피연산자 중 하나가 실수(float, double) → 결과는 실수 타입

3.3. 오버플로우 / 언더플로우

  • 자바에서 오버플로우 / 언더플로우 발생 시 에러가 발생하지 않는다.

  • 범위를 벗어나면 최소값 ↔ 최대값으로 순환된다.

    int x = 1000000;
    int y = 1000000;
    int z = x * y; // 오버플로우 발생

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

  • 실수 연산은 부동소수점 방식이므로 오차가 발생할 수 있다.
  • 정확한 계산이 필요하면 정수 타입 또는 BigDecimal을 사용해야 한다.

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

  • 정수 나눗셈:

    • 0으로 나누면 ArithmeticException 발생
  • 실수 나눗셈:

    • 0.0 또는 0.0f으로 나누면 예외 발생하지 않고, NaN 또는 Infinity가 결과로 나옴
  • 안전한 연산을 위해 결과를 검사해야 한다.

    double a = 0.0 / 0.0;   // NaN
    double b = 5.0 / 0.0;   // Infinity
    
    if (Double.isNaN(a) || Double.isInfinite(b)) {
        System.out.println("연산 불가");
    }

3.6. 비교 연산자

  • 피연산자 타입이 다르면 자동 타입 변환 후 비교가 수행된다.

  • 예외: 실수 타입은 부동소수점 방식이라 정밀도 차이 발생 (float vs double)

    • 예: 0.1f == 0.1 → false
  • 문자열 비교: == 대신 .equals() 사용

    String s1 = "java";
    String s2 = new String("java");
    System.out.println(s1 == s2);       // false
    System.out.println(s1.equals(s2)); // true

3.7. 논리 연산자

  • &&, ||: 단축 평가(Short-circuit evaluation) 수행

    • 앞의 결과에 따라 뒤의 피연산자를 평가하지 않을 수도 있음
  • &, |: 항상 양쪽 모두 평가


3.8. 비트 논리 연산자 (&, |, ^, ~)

  • 피연산자는 정수 타입(byte, short, char, int, long)만 가능

  • byte, short, char는 연산 시 자동으로 int로 변환된다. 따라서 결과도 int 타입에 저장해야 한다.

    byte data = -120;
    int unsignedInt = Byte.toUnsignedInt(data);

3.9. 비트 이동 연산자 (<<, >>, >>>)

  • << : 왼쪽으로 비트 이동 (빈칸 0 채움, 곱하기 2의 n제곱 효과)
  • >> : 오른쪽으로 비트 이동 (부호 유지, 나누기 2의 n제곱 효과)
  • >>> : 오른쪽으로 비트 이동 (빈칸 0 채움, 부호 비트 무시)

3.10. 대입 연산자 (=, +=, -=, ...)

  • 오른쪽의 값을 왼쪽 변수에 저장한다.

  • 복합 대입 연산자:

    int x = 10;
    x += 5; // x = x + 5

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

  • 형식:

    조건식 ?1 :2
  • 조건식이 true → 값1 반환

  • 조건식이 false → 값2 반환


3.12. 연산의 방향과 우선순위

  • 대부분의 연산자는 왼쪽 → 오른쪽 방향으로 계산된다.

  • 예외: 대입 연산자는 오른쪽 → 왼쪽

    int a, b, c;
    a = b = c = 5; // c=5 → b=5 → a=5
profile
한 발자국씩

0개의 댓글