람다 표현식

theonde·2022년 8월 20일
0

람다 표현식

  • (인자) -> {바디}

인자 리스트

  • 인자가 없을 때: ()

  • 인자가 한개일 때: (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);
    }
}
  • 람다는 새로운 스코프가 생성되지 않는다. 따라서 람다가 선언된 메서드내에 있는 로컬 변수와 같은 이름의 변수를 선언할 수 없다.
    - ex
public class Top {
	public void top() {
    	int localVariable = 1;
        
        Consumer<Integer> consumber = (i) -> {
        	int localVariable = 2; // 컴파일 에러!!
        };
        
        Consumer<Integer> consumber = 
        (localVariable) -> System.out.println(localVariable) // 컴파일 에러!!
    }
}
profile
개발자ㅋ.ㅋ

0개의 댓글