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