본문 바로가기
Language/자바

람다, 익명클래스는 왜 final 또는 effectively final 에만 접근 가능할까?

by 띵커베르 2023. 2. 22.
728x90
  • 람다식은 메서드 내부에서 익명으로 생성되는 객체이므로, 해당 객체가 생성될 때 외부에서 참조하는 변수들은 반드시 final 또는 사실상 final과 동등한 효과를 가져야 한다.
  • 람다식이 정의된 블록의 외부 변수를 캡처하는 방식에 기인하는데, 람다식에서 사용하는 외부 변수는 내부적으로 해당 변수를 참조하는 final 필드를 생성하게 되며, 이렇게 final 필드로 새엉된 참조 변수를 통해서만 해당 변수에 접근할 수 있다.
  • 즉 람다는 내부에서 참조하는 변수가 final로 선언된 경우에만 참조할 수 있다.
    • 람다식이 실행되는 시점에 해당 변수의 값이 이미 정해져 있기 때문에
  • 람다식 내부에서 참조하는 변수가 변경될 가능성이 있으면 해당 변수를 final 로 선언하면 안되며,
  • 다른 방법으로 값을 전달해야 하는데, 이때는 람다식 내부에서 해당 값을 변경할 수 없게된다.
  • 람다식을 사용하는 메소드나 클래스의 스코프에서 변수를 정의하고 람다식에서 참조할 때 해당 변수의 라이프타임이 람다식이 실행되는 동안에만 유지되기 때문.
  • 람다식에서 final 로 선언되지 않은 값은 변경이 가능하지만 이는 위험을 초래할 수 있으니, 그러지말자.
  • 역시 모든 데이터는 일단 immutable 하게 가져가는게 좋은거 같다.
728x90

댓글