CHAPTER 3 람다 표현식 #29
Unanswered
ahngilwoong
asked this question in
CHAPTER 3 람다 표현식
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
[CHAPTER 3] 람다 표현식
1.1 람다란?
람다 표현식(lambda expression)은 익명 함수를 간결하게 표현하는 방법이다.
이름이 없고 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트를 가질 수 있다.
1.1.1 람다의 특징
1.1.2 람다 표현식의 구조
(parameters) : 람다식의 매개변수 목록을 나타낸다. 매개변수는 람다식에서 사용될 값들을 나타내고, 필요에 따라 생략할 수 있다. 매개변수가 여러 개인 경우 괄호를 꼭 해줘야 한다.
-> : 화살표 연산자. 매개변수 목록과 표현식을 구분하는 역할을 한다.
expression : 람다식의 실행 로직을 나타내는 표현식이다. 표현식은 함수의 동작을 정의하며, 해당 로직의 결과가 반환된다. 중괄호를 사용하지 않고도 표현식만으로 동작을 표현할 수 있다.
리액트의 비슷한 예제
리액트에서도 람다 표현식을 사용해 클래스 컴포넌트를 함수형으로 바꾸어 불필요한 코드들을 간결하게 짜도록 권장하고 있다.
클릭시 카운트가 올라가는 화면을 예시를 보면
이렇게 긴 코드가
이렇게 간결하게 바뀐다 불필요한 this를 쓸 필요도 없고 생성자, 생명주기에 대해 신경 쓸 필요가 없다.
2.1 함수형 인터페이스?
함수형 인터페이스는 람다표현식을 사용하기 위한 인터페이스이다. 자바 8부터 도입되었고, 단 하나의 추상 메서드만을 가지는 인터페이스를 의미한다.
2.1.1 함수형 인터페이스 어노테이션
함수형 인터페이스를 선언할 때 @FunctionalInterface 어노테이션을 사용하는 것이 좋다. 컴파일러가 해당 인터페이스가 함수형 인터페이스로 사용되도록 검증하고, 다른 메서드가 추가되지 않도록 방지해준다고 한다.
2.2 함수 디스크립터
함수 디스크립터는 메서드의 시그니처(signature)와 반환 타입(return type)으로 구성된다고 한다. 람다 표현식의 시그니처를 서술하는 메서드이다.
Supplier : 매개변수 없이 T 타입의 값을 제공하는 함수 디스크립터이다. 예를 들어, () -> 42는 Supplier 타입의 함수 디스크립터를 가진다.
Consumer : T 타입의 값을 받아들이고 아무런 결과를 반환하지 않는 함수 디스크립터이다. 예를 들어, (str) -> System.out.println(str)은 Consumer 타입의 함수 디스크립터를 가진다. 또 다른 예시로 forEach로 리스트를 순회하며 어떤 작업을 할 때 Consumer를 사용한다.
Function<T, R> : T 타입의 값을 받아들이고 R 타입의 값을 반환하는 함수 디스크립터이다. 예를 들어, (num) -> num * 2는 Function<Integer, Integer> 타입의 함수 디스크립터를 가진다. 그럼 (num)->String.valueOf(num)은 어떤 타입?! Integer, String
Predicate : T 타입의 값을 받아들이고 boolean 값을 반환하는 함수 디스크립터입니다. 예를 들어, (num) -> num > 0은 Predicate 타입의 함수 디스크립터를 가진다. filter를 쓸때 boolean에 대한 조건을 만들 때 많이 쓰인다.
2.3 실행 어라운드 패턴
실행 어라운드 패턴은 자원을 열고 닫고 하는 여러 과정이 있는 경우에 쓰이는 패턴이다.
위의 과정으로 자원관리를 챙기면서 람다를 쓸 수 있는 효율적인 일이 발생한다.
마무리 기본형 특화!
기본 데이터 타입을 사용하는 경우에는 박싱 및 언박싱 오버헤드를 피하기 위해 기본형 특화된 함수형 인터페이스를 사용하는 것이 효율적이다.
기본형 특화된 함수형 인터페이스는 java.util.function 패키지에 포함되어 있으며, IntPredicate, DoubleConsumer등 다양하게 제공되고 있다.
결국 메모리를 아끼기 위한 함수형 인터페이스들이 따로 있단 소리이다.
Beta Was this translation helpful? Give feedback.
All reactions