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
'Backend > 객체 지향 프로그래밍' 카테고리의 다른 글
[Java] 중첩 인터페이스 (0) | 2022.04.28 |
---|---|
[Java] 인터페이스의 타입 변환과 다형성 (0) | 2022.04.24 |
[Java] 객체의 다형성 구현 (인터페이스) (0) | 2022.04.22 |
[Java] 객체의 다형성 구현 (추상 클래스) (0) | 2022.04.20 |
[Java] 상속과 다형성 (Polymorphism) (0) | 2022.04.19 |