Yoon DevLog
article thumbnail

 

익명 클래스(Anonymous class)

익명클래스는 특이하게도 다른 내부 클래스들과 달리 이름이 없다. 클래스의 선언과 객체의 생성을 동시에 하기 때문이다. 

즉, 단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스이다.

new 조상클래스이름() {
	// 멤버 선언
}

OR

new 구현인터페이스이름() {
	// 멤버 선언
}

이름이 없기 때문에 생성자도 가질 수 없으며, 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.

오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.

 

정리하자면, 익명 클래스는 재사용할 필요가 없는 일회성 클래스를 굳이 새로 클래스를 생성하는 것이 아닌 익명 클래스를 통해 코드를 줄이는 기법이라고 볼 수 있다.

 

 

익명 클래스 유의점

기존 부모 클래스를 상속한 자식 클래스에서는 부모 클래스의 메서드를 재정의할 뿐만 아니라 새로운 메소드를 만들어 사용할 수도 있다.

하지만 익명 클래스 방식으로 선언한다면 오버라이딩 한 메소드만 사용가능하고, 새로 정의한 메소드는 스코프 외부에서는 사용할 수 없다.

 

// 부모 클래스
class Animal {
    public String ramble() {
        return "산책을 한다!";
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Animal() {
            // @Override 메소드
            public String ramble() {
                return "댕댕이가 산책을 한다!";
            }
            
            // 새로 정의한 메소드
            public String poop() {
                return "댕댕이가 똥을 싼다!";
            }
        };
        
        dog.ramble(); // "댕댕이가 산책을 한다!"
        dog.poop();   // ERROR -> 외부에서 호출 불가능
    }
}

 

 


 

인터페이스 익명 구현 객체

위에서 익명클래스는 일회성 오버라이딩 용 이라고 정리했다.

 

이러한 특징을 잘 맞물려 추상화 구조인 인터페이스를 일회용으로 구현하여 사용할 필요가 있을 때, 익명 구현 객체로 선언해서 사용하면 매우 시너지가 잘 맞게 된다!

// 인터페이스
interface IAnimal {
    public String bark(); // 추상 메소드
    public String run();
}

public class Main {
    public static void main(String[] args) {
        // 인터페이스 익명 구현 객체 생성
        IAnimal dog = new IAnimal() {
            @Override
            public String bark() {
                return "개가 짖습니다";
            }
            
            @Override
            public String run() {
                return "개가 달립니다";
            }
        };
        
        // 인터페이스 구현 객체 사용
        dog.bark();
        dog.run();
    }
}

위의 코드 모습을 보면, 마치 인터페이스를 클래스 생성자 처럼 초기화하여 인스턴스화 한 것 같아 보인다.
하지만 알다시피 인터페이스 자체로는 객체를 만들수는 없다.
위의 코드에서 new 인터페이스명() 은 그렇게 보일 뿐이지, 사실 자식 클래스를 생성해서 implements 하고 클래스 초기화 한 것과 다름이 없다.
그냥 익명클래스를 작성함과 동시에 객체를 생성하도록하는 Java의 문법으로 보면 된다.

 

 

 

조금 더 깊은 설명은 inpa Dev 님 블로그에서 참조해주세요! 너무나 좋은 설명인데 그대로 긁어오기엔 조금 그래서... 강추!!

 

 

 

 

 

 

 


#참고자료

자바의 정석(남궁성 지음)

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

 

[JAVA] ☕ 익명 클래스(Anonymous Class) 개념 & 문법 정리

익명 클래스 (Anonymous Class) 익명 클래스는 내부 클래스(Inner class) 일종으로 단어 그대로 이름이 없는 클래스를 말한다. 익명, 이름이 없다는 것은 별로 기억되지 않아도 된다는 것이며, 나중에 다

inpa.tistory.com

 

profile

Yoon DevLog

@usnooy._.

백엔드 개발자 성장일기 -