본문 바로가기
카테고리 없음

익명클래스 vs 람다식

by wlgpdnjs 2022. 11. 28.

익명클래스

익명클래스는 코드 내부에 이름이 존재하지 않는 클래스를 만드는 것으로, 클래스 정의와 동시에 객체를 생성할 수 있습니다.인터페이스와 클래스 모두 익명클래스로 객체를 만들 수 있습니다.

클래스 생성 시 별도의 Java 파일을 통해 생성되지 않으며, 컴파일 시 $.class 파일로 생성됩니다.

class 파일 생성 규칙: (익명 클래스가 정의된 클래스 파일명)${익명클래스정의된순번).class

 

프로그램 내에서 한번만 객체로 만드는데 사용되는 클래스의 경우, 클래스를 정의하고 객체를 생성하는 것이 비효율적으로 이런 경우 익명클래스를 사용합니다. 또한 익명클래스로 클래스 정의와 구현을 동시에 하여 코드 길이를 줄일 수 있습니다.

 

사용예제

아래와 같은 방식으로 익명클래스를 이용해 Interface, 클래스를 구현과 동시에 객체를 생성할 수 있습니다.

ClassName class1 = new ClassName {...};
InterfaceName interface1 = new InterfaceName {...};

 

1. Interface 구현 및 객체 생성

아래와 같은 인터페이스를 정의합니다.

Interface MyInterface{
	void anonymousClassTest();
}

 

위 인터페이스를 구현해 한번만 사용해야 하는 경우, 아래와 같이 인터페이스를 익명클래스를 이용해 정의합니다.

public class AnonymousClass{
	public static void main(String[] args){
    	MyInterface interface1 = new MyInterface{
        	public void anonymousClassTest(){
                    System.out.println("익명클래스로 인터페이스 구현");
            }
        };
        interface1.anonymousClassTest();
    }
}

 

2. 클래스 구현 및 객체 생성

아래와 같이 클래스를 정의합니다.

public abstract class MyAbstractClass() {
	public abstaract void anonymousClassTest();
}

 

다음과 같이 클래스 구현과 동시에 객체를 생성할 수 있습니다.

public class AnonymousClass {
	public static void main(String[] args) {
    	MyAbstractClass abstractClass1 = new MyAbtractClass() {
        	public void anonymousClassTest() {
            	System.out.println("익명클래스로 클래스 구현 및 생성");
            }
        };
        abstractClass1.anonymousClassTest();
    }
}

 

 

 

람다식

Java 8에 도입된 람다는 메소드를 하나의 식으로 표현한 것으로, 메소드를 람다로 표현하면 메소드 이름과 반환값이 존재하지 않기 때문에 익명클래스와 비슷하지만, 익명클래스를 사용하는 것보다 더 적은 코드로 동일한 내용을 구현할 수 있어 코드를 간결하게 하고 가독성을 향상시킬 수 있는 장점이 있습니다.

 

 

사용예제

일반적으로 람다는 아래와 같이 한줄로 작성합니다.  람다가 어떤 값을 리턴해야 할 때는 표현식(expression)의 수행 결과가 리턴됩니다.  표현식을 한 줄로 구현이 어려울 때는 {}로 묶어 여러 줄로 구현할 수 있지만, return을 반드시 작성해줘야 합니다.

(parameter) -> expression
(parameter1, parameter2) -> expression
(parameter1, parameter2) -> {...}

 

익명클래스와 같이 람다를 이용해 추상 메소드, 인터페이스를 구현할 수 있습니다.

 

@FunctionalInterface
interface Calc {
    public int max(int first, int second);
}

위와 같이 함수형 인터페이스를 선언합니다. 

람다는 표현식을 저장하기 위한 참조 변수의 타입을 결정해야 하는데 이때 사용하는 참조 변수가 함수형 인터페이스입니다. 때문에 람다가 구현할 인터페이스는 @FunctionalInterface 어노테이션을 이용해 컴파일러가 함수형 인터페이스로 인식할 수 있도록 해야합니다.

 

public static void main(String[] args){

   Calc maxNum = (x, y) -> x < y ? x : y; // 추상 메소드 구현
   System.out.println(maxNum.max(1,2)); // 함수형 인터페이스 사용
}