끄적끄적
람다식 (2) 본문
람다 캡처링
- 람다는 외부에 있는 변수를 참조할 수 있다. -> 이때의 변수를 자유 변수라 한다.
람다 캡처링의 제약 조건
1. 지역변수는 final로 선언되어야 한다.
2. final로 선언되어 있지 않아도 값이 재할당이 일어나선 안된다.
메모리와 람다(람다캡처링의 제약조건이 있는 이유)
- 쓰레드는 힙을 공유하고 별도의 스택을 생성하므로, 지역변수는 공유되지 않고 인스턴스 변수는 공유한다.
- 람다는 별도의 쓰레드에서 실행한다. 캡처하고 있는 변수가 있는 쓰레드가 사라저 해당 지역변수가 사라지면 오류가 날것 같지만 나지 않는다.
- 지역변수에 직접 접근하는 것이 아니라 변수를 자신의 스택으로 복사하여 동일한 값을 참조한다.
람다의 유효범위
- 람다 표현식의 중촉 블록 내의 유효 범위 = 람다 표현식과 이를 포함하고 있는 블록의 유효 범위
- 위 사진에서 8번 라인을보면 람다 외부의 변수를 접근하여 사용하고 있다. 동일한 변수가 있어서 9번 라인에서 에러가 발생한다.
- 위 사진에서 This는 테스트 클래스 내부를 나타내다. 즉,람다에서 this는 람다를 생성하는 객체의 this 키워드를 사용하는 것과 같다.
FunctionalInterface
- 하나의 추상 메서드를 갖는 인터페이스
- 추상 메서드의 시그니처(매개변수 개수와 타입, 리턴타입)과 동일한 람다 함수를 할당해서 사용할 수 있다.
- 함수형 인터페이스를 정의하고 @FunctionalInterface 어노테이션을 붙이면 함수형 인터페이스의 정의를 람다가 검증해준다.
@FunctionalInterface
interface MySum{
public int sum(int a, int b);
}
public static void Main(String []args){
MySym func = (a,b) ->a+b;
System.out.println(fuc.sum(10,11));
}
'CS 공부' 카테고리의 다른 글
해시맵 (0) | 2022.03.30 |
---|---|
RestAPI 란 (0) | 2022.03.28 |
[java]람다식(Lambda Expression) (0) | 2022.03.20 |
thread와 런에이블 (0) | 2022.03.20 |
[java] static (0) | 2022.03.18 |
Comments