영권's
TIL - 인터페이스(함수형)와 람다 본문
함수형 인터페이스란
- 추상 메서드가 단 한개만 있는 경우 해당 인터페이스는 함수형 인터페이스 입니다.
- static 메서드나 default 메서드의 존재 여부는 상관없습니다.
@FunctionalInterface 어노테이션을 통해 컴파일 타임에서 함수형 인터페이스인지 검증할 수 있습니다.
원래 인터페이스를 인스턴스로 만들기 위해서는 Implements 해서 구현한 클래스를 사용하거나 익명 구현 클래스를 사용하는 방법이 있었습니다.
자바 8에서부터는 추상메서드가 하나인 함수형 인터페이스의 경우에는 좀 더 줄여서 쓸 수 있는 람다 표현식이 있습니다.
메소드 레퍼런스(Method Reference)는 Lambda 표현식을 더 간단하게 표현하는 방법입니다.
- 람다가 하는 일이 기존 메서드 또는 생성자를 호출하는 거라면, 메서드 레퍼런스를 사용해서 아주 간단하게 표현할 수 있습니다.
아래 코드에서 보면 int 변수를 받아 그대로 출력하는 내용을
- 익명 구현 클래스
- 람다 표현식
- 메서드 레퍼런스
를 통해 점점 더 간단하게 사용하는 것을 볼 수 있습니다.
람다 표현식 사용법
람다
- (인자 리스트) -> {구현 내용}
인자 리스트
- 인자가 없을 때 : ()
- 인자가 하나일 때 : (one) 또는 one
- 인자가 여러개 일 때 : (one, two)
- 인자의 타입은 생략 가능하다.
- 컴파일러가 추론하지만 명시 할 수도 있다.(Integer one, Integer two)
바디
- 화살표 오른쪽에 함수 본문을 정의한다.
- 여러 줄인 경우 {}를 사용한다.
- 한 줄인 경우 {}를 생략 가능하며 return도 생략 가능하다.
익명 클래스와 람다와의 차이점 (변수 캡처 / Variable Capture)
공통점
- 로컬 클래스, 익명 클래스, 람다 표현식의 공통점은 외부의 final변수를 참조 가능하다는 것이다.
- - 아래 코드에서 보면 외부에 있는 baseNumber라는 변수를 참조할 수 있다.
- final를 생략 가능한 경우는 사실상 final변수인 경우
- 사실상 final(Effectively final)이란 final 키워드는 없지만 해당 변수를 어디서도 변경하지 않는 경우
그렇기 때문에 변수에 final이 붙어있지 않은데 변경하는 코드가 있다면 참조할 수 없다.
차이점 : 쉐도잉
쉐도잉이란?
쉐도잉이란 같은 네이밍의 다수의 로컬 변수가 있다고 가정할 때 여러 개의 가장 안쪽의 로컬 변수가 우선적으로 참조된다는 것이다. 다른 말로 외부의 로컬 변수의 값은 무시된다는 의미이다.
메서드 내부에 로컬 클래스, 익명 클래스, 람다가 있는데 로컬 클래스와 익명 클래스는 쉐도잉의 대상이고 람다는 쉐도잉의 대상이 아니다.
왜일까?
이유는 Scope의 차이이다.
같은 baseNumber의 이름을 가질지라도 각자의 변수의 Scope이 다르기 때문에 익명 클래스 혹은 로컬 클래스에서 똑같은 이름의 변수의 값을 재정의 하면 기존 외부에 있던 로컬 변수의 값은 무시된다. (쉐도잉 된다.)
하지만
람다는 람다를 감싸고 있는 scope과 같기 때문에(기존의 로컬 변수와 같은 Scope이기 때문에) 쉐도잉이 일어나지 않는다.
(같은 Scope에서는 같은 이름의 변수를 정의할 수 없음)
참고 :
https://www.inflearn.com/course/the-java-java8?inst=6fcc1e30
'데브코스 웹 백엔드 > TIL' 카테고리의 다른 글
2021-08-16 TIL (Build) (0) | 2021.08.16 |
---|---|
2021-08-13 TIL (데이터베이스 - 트랜잭션,VIEW) (0) | 2021.08.14 |
TIL - (데이터베이스) (0) | 2021.08.12 |
20210809 - TIL (데이터베이스) (0) | 2021.08.10 |
TIL - 개발 환경(클래스패스) (0) | 2021.08.02 |