람다식(2) - 클래스 멤버와 로컬 변수 사용

2023. 12. 8. 00:45java/java

 

람다식의 실행 블록에는 클래스의 멤버 (필드 및 메소드) 및 로컬 변수를 사용할 수 있다. 클래스의 멤버는 제약 사항 없이 사용 가능하지만, 로컬 변수는 제약 사항이 있으니 알아보자

 

3.1 클래스의 멤버 사용

 1. 람다식 실행블록에 클래스의 멤버는 제약 없이 사용할 수 있다.

 2. this 키워드를 사용할 때에는 주의하라

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

 

public class NestedClass {

    public int outterField = 10;

    class Inner {
        int innerField = 20;

        void method() {

            MyFunctionalInterface f1 = () -> {
                System.out.println("outterField: " + outterField);
                System.out.println("outterField: " + NestedClass.this.outterField);

                System.out.println("outterField: " + innerField);
                System.out.println("outterField: " + this.innerField);
            };

            f1.method();
        }
    }
}

 

람다식 내부에서 this는 람다식을 실행한 중첩 객체 Inner다.

 

 

3.2 로컬 변수 사용

 1. 람다식에서 바깥 클래스의 필드나 메소드는 제한 없이 사용 가능

 2. 메소드의 매겨 변수 Or 로컬 변수는 final 특성을 가져야 함 *3.2.2(이유는 맨 밑에서)

 3. 매개 변수 또는 로컬 변수를 람다식에서 읽는 것은 허용되지만, 람다식 내부, 외부에서 변경할 수 없다.

 

public class UsingLocalVariable {

    /**
     * @param arg final 특성을 갖는다.
     * @return
     * @localParam localVar final 특성을 갖느나.
     */
    MyFunctionalInterface method(int arg) {
        int localVar = 40;

        //arg       = 31; //=> 수정 불가
        //localVar  = 31; //=> 수정 불가

        //람다식
        MyFunctionalInterface f1 = () -> {
            System.out.println("arg: " + arg);
            System.out.println("localVar: " + localVar);
        };

        System.out.println("method 종료");
        return f1;
    }
}

 

public class UsingLocalVariableExample {

    public static void main(String[] args) {
        UsingLocalVariable usingLocalVariable = new UsingLocalVariable();
        MyFunctionalInterface f1 = usingLocalVariable.method(20);

        f1.method();
    }
}

> Task :UsingLocalVariableExample.main()
method 종료
arg: 20
localVar: 40

 

method() 가 종료되도 람다식은 살아있다.!

 

 

*3.2.2

익명 객체 밖의 메소드의 매개 변수나 로컬 변수를 익명 객체에서 사용할 때 문제가 발생한다.(클래스의  멤버는 상관X)

메소드 내에서 생성된 익명 객체는 메소드 실행이 끝나도 힙 메모리에 존재해서 계속 사용할 수 있지만, 메소드의 매개변수나 로컬 변수는 메소드 종료 후 스택 메모리에서 소멸됨

 

'java > java' 카테고리의 다른 글

람다식(3) - 표준 API의 함수적 인터페이스  (0) 2023.12.09
람다식 (1) - 기본 문법, 함수적 인터페이스  (1) 2023.12.07
Generic  (1) 2023.12.04
중첩 클래스와 중첩 인터페이스란?  (0) 2023.11.29
어노테이션  (2) 2023.11.26