[Effective Java] Item42 - 익명 클래스보다는 람다를 사용하라

지구🌍·2023년 3월 18일
0

Effective Java 공부

목록 보기
11/12
post-thumbnail

람다와 익명 클래스

💡 람다 : 익명 메소드만 전달하여, 인터페이스르 구현한 익명 클래스의 인스턴스를 생성하는 방법, 메소드만 전달하지만, 결과적으로 익명 구현 객체를 만듬

💡 익명 클래스 : 추상 클래스를 상속하거나 인터페이스를 구현한 이름 없는 클래스, 재사용이 필요없는 인스턴스를 생성할 때 사용

비교

익명 클래스람다 표현식
이름 없는 클래스이름이 없는 메소드
추상 및 구체 클래스를 확장 가능추상 및 구체 클래스 확장 불가능
여러 추상 메소드를 포함하는 인터페이스 구현 가능단일 추상 메소드를 포함하는 인터페이스 구현 가능
익명 클래스 내부에서 인스턴스 변수 선언 가능인스턴스 변수 선언 불가능
인스턴스화 가능인스턴스화 불가능
this 키워드 현재 익명 클래스 객체 참조this 키워드 현재 외부 클래스

사용 예시

익명 클래스

	public static void anonymousClass() {
        ArrayList<String> words = new ArrayList<>(List.of("a", "b", "c"));

        Collections.sort(words, new Comparator<String>(){
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(), o2.length());
            }
        });
    }

익명 클래스 방식은 코드가 너무 길어지기 때문에 함수형 프로그래밍에 적합하지 않다.

lambda

    public static void lambda() {
        ArrayList<String> words = new ArrayList<>(List.of("a", "b", "c"));

        Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
    }

익명 클래스와 개념은 비슷하지만 코드가 훨씬 간결해진다!
위와 같이 Type을 명시하지 않아도 사용 가능한 이유는 컴파일러가 대신 인터페이스에 대한 타입을 추론 해주기 때문이다!

대부분 제네릭을 통해 얻는다!

enum에서 사용

public enum Menu {

    COFFEE("커피", money -> money * 2),
    CAKE("케이크", money -> money),
    TEA("차", money -> money * 3);
    
    private final String name;
    private final Function<Integer, Integer> op;

    Menu(String name, Function<Integer, Integer> op) {
        this.name = name;
        this.op = op;
    }

    public int price(int money) {
        return op.apply(money);
    }

    public String getName() {
        return name;
    }
}

람다가 대체할 수 없는 곳

  1. 추상 클래스의 인스턴스를 만들 때 람다사용은 불가능하다.
  2. 인터페이스의 추상 메소드가 여러 개이면 람다 표현이 불가능하다.
  3. 람다는 자기 자신을 참조할 수 없다. (람다에서 this는 외부 클래스 뜻함)

🎈귀중한 참고자료🎈
참고자료1
참고자료2

profile
일취월장 하며 성장! 중! 공부한 것을 기록하자(^∀^●)ノシ

0개의 댓글