본문으로 바로가기

1. 익명 구현 객체

  • 일반적으로 인터페이스에 대하여 구현 클래스를 만들어 사용하는 것이 재사용할 수 있기 때문에 편리합니다. 그러나 일회용으로 사용할 구현 객체를 위해서 소스 파일을 작성하는 것은 비효율적입니다.
  • 소스 파일(구현 클래스)을 작성하지 않고 구현 객체를 만들 수 있는 방법을 익명 구현 객체라고 합니다.
  • 자바 UI 프로그래밍에서 이벤트를 처리하기 위해, 임시 작업 스레드를 만들기 위해 익명 구현 객체를 많이 활용

 

2. 익명 구현 객체 구현

인터페이스 변수 = new 인터페이스() {
	// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언;
};
  • 하나의 실행문이므로 끝에는 세미콜론을 반드시 붙여야 합니다.
  • 중괄호 {}에는 인터페이스에 선언되 모든 추상 메소드들의 실체 메소드를 작성해야 합니다.
  • 추가적으로 필드와 메소드를 선언할 수 있지만, 익명 객체 안에서만 사용할 수 있고 인터페이스 변수로 접근할 수 없습니다. 

 

예시

인터페이스 SwitchEvent

public interface TactSwitch {
    void onClick();
}

 

인터페이스 SwitchEvent의 익명 구현 객체 

TactSwitch tactSwitch = new TactSwitch() {
    boolean check = false;
    
    @Override
    public void onClick() {
        if (check) {
            check = false;
            System.out.println("OFF");
        } else {
            check = true;
            System.out.println("ON");
        }
    }
};

 

모든 객체는 클래스로부터 생성되는데, 익명 구현 객체도 예외는 아닙니다.

Main.java를 컴파일하면 자바 컴파일러에 의해 자동으로 클래스 파일이 생성

Main$1.class // 이름 뒤에 $가 붙고 생성 번호가 붙습니다. (생성 번호는 1번부터 시작)

Main$2.class // 두 번째 익명 구현 객체

 

TactSwitch tactSwitch1 = new TactSwitch() {
    @Override
    public void onClick() {
        System.out.println("test");
    }
};

TactSwitch tactSwitch2 = new TactSwitch() {
    @Override
    public void onClick() {
        System.out.println("test");
    }
};

System.out.println(tactSwitch1); // com.veneas.test.Main$1@7f560810
System.out.println(tactSwitch2); // com.veneas.test.Main$2@69d9c55

 

3. 함수형 인터페이스

(매개변수, ... ) -> { 실행문 ... }
  • 인터페이스의 추상 메소드가 1개일 경우 함수형 인터페이스라고 하는데 이 경우 람다식을 활용할 수도 있습니다.

 

예시

함수형 인터페이스 Sum

@FunctionalInterface
public interface Sum {
    int sumReturn(int num1, int num2);
}

 

함수형 인터페이스 Sum의 익명 구현 객체, 람다식

// 익명 구현 객체
Sum sumAnonymous = new Sum() {
    @Override
    public int sumReturn(int num1, int num2) {
        return num1 + num2;
    }
};

// 람다
Sum sumLambda = (int num1, int num2) -> num1 + num2;

int result1 = sumLambda.sumReturn(1, 2);
int result2 = sumLambda.sumReturn(3, 4);

System.out.println(result1); // 3
System.out.println(result2); // 7