본문 바로가기
IT/Java

익명 클래스(anonymous class)란?

by 성준하이 2023. 2. 25.
반응형

먼저 oracle 에서 소개하는 익명클래스에 대해서는 아래 링크에서 확인 가능하다.

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

 

Anonymous Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

 

익명 클래스

결론먼저 말하면 익명 클래스는 내부 클래스(Inner class) 일종으로 단어 그대로 이름이 없는 클래스를 말한다.

익명, 이름이 없다는 것은 별로 기억되지 않아도 된다는 것이며, 나중에 다시 불러질 이유가 없다는 뜻을 내포한다.  즉, 프로그램에서 일시적으로 한번만 사용되고 버려지는 객체라고 보면 된다. (일회용 클래스)

즉 이름이 없는 클래스라고 불리우는데, '이름이 없는' 이란 의미를 잘 생각해봐야 한다. 

 

아래 예시를 보면

public class Test{
    private int num = 1;
    public int getNum(){
        return this.num;
    }
    public void setNum(int num){
        this.num = num;
    }
}

 

Test란 클래스이다. 멤버변수 num 을 private로 접근을 제어한 후,

게터와 세터로 멤버변수를 접근할 수 있도록 만들었다.

일반적으로 dto와 비슷하다고 생각하면 된다.

 

그러고 어느 클래스에서든 해당 dto를 사용할 경우엔 이렇게 사용이 가능하다.

Test t1 = new Test();

 

여기서의 인스턴스 (new Test())는 클래스 이름 'Test'라고 불려진다.

 

즉, 우리가 일반적으로 사용하는 인스턴스는 '이름이 있는 클래스' 인것이다.

 

그렇다면 '이름이 없는 클래스'란?

 

위에서 설명한 이름이 있는 클래스의 반대 경우이다. 

 

즉 Test와 같은 클래스이름 자체가 없는 클래스를 의미한다.

아래와 같다.

Test t1 = new Test(){
    public int num = 10;
    @Override
    public int getNum(){
        return this.num;
    }
};                

이름있는 클래스와 비슷하게 구현은 되지만 다른점이 있다.
중괄호로 코드 내에서 구현이 되어있다.

 

이렇게 구현이 된 인스턴스가 이름이 없는 인스턴스 이다.

 

일단 Test의 dto는 존재하고 코드 상에서 재정의 되는 메서드라고 생각하면 된다.

 

오히려 이 인스턴스는 Test 클래스를 상속받은 클래스라고 바꿔 말해도 될 것이다. 

이름 없는 어떤 클래스가 부모클래스로 부터(Test) 상속을 받은 인스턴스 인 것이다.

 

사용이유

굳이 재정의 해서 사용하면서 익명 클래스를 사용하는 이유는 다음과 같다.

  • 함수를 재사용하기 위해 사용 -> 1회성 사용
  • 메모리 관리 측면 효과적 -> 함수는 메모리에 올라와있지만 익명은 1회성으로 사라지기에
한번만 호출해 사용하는 기능에 사용.

 

장점

  • 정의와 동시에 객체 생성
  • 간결한 코드
  • 자신 포함하여 외부 클래스의 멤버에 접근 가능하다.
  • 지역에서 한번만 사용될 경우에는 익명클래스가 좋음

주의점

  • 익명 클래스 방식으로 선언한다면 오버라이딩 한 메소드 사용만 가능하고, 새로 정의한 메소드는 외부에서 사용이 불가능
    -> new Test(){} 를 통해서 생성하는 인스턴스는 별도의 클래스가 아닌 Test클래스를 상속 받는 익명클래스 이기 때문

사용위치

  • 클래스필드
반응형

'IT > Java' 카테고리의 다른 글

@Qualifier 어노테이션 사용법  (10) 2023.02.27
[Spring] NamedParameterJdbcTemplate  (13) 2023.02.26
Thread란? (process비교)  (12) 2023.02.21
@Transactional 사용시 주의 사항1 (checked Exception)  (8) 2023.02.20
Spring 에서 async 처리 (@Async)  (13) 2023.02.19

댓글