[Java 다형성] 익명 클래스와 람다식 완벽 가이드

Java에서 일회성 구현과 함수형 프로그래밍을 가능하게 하는 익명 클래스와 람다식의 개념과 활용법을 설명합니다.



익명 클래스 (Anonymous Class)

이미 정의되어 있는 클래스의 멤버들을 재정의 하여 사용할 필요가 있을때 그리고 그것이 일회성으로 이용될때 사용하는 기법

그래서 일회성이고 재사용할 필요 없는 인터페이스를 구현할 때 사용하기 좋다.

  • 사례:
    인터페이스 하나를 사용하는건 “결과론적”으로 보면 해당 일 하나만 한다는 것
    이것은 Impl(구현클래스)를 따로 만들 필요가 적다.
    따라서 별도의 클래스 파일 없이 즉시 선언과 구현
interface Greeting {
    void greet();
}

// 익명 클래스 사용 예시
Greeting greeting = new Greeting() {
    @Override
    public void greet() {
        System.out.println("Hello!");
    }
};



람다식 (=익명함수)

함수를 만드는 과정 없이 함수를 사용할 수 있고, 코드를 간결하게 작성

  • 이름, 식별자 X
  • 코드 작성법 2가지: 표현식, 블록
  • 예시 코드에 왜 @FunctionalInterface가 있나? 뒤에서 설명
// 코드 작성법 2가지
(parameters) -> expression //표현식
(parameters) -> { statements; } //블록

// 예시
@FunctionalInterface
interface Calculator {
    int calculate(int x, int y);
}

Calculator calc = (x, y) -> x + y; //표현식
Calculator calc = (x, y) -> { //블록
    if(x > y) return x;
    else return y;
};



사용 방식 2가지

아래 코드의 “실행방식 1” 처럼 메소드 파라미터에 바로 람다식을 사용할 수도 있다.

Image



@FunctionalInterface 있어야 람다식!

인터페이스에 @FunctionalInterface 가 있으면 람다 표현식 사용 가능.
추상메소드가 “1개”인 인터페이스를 의미하기도 한다.

단, 카운팅 할 때 주의점

  • Object 클래스의 메소드는 추상 메소드 카운트에서 제외
  • default 메소드도 추상 메소드 카운트에서 제외
@FunctionalInterface
interface MyFunction {
    int max(int a, int b);  // 추상 메소드 1개
    String toString();      // Object 클래스 메소드는 카운트되지 않음
    default int proce(int n1, int n2) {
        return n1+n2;
    }
}



java.util.function 패키지

일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해 놓았다.

💡 주요 함수형 인터페이스

  • Consumer<T>: 매개값 O, 리턴값 X
  • Supplier<T>: 매개값 X, 리턴값 O
  • Function<T,R>: 매개값 O, 리턴값 O
  • Predicate<T>: 매개값 O, 리턴 boolean


Q. 다음 빈칸에 알맞은 java.util.function 패키지의 함수형 인터페이스를 채우시오.

[          ] f = () -> (int)(Math.random() * 10) + 1;  
[          ] f = i -> System.out.print(i + ", ");  
[          ] f = i -> i % 2 != 0;  
[          ] f = i -> i / 100 * 100;  

A. 정답

Supplier<Integer> f = () -> (int)(Math.random() * 10) + 1;  
Consumer<Integer> f = i -> System.out.print(i + ", ");  
Predicate<Integer> f = i -> i % 2 != 0;  
Function<Integer, Integer> f = i -> i / 100 * 100;  

람다식은 함수형 프로그래밍의 장점을 Java에 도입하여 코드를 더 간결하고 명확하게 만들어줍니다.

댓글남기기