티스토리 뷰
728x90
반응형
익명클래스 보다는 람다를 사용하라
- 자바 8버전 이전에는 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스를 사용하곤 했습니다. 이런 인터페이스의 인스턴스를 함수 객체라고 하여, 특정 함수나 동작을 나타내는데 사용했습니다.
💡 익명 클래스
public class Example {
public static void main(String[] args) {
List<String> strings = Arrays.asList("book", "apple", "car");
Collections.sort(strings, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
});
System.out.println(strings); // [car, book, apple]
}
}
💡 람다식
- 익명 클래스에서는 o1, o2의 타입을 구체적으로 명시해주었지만 람다식에서는 명시하지 않았습니다. 하지만 컴파일러는 문맥을 살펴 타입 추론을 해줍니다. 물론 모든 상황에서 타입 추론을 해주는 것은 아니기 때문에 직접 명시해야하는 경우도 있습니다.
- 아래 예제에서는 List<String>으로 선언을 해주었기 때문에 타입 추론이 가능했던 것이고, 만약 List라고 명시한 경우에는 컴파일 오류가 발생합니다.
public class Example {
public static void main(String[] args) {
List<String> strings = Arrays.asList("book", "apple", "car");
Collections.sort(strings, (o1, o2) -> Integer.compare(o1.length(), o2.length()));
System.out.println(strings); // [car, book, apple]
}
}
💡 람다식의 단점
- 람다식은 이름이 없고 문서화도 할 수 없기 때문에 코드 자체로 동작이 명확하지 않고 모호하다면 람다식을 사용해서는 안됩니다. 다시 말하자면 람다식은 간결함을 유지하지 못하면 코드를 작성한 개발자가 아닌 다른 사람이 볼 때 수수께끼의 코드가 됩니다.
- 또한 추상 메서드가 하나인 인터페이스(FunctionalInterface)에서만 람다식을 사용할 수 있습니다. 이는 추상 메서드가 두 개 이상인 인터페이스에서는 람다식을 사용할 수 없다는 의미입니다. 그렇기 때문에 이런 경우는 익명 클래스를 사용하거나 구현 클래스를 만들어야 합니다.
- 람다에서 this 키워드는 바깥 인스턴스를 가리킵니다. 반면 익명클래스에서의 this는 익명 클래스의 인스턴스 자기 자신을 가리킵니다. 그래서 함수 객체가 자기 자신을 참조해야 한다면 반드시 익명 클래스를 사용해야 합니다.
💡 주의점
- 람다도 익명 클래스처럼 직렬화 형태가 구현별로(가상머신별로) 다를 수 있는데, 람다를 직렬화하는 일은 없어야 합니다. 만약 직렬화를 해야하는 함수 객체가 있다면 private 정적 중첩 클래스의 인스턴스를 사용해야 합니다.
728x90
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - Item44. 표준 함수형 인터페이스를 사용하라 (0) | 2022.07.30 |
---|---|
이펙티브 자바 - Item43. 람다보다는 메서드 참조를 사용하라 (0) | 2022.07.30 |
이펙티브 자바 - Item41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2022.07.29 |
이펙티브 자바 - Item40. @Override 애너테이션을 일관되게 사용하라 (0) | 2022.07.29 |
이펙티브 자바 - Item39. 명명패턴보다 애너테이션을 사용하라. (0) | 2022.07.28 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- spring boot redisson sorted set
- microkernel architecture
- redis sorted set
- spring boot excel download paging
- redis sorted set으로 대기열 구현
- spring boot excel download oom
- space based architecture
- service based architecture
- pipeline architecture
- spring boot 엑셀 다운로드
- spring boot redisson 분산락 구현
- 트랜잭셔널 아웃박스 패턴 스프링부트
- java userThread와 DaemonThread
- polling publisher spring boot
- 자바 백엔드 개발자 추천 도서
- pipe and filter architecture
- spring boot redis 대기열 구현
- JDK Dynamic Proxy와 CGLIB의 차이
- 서비스 기반 아키텍처
- 공간 기반 아키텍처
- java ThreadLocal
- transactional outbox pattern
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- @ControllerAdvice
- transactional outbox pattern spring boot
- spring boot redisson destributed lock
- 람다 표현식
- 레이어드 아키텍처란
- redis 대기열 구현
- spring boot poi excel download
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함