익명 클래스(Anonymous Class)
- 익명 클래스는 내부 클래스의 일종으로 이름이 없는 클래스를 뜻하며 무명 클래스라고도 합니다.
- 익명 클래스는 클래스의 재사용을 고려하지 않고 일시적으로 사용하기 위해 만들어지는 클래스입니다.
- 명시적으로 클래스를 선언하지 않기 때문에 클래스의 인스턴스를 쉽게 생성할 수 있는 장점을 가지고 있습니다.
- 익명 클래스는 필드, 로컬 변수, 매개 변수로 주로 사용됩니다.
- 익명 클래스는 특정 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있습니다.
- 익명 자식 클래스: 클래스를 상속하여 익명 클래스를 생성하는 경우입니다.
- 익명 구현 클래스: 인터페이스를 구현하여 익명 클래스를 생성하는 경우입니다.
익명 자식 클래스
- 익명 자식 클래스는 부모 클래스를 상속받아 생성됩니다.
- 익명 클래스로부터 생성된 인스턴스는 부모 타입의 필드, 메서드를 갖게 됩니다.
- 익명 클래스 인스턴스는 부모 타입에 선언된 멤버만 접근 가능하기 때문에 생성되는 필드와 메서드는 생성된 블럭 안에서만 사용할 수 있습니다.
익명 자식 클래스 생성 방법
new 부모생성자(매개변수, ... ) {
// 필드
// 메서드
}
익명 자식 클래스 활용 예시
// 부모 클래스 생성
public class RandomNumber {
public void grantNumber() {
System.out.println("임시 번호를 부여합니다.")
}
}
public class Student {
// 필드값에 익명 자식 클래스 대입
private RandomNumber rn1 = new RandomNumber() {
@Override
public void grantNumber() {
System.out.println("여기서 번호 부여 로직을 만들거나 수정할 수 있습니다.")
}
};
// 익명 자식 클래스를 사용하는 메서드 선언
public void raffleNumber1() {
rn1.grantNumber();
}
// 메서드의 로컬 변수에서 사용
public void raffleNumber2() {
RandomNumber rn2 = new RandomNumber() {
@Override
public void grantNumber() {
System.out.println("추첨에 알맞는 번호를 부여");
}
};
rn2.grantNumber();
}
// 메서드의 매개변수에서 사용
// 실행 클래스에서 익명 자식 클래스 선언
public void raffleNumber3(RandomNumber randomNumber) {
randomNumber.grantNumber();
}
}
public class StudentExample {
public static void main(String[] args) {
// 인스턴스 생성
RandomNumber rn = new RandomNumber();
// 익명 자식 클래스가 생성된 메서드 호출
rn.raffleNumber1();
// 익명 자식 클래스 인스턴스가 대입된 메서드 사용
rn.raffleNumber2();
// 매개변수로 사용된 클래스의 익명 자식 클래스 생성 후 대입
rn.raffleNumber3(new RandomNumber() {
@Override
public void grantNumber() {
System.out.println("매개 변수에 인스턴스를 생성하면서 클래스 내용 변경");
}
});
}
}
익명 구현 클래스
- 익명 구현 클래스는 인터페이스를 구현하여 생성됩니다.
- 익명 클래스로부터 생성된 인스턴스는 인터페이스의 필드, 추상 메서드를 구현하게 됩니다.
- 익명 클래스 인스턴스가 인터페이스로부터 구현한 필드와 메서드는 생성된 블럭 안에서만 사용할 수 있습니다.
- 익명 구현 클래스는 안드로이드와 같은 UI 프로그램에서 이벤트를 처리하는 객체로 활용됩니다.
익명 구현 클래스 생성 방법
new 인터페이스() {
// 필드
// 메서드
}
익명 자식 클래스 활용 예시
// 인터페이스 생성
public interface RandomNumber {
// 추상 메서드
void grantNumber();
}
// 구현 클래스 생성
public class Student {
// 필드값에 인터페이스형의 변수 생성 및 익명 구현 클래스 대입
private RandomNumber rn1 = new RandomNumber() {
@Override
public void grantNumber() {
System.out.println("여기서 번호 부여 로직을 만들거나 수정할 수 있습니다.")
}
};
// 익명 구현 클래스를 사용하는 메서드 선언
public void raffleNumber1() {
rn1.grantNumber();
}
// 메서드의 로컬 변수에서 사용
public void raffleNumber2() {
RandomNumber rn2 = new RandomNumber() {
@Override
public void grantNumber() {
System.out.println("추첨에 알맞는 번호를 부여");
}
};
rn2.grantNumber();
}
// 메서드의 매개변수에서 사용
// 실행 클래스에서 익명 구현 클래스 선언
public void raffleNumber3(RandomNumber randomNumber) {
randomNumber.grantNumber();
}
}
public class StudentExample {
public static void main(String[] args) {
// 인스턴스 생성
RandomNumber rn = new RandomNumber();
// 익명 구현 클래스가 생성된 메서드 호출
rn.raffleNumber1();
// 익명 구현 클래스 인스턴스가 대입된 메서드 사용
rn.raffleNumber2();
// 매개변수로 사용된 클래스의 익명 구현 클래스 생성 후 대입
rn.raffleNumber3(new RandomNumber() {
@Override
public void grantNumber() {
System.out.println("매개 변수에 인스턴스를 생성하면서 클래스 내용 변경");
}
});
}
}
'Programing Language > Java' 카테고리의 다른 글
[Java] 프로그램 에러와 예외(Program Error & Exception) (0) | 2022.07.12 |
---|---|
[Java] 중첩 인터페이스(Nested Interface) (0) | 2022.07.12 |
[Java] 중첩 클래스의 분류(Separation of Nested Class) (0) | 2022.07.09 |
[Java] 중첩 클래스(Nested Class) (0) | 2022.07.08 |
[Java] 인터페이스의 요소(Member of Interface) (0) | 2022.07.08 |