더북(TheBook)

자바 vs. 코틀린 코틀린과 달리 자바에서는 포획한 변수의 값을 변경할 수 없다. 더 나아가 익명 클래스 내부에서 포획한 변수를 사용할 경우에는 명시적으로 final로 선언해야만 한다. 하지만 코틀린이 제공하는 포획 변수를 변경하는 기능은 그에 따른 비용을 수반한다. 익명 객체와 이 객체를 둘러싸고 있는 코드 사이에 변수를 공유하기 위해 코틀린 컴파일러는 (공유되는) 값을 특별한 래퍼(wrapper) 객체로 둘러싼다. 위 Counter 예제를 컴파일한 바이트코드에 해당하는 자바 코드는 다음과 같다.

import kotlin.jvm.internal.Ref.IntRef;

class MainKt {
  public static void main(String[] args) {
    final IntRef x = new IntRef(); // 래퍼 생성
    x.element = 1;
    
    final class Counter {
      public final void increment() {
        x.element++; // 공유된 데이터 변경하기
      }
    }
    
    (new Counter()).increment();
    
    System.out.println(x.element); // 공유된 데이터 읽기
  }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.