본문으로 건너뛰기
안동민 개발노트 아이콘

안동민 개발노트

본문 시작
3장 : 연산자와 표현식

대입과 증감 연산

대입은 계산 결과를 변수에 저장하고 프로그램의 다음 상태를 만듭니다.

복합 대입 연산자는 짧지만 내부 형변환 규칙이 일반 산술 뒤 대입과 다를 수 있습니다.

전위와 후위 증감은 단독 문장에서는 결과가 같아도 더 큰 표현식 안에서는 값이 달라집니다.

한 줄에서 상태 변경과 값 사용을 섞으면 코드를 추적하기 어려워집니다.

이 절에서는 식의 값과 식이 남기는 상태 변화를 분리해 봅니다.


대입식은 오른쪽부터 계산한다

오른쪽 표현식이 먼저 평가된 뒤 왼쪽 변수에 저장됩니다.

연쇄 대입은 가능하지만 여러 변수가 동시에 바뀌어 의도를 숨길 수 있습니다.


복합 대입에는 암시적 축소가 들어간다

byteValue += 1은 결과를 다시 byte로 변환하지만 byteValue = byteValue + 1int 결과라 바로 대입할 수 없습니다.

짧은 문법이 손실 가능성까지 없애지는 않습니다.

아래 예제는 식이 계산해 내놓는 값과 계산 뒤 변수에 남는 값을 모두 출력합니다. 전위·후위 연산을 한쪽 결과만 보고 이해할 때 생기는 혼동을 두 상태로 나누어 봅니다.

AssignmentEffects.java
public class AssignmentEffects {
    public static void main(String[] args) {
        int count = 5;
        int before = count++;
        int after = ++count;
        System.out.println("before=" + before);
        System.out.println("count=" + count);
        System.out.println("after=" + after);

        byte small = 10;
        small += 1;
        System.out.println("small=" + small);
        // small = small + 1; // 컴파일 오류: 계산 결과는 int
    }
}

byte 변수에 +=가 허용되는 것은 오른쪽 계산 결과를 다시 byte로 암시적 변환하기 때문입니다. 같은 식을 small = small + 1로 풀면 int 결과를 대입할 수 없다는 오류가 나므로, 짧은 문법 안에 숨은 축소와 오버플로 가능성을 함께 읽어야 합니다.

before=5
count=7
after=7
small=11

후위 증감은 이전 값을 내놓은 뒤 상태를 바꾸고 전위 증감은 먼저 바꾼 값을 내놓습니다.


전위와 후위는 식이 내놓는 값이 다르다

++count는 증가한 값을, count++는 증가 전 값을 식의 결과로 사용합니다.

다른 연산과 섞지 않고 독립 문장으로 두면 차이를 신경 쓸 일이 줄어듭니다.

++ii++는 문장 하나로 쓸 때 최종 상태가 같지만 더 큰 식 안에서는 내놓는 값이 다릅니다. result = i++ + ++i처럼 한 식에서 같은 변수를 여러 번 바꾸는 코드는 계산 가능하더라도 읽기 어려우므로 증감과 사용을 문장으로 분리합니다.

비교 1
int value = 3;
value += 2; // 읽기-계산-대입을 한 문장으로 표현
비교 2
int observed = value;
value++;             // 상태 변경을 독립 문장으로 둠
System.out.println(observed + " -> " + value);

증감 연산은 짧게 쓰는 기술보다 어느 시점의 값을 사용하고 상태를 언제 바꾸는지 명확히 하는 기술입니다.