인자가 없을 때: ()
인자가 한개일 때: (one) 또는 one
인자가 여러개 일 때: (one, two)
인자의 타입은 생략 가능, 컴파일러가 추론(infer)하지만 명시할 수도 있다. (Integer one, Integer two)
로컬 변수 캡처
로컬클래스, 익명클래스, 람다는 final이거나 effective final 인 변수만 참조할 수 있다.
그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일 에러가 발생한다.
쉐도윙: 현재 스코프의 변수가 상위의 스코프에 있는 변수를 가리는 것
로컬 클래스와 익명 클래스는 쉐도윙이 되지만, 람다는 쉐도윙이 되지않는다.
로컬 클래스와 익명 클래스는 하나의 새로운 스코프를 만드는 것이다. 따라서 로컬 클래스와 익명 클래스에서 상위 스코프에 있는 변수의 이름과 같은 이름의 변수를 선언 하였을 경우 상위의 스코프에 있는 변수를 가리게 된다. 최종적으로 로컬 클래스, 익명 클래스 내에서 선언한 변수의 값을 가지게 된다.
- ex
public class Top {
public void top() {
int localVariable = 10;
class Local {
public void local() {
inr localVariable = 20;
System.out.println(localVariable); // 20 출력
}
}
Consumer<Integer> consumer = new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
int localVariable = 100;
System.out.println(localVariable); // 100 출력
}
}
consumber.accept(50);
}
}
public class Top {
public void top() {
int localVariable = 1;
Consumer<Integer> consumber = (i) -> {
int localVariable = 2; // 컴파일 에러!!
};
Consumer<Integer> consumber =
(localVariable) -> System.out.println(localVariable) // 컴파일 에러!!
}
}