ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 람다식 - 클래스 멤버와 로컬 변수 사용
    CSE/Java 2015. 9. 20. 14:43


    람다식은 여러 절로 구성되어 있습니다.



    Intro.

    람다식 기본 문법 & 타겟 타입과 함수적 인터페이스

    클래스 멤버와 로컬 변수 사용

    표준 API의 함수적 인터페이스1




    클래스 멤버와 로컬 변수 사용

     람다식의 실행 블록에는 클래스의 멤버(필드와 메소드) 및 로컬 변수를 사용할 수 있습니다.


     클래스의 멤버는 제약 사항 없이 사용 가능하지만, 로컬 변수는 제약 사항이 따릅니다.








     클래스의 멤버 사용

      람다식 실행 블록에는 클래스의 멤버인 필드와 메소드를 제약 사항 없이 사용할 수 있습니다.


      하지만 this 키워드를 사용할 때에는 주의가 필요합니다. 일반적으로 익명 객체 내부에서 this는 익명 객체의 참조이지만, 람다식에서 this는 내부적으로 생성되는 익명 객체의 참조가 아니라 람다식을 실행한 객체의 참조입니다.


      다음 예제는 람다식에서 바깥 객체와 중첩 객체의 참조를 얻어 필드값을 출력하는 방법을 보여주고 있습니다.


      중첩 객체 Inner에서 람다식을 실행했기 때문에 람다식 내부에서의 this는 중첩 객체 Inner 입니다.



     * MyFunctionalInterface4.java


    1
    2
    3
    4
    5
    6
    7
     
    package lambda;
     
    public interface MyFunctionalInterface4 {
        public void method();
    }        
     
    cs










     * UsingThis.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    package lambda;
     
    public class UsingThis {
        public int outterField = 10;
     
        class Inner {
            int innerField = 20;
     
            void method() {
                MyFunctionalInterface4 fi = () -> {
                    System.out.println("Outter Field: " + outterField);
                    System.out.println("Outter Field: " + UsingThis.this.outterField + "\n");
     
                    System.out.println("Inner Field: " + innerField);
                    System.out.println("Inner Field: " + this.innerField + "\n");
                };
                
                fi.method();
            }
        }
    }
     
    cs










     * UsingThisExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    package lambda;
     
    public class UsingThisExam {
     
        public static void main(String[] args) {
            UsingThis usingThis = new UsingThis();
            UsingThis.Inner inner = usingThis.new Inner();
            inner.method();
        }
     
    }
     
    cs

















     로컬 변수 사용

      람다식은 메소드 내부에서 주로 작성되기 때문에 로컬 익명 구현 객체를 생성시킨다고 봐야 합니다.


      람다식에서 바깥 클래스의 필드나 메소드는 제한 없이 사용할 수 있으나, 메소드의 매개 변수 또는 로컬 변수를 사용하면 이 두 변수는 final 특성을 가져야 합니다.


      따라서 매개 변수 또는 로컬 변수를 람다식에서 읽는 것은 허용되지만, 람다식 내부 또는 외부에서 변경할 수 없습니다. 다음 예제를 보면서 이해해 봅시다.




      * MyFunctionalInterface5.java


    1
    2
    3
    4
    5
    6
    7
     
    package lambda;
     
    public interface MyFunctionalInterface5 {
        public void method();
    }
     
    cs








     * UsingLocalVariable.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    package lambda;
     
    public class UsingLocalVariable {
        void method(int arg) {
            int localVar = 40;
     
            // arg = 31; // final 특성 때문에 수정 불가
            // localVar = 41; // final 특성 때문에 수정 불가
     
            MyFunctionalInterface5 fi = () -> {
                System.out.println("arg: " + arg);
                System.out.println("localVar: " + localVar);
            };
     
            fi.method();
        }
    }
     
    cs








     * UsingLocalVariableExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    package lambda;
     
    public class UsingLocalVariableExam {
     
        public static void main(String[] args) {
            UsingLocalVariable ulv = new UsingLocalVariable();
            ulv.method(20);
        }
     
    }
     
    cs






     









     * 이 포스트은 서적 '이것이 자바다' 를 참고하여 작성한 포스트입니다.



    댓글

Designed by Tistory.