자바 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); // 공유된 데이터 읽기
      }
    }
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.