본문 바로가기
개발 관련 지식/JAVA

람다식에서 클래스 멤버와 로컬 변수 사용

by 권태일1147 2020. 4. 7.

람다식의 실행 블록에서는 클래스 멤버는 제약 사항 없이 사용 가능하지만, 로컬 변수는 제약 사항이 따른다.

 

클래스 멤버 사용

클래스 멤버인 필드와 메소드를 람다식 실행 블록 안에서 사용하는데에 제약 사항은 없다. 하지만 this를 사용할 때 주의해야한다.

일반적으로 익명 객체 내부에서 this는 익명 객체의 참조이지만, 람다식에서 this는 람다식을 실행한 객체의 참조이다.

다음은 Inner 클래스 내부에서 람다식을 실행했기 때문에 Inner 객체를 참조하는 클래스 멤버 사용 람다식이다.

// 인터페이스 ExInterface

public interface ExInterface {
    public void method();
}

 

// this를 사용하는 Use.java

public class Use {
    public int outterField = 10;
    
    class Inner {
        public int innerField = 20;
        
        void method() {
            ExInterface ei = () -> {
                System.out.println(outterField);
                System.out.println(Use.this.outterField); // 바깥 객체의 참조를 얻기 위해서 클래스명.this 를 사용
                
                System.out.println(innerField);
                System.out.println(this.innerField);  // 람다식 내부에서 this는 람다식을 사용하는 객체인 Inner 객체를 참조
            };
            ei.method();
        }
    }
}

 

// Main.java

public class Main {
    public static void main(String[] args) {
        Use use = new Use();
        Use.Inner inner = use.new Inner();
        
        inner.method();
    }
}

// 10
// 10
// 20
// 20

 

 

로컬 변수 사용

람다식은 메소드 내부에서 주로 작성되기 때문에 로컬 익명 구현 객체를 생성시킨다고 봐야한다. 메소드의 매개 변수 또는 로컬 변수를 사용하려면 이 두 변수는 final 특성을 가져야 한다. 따라서 매개 변수 또는 로컬 변수를 람다식에서 읽는 것은 허용되지만, 변경을 할 수 는 없다.

// 인터페이스 ExInterface

public interface ExInterface {
    public void method();
}

 

// this를 사용하는 Use.java

public class Use {
    void method(int i) {  // i는 final 특성을 가짐
        int localVar = 40; // localVar는 final 특성을 가짐
        
        ExInterface ei = () -> {
            System.out.println(i);
            System.out.println(localVar);
        };
        ei.method();
    }
}

 

// Main.java

public class Main {
    public static void main(String[] args) {
        Use use = new Use();
        use.method(20);
    }
}
// 20
// 40

왜 익명 객체에서 메소드의 매개 변수나 로컬 변수를 사용하기 위해서 변수가 final 특성을 가져야 하는지, 왜 final 을 적지 않았는데도 final인지 익명 객체 포스트의 맨 아래 정리해 두었다. - 2020/04/08 - [개발 관련 지식/JAVA] - 익명 객체

'개발 관련 지식 > JAVA' 카테고리의 다른 글

인스턴스 멤버와 this  (0) 2020.04.08
람다식 메소드 참조  (0) 2020.04.07
람다식  (0) 2020.04.07
제네릭 타입의 상속과 구현  (0) 2020.04.06
제한된 타입 파라미터  (0) 2020.04.06