Skip to content
Younghoo Kim edited this page Aug 12, 2015 · 3 revisions
package com.hoo;

public class Main {

    /**
     * Inner Class의 Closure
     *
     * inner Class의 경우 외부 환경에 대한 레퍼런스를 가지고 있기 때문에
     * variable x와 y에 대해 접근이 가능하다.
     * variable y의 경우 field variable로 선언되었기 때문에
     * 프로세스가 수행되는 동안에는 참조값이 유지된다.
     * 따라서 innerClass에서 variable y에 대해 참조 및 값의 변경이 가능하다.
     * 하지만 foo() 메소드 내부에 있는 variable x는 foo() 메소드 수행
     * 이후 값이 소멸되는게 정상이지만 JAVA에서는 inner Class에서
     * variable x에 대한 접근을 가능하게 하고 있다.
     * (정확히는 생성된 익명 객체가 variable x의 복사본을 가지게 된다.)
     * 하지만 제약조건은 존재한다.
     * 그것은 바로 final로 선언되어야 한다는 점이다.
     * 예를 들어, variable x가 btn.setActionListener() 메소드 이후에
     * 값이 변경되었다면 inner Class는 variable의 어떤 값을 참조해야 하는
     * 지에 대한 모호함이 발생하기 때문이다.
     */

    private String y = "world";

    public void foo() {
        final String x = "hello";
        final int y = 1;
        Button btn = new Button();
        btn.setActionListener(new Button.ActionListener() {
            @Override
            public void actionPerformed() {
                System.out.println("x : " + x); // Closure
                System.out.println("y : " + y);
            }
        });
    }

    public static void main(String[] args) {
        Main obj = new Main();
        obj.foo();
    }
}

Clone this wiki locally