본문 바로가기

Java

익명클래스와 람다식

익명클래스를 쓰는 이유

 

public class Parent {
    void whoAmI() {
        System.out.println("저는 부모클래스입니다.");
    }
}
 
class Child extends Parent {
    @Override
    void whoAmI() {
        System.out.println("저는 자식클래스입니다.");
    }
}
 
cs

 

부모클래스를 상속받는 자식클래스는 따로 선언해서 사용한다.

그러니 자식클래스를 재사용하지 않고 한번쓰고 말것이라면 굳이 자식클래스를 따로 구현할 필요가 없다.

이럴때 실행클래스에서 바로 구현해서 사용하는법이 익명클래스이다.

 

 private void calculateAnonymous() {
    Calculate calculateAdd = new Calculate() {
        @Override
        public int operation(int a, int b) {
            return a + b;
        }
    };
    System.out.println(calculateAdd.operation(12));
}
 
cs

 

new()이후의 중괄호에 부모클래스의 메소드를 오버라이드해서 넣게되면 

자식클래스를 만들필요없이 바로 사용가능하다.

 

 

람다식은 이렇게 작성된 익명클래스를 더욱 간략화할 수 있다.

 

private void calculateLambda() {
    Calculate calculateAdd = (a, b) -> a + b;
    System.out.println(calculateAdd.operation(12));
}
 
cs

 

람다식은 부모가 인터페이스여야하며, 딱 하나의 메소드만 선언되어 있어야 사용가능하다.

 

@FunctionalInterface
public interface Calculate {
    int operation(int a, int b);
}
 
 
cs

 

혼동을 피하기위해 람다식에 사용된 인터페이스에는 @FuntionalInterface 어노테이션을 붙인다.

 

 

메소드 참조

 

람다식구조에서 파라미터와 구현부의 값이 동일하다면, 파라미터를 생략하는 표현식을 사용가능하다.

 

DoubleUnaryOperator x;
x = (n) -> Math.abs(n);

이러한 람다식 구조에서 파라미터(n)과 구현부 Math.abs(n)의 (n)이 동일한 상황이라면

x = Math::abs;

이런식으로 작성가능하다.

'Java' 카테고리의 다른 글

Stream API  (0) 2022.03.02
Optional 클래스  (0) 2022.02.28
테스트 범위와 종류  (0) 2022.02.22
테스트케이스의 대역  (0) 2022.02.21
TDD방법론 - 암호검사기4(WEAK CASE)  (0) 2022.02.13