JAVA
[JAVA] 익명 클래스(익명 객체)
정공자씨
2024. 4. 23. 22:58
익명 클래스(익명객체)
정의
- 내부 클래스의 한 종류
- 딱 한 번만 인스턴스를 생성하여 사용하는 객체
- 즉, 프로그램에서 일시적으로 한번만 사용되고 버려지는 객체
- 일시적으로 사용된다는 것은, 재사용되지 않는다는 것
일회용으로 사용하므로 이름이 필요 없어서 '익명 클래스'라고 함
익명클래스를 사용하는 목적
1. 프로그램 내에서 일시적으로 1번만 사용되어야 하는 객체의 경우
- UI 이벤트 처리
2. 재사용성이 없고, 확장성을 활용하는 것이 유지보수에 불리할 때
- 재사용성이 없어서 매번 클래스를 생성해야 하는 비용이 더 많을때
부모 클래스를 상속 받는 자식 클래스를 생성하지 않고도 단일한 객체를 만들어서 부모 클래스에 정의된 메서드의 행위를 추가할 수 있음
특징
- 클래스 선언과 동시에 인스턴스(객체)를 생성하기 때문에 1번만 사용될 수 있음
- 단 한 번만 인스턴스를 생성하여 사용하기 위해 이용하는 일회용 클래스
- 클래스 이름이 없기 때문에 생성자가 존재하지 않음
- 익명 클래스는 단독으로 인스턴스 생성 불가
- 클래스를 상속하거나 인터페이스를 구현해야만 생성이 가능
[ 일반 클래스 ]
- 언제든지 인스턴스를 생성하여 사용할 수 있음
[ 익명 클래스 ]
- 딱 한 번만 인스턴스를 생성해서 사용하기 위함
익명클래스를 구현하는 방법
1. 인터페이스를 구현하는 익명의 구현 객체를 생성
2. 부모 클래스를 상속하는 익명의 자식 객체를 생성
1. 익명의 구현 객체 생성(인터페이스 구현)
- 인터페이스를 구현하는 익명의 클래스(객체)를 생성하여 사용
interface 인터페이스명 {
추상메서드;
}
// 익명 구현 객체 생성
인터페이스명 변수명 = new 인터페이스명() {
@Override
인터페이스명 메서드 오버라이딩(추상메서드 구현)
};
2. 익명의 자식 객체 생성
- 부모클래스를 상속 받는 익명의 자식 객체(클래스)를 생성하여 사용
class 부모클래스명 {
//필드
//메서드
}
// 익명의 자식 객체를 생성
부모클래스명 변수명 = new 부모클래스명() {
@Override
부모클래스의 메서드 오버라이딩
};
- 클래스 선언과 동시에 heap 영역에 인스턴스가 생성되고, 참조변수에 위치값을 저장
- 참조변수의 타입은 부모 클래스로 지정
예제
1. 익명 클래스를 사용하지 않는 예제
interface Ikmyoung {
int age = 20;
String getName(); // 추상메서드
void getAge(); // 추상메서드
}
class Child implements Ikmyoung {
@Override
public String getName() {
return "이름";
}
@Override
public void getAge() {
System.out.println("나이");
}
}
public class Test {
public static void main(String[] args) {
Child c = new Child();
c.getAge();
String name = c.getName();
}
}
- Ikmyoung 인터페이스에서는 getAge(), getName() 메서드를 제공하고
- Child 클래스는 해당 추상메서드를 구현하여 사용
- 만일, 여기서 프로그램이 끝난다면,
- Child 클래스를 별도로 분리하여 클래스를 만들어 사용할 필요가 없음
이렇게 객체를 1번만 사용하는 경우라면 별도로 구현하는 클래스를 생성하지 않고, 익명 클래스로 단일 객체를 생성하여 사용할 수 있음
2. 익명 클래스를 사용하는 예제
interface Ikmyoung {
int age = 20;
String getName(); // 추상메서드
void getAge(); // 추상메서드
}
public class Anonymous {
public static void main(String[] args) {
// Ikmyoung클래스를 익명 클래스로 선언하여, 변수(ik)에 저장
Ikmyoung ik = new Ikmyoung() {
@Override
public String getName() {
return "이름";
}
@Override
public void getAge() {
System.out.println("나이");
}
};
// 익명클래스에서 오버라이딩한 메서드를 사용
String name = ik.getName();
System.out.println(name); //
}
}
- new Ikmyoung()을 통해서 익명 클래스의 인스턴스가 생성되고, Ikmyoung 타입의 참조변수(ik)에 인스턴스의 위치값(주소값)이 저장됨
- 익명 클래스 내부에는 상속한 클래스의 메서드를 오버라이딩하여 구현
- 익명 클래스의 멤버를 사용하는 방법은 참조변수.메서드명으로 접근
익명 클래스와 일반 클래스의 차이점
익명클래스 | 일반 클래스 |
익명클래스는 단 1개의 인터페이스(클래스)만 구현 가능 | 일반 클래스는 인터페이스를 제한없이 상속 가능 (다중 상속) |
생성자가 없음 | |
딱 1번만 인스턴스를 생성해서 사용 | 언제든지 인스턴스를 생성하여 사용 |
출처
https://velog.io/@balparang/Java-%EC%9D%B5%EB%AA%85-%ED%81%B4%EB%9E%98%EC%8A%A4Anonymous-Class
https://dduddublog.tistory.com/169