티스토리 뷰

java&spring

[Java] 클로저(Closure)

sungjine 2022. 3. 6. 01:29
반응형

클로저에 대한 내용을 람다식을 활용하여 설명한다.

 * 람다식에 대한 설명

 

자바에서 클로저는 람다식이나 내부 클래스 같은 영역 안에서 외부에서 정의된 변수를 사용하는 방식을 의미한다.

 

즉, 람다식을 만들 때 람다식 안에서 정의한 변수나 매개 변수로 받지 않는 변수가 사용될 경우 클로저가 사용됐다고 볼 수 있다.

 

예시

int a = 3;

(i) -> i + a; // 클로저

이렇게 클로저에서 사용된 변수를 자유 변수(free variables)라고 하며, 자유 변수는 코드 블록 안에서 정의되거나 매개 변수가 아닌데 사용되는 변수를 뜻한다.

 

예제

class CodeRunner {
    public static void main(String args[]) {
    	int a = 3; // 자유 변수
        InterfaceRamda interfaceRamda = i -> i + a; // 클로저
        System.out.println(interfaceRamda.test(11));
    }
}

@FunctionalInterface
interface InterfaceRamda {
    int test(int n);
}

예제 코드의 결과는 14이다.

 

자유 변수의 경우 변경할 수 없어야 한다. 즉, final 키워드가 있는 변수같이 사용해야 하며 변수의 값을 변경하려고 하면 아래와 같은 에러가 발생한다.

"local variables referenced from a lambda expression must be final or effectively final"

class CodeRunner {
    public static void main(String args[]) {
        int a = 1;

        InterfaceRamda interfaceRamda = (i -> {
            a = 2;  // 에러
            return i + a;
        });
        
        System.out.println(interfaceRamda.test(11));
    }
}

@FunctionalInterface
interface InterfaceRamda {
    int test(int n);
}
반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31