영권's

TIL - 인터페이스(함수형)와 람다 본문

데브코스 웹 백엔드/TIL

TIL - 인터페이스(함수형)와 람다

ykkkk 2021. 8. 4. 18:04

함수형 인터페이스란 

  • 추상 메서드가 단 한개만 있는 경우 해당 인터페이스는 함수형 인터페이스 입니다.
  • 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이 붙어있지 않은데 변경하는 코드가 있다면 참조할 수 없다.

 

 

차이점 : 쉐도잉

쉐도잉이란?

 

쉐도잉이란 같은 네이밍의 다수의 로컬 변수가 있다고 가정할 때 여러 개의 가장 안쪽의 로컬 변수가 우선적으로 참조된다는 것이다. 다른 말로 외부의 로컬 변수의 값은 무시된다는 의미이다.

class 변수 name 이 method 안에서 정의된 변수 name에 의해 가려진다.

 

 

메서드 내부에 로컬 클래스, 익명 클래스, 람다가 있는데 로컬 클래스와 익명 클래스는 쉐도잉의 대상이고 람다는 쉐도잉의 대상이 아니다. 

 

왜일까?

 

이유는 Scope의 차이이다.  

 

같은 baseNumber의 이름을 가질지라도 각자의 변수의 Scope이 다르기 때문에 익명 클래스 혹은 로컬 클래스에서 똑같은 이름의 변수의 값을 재정의 하면 기존 외부에 있던 로컬 변수의 값은 무시된다. (쉐도잉 된다.)

 

하지만

 

람다는 람다를 감싸고 있는 scope과 같기 때문에(기존의 로컬 변수와 같은 Scope이기 때문에) 쉐도잉이 일어나지 않는다.

(같은 Scope에서는 같은 이름의 변수를 정의할 수 없음)

로컬 클래스와 익명 클래스는 쉐도잉 된 변수의 값인 11과 12가 출력된다.
같은 scope 안에서 이미 정의된 변수라고 표시된다.


참고 :

 

https://www.inflearn.com/course/the-java-java8?inst=6fcc1e30 

 

더 자바, Java 8 - 인프런 | 강의

자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합니다. 이

www.inflearn.com

 

Comments