본문 바로가기

Programming/JAVA

중첩 클래스&인터페이스(5) - 익명 객체 1

java logo image

 

 

 

익명(anonymous) 객체는, 말 그대로 이름을 갖지 않는 객체를 의미합니다. 그런데 JAVA에서의 익명 객체에서 갖는 큰 특징은, 단독으로 익명 객체를 생성할 수가 없다는 점입니다. 단독으로 생성할 수 없다는 것은 결국 무엇을 의미할까요? 이는 어떤 부모 클래스를 상속받거나, 인터페이스를 구현해야만 생성할 수 있다는 의미입니다. 결국 JAVA에서의 익명 객체는 자식 레벨에서만 구현이 가능하다고 생각하면 되겠습니다. 

 

 

○ 익명의 자식 객체

 

기본적으로 우리가 자식 객체를 사용하는 방법에 대해서 되짚어 보겠습니다.

 

부모 클래스인 Parent가 있고, 이를 상속받는 Child 클래스가 있다고 가정하겠습니다. 다형성을 발현하게 되는 경우는 언제일까요? 자식은 부모 행세를 할 수 있기 때문에 Parent 클래스 타입 변수에 Child 인스턴스를 대입해 줍니다. 그리고, 해당 Child 클래스에서 부모 클래스의 메서드 중 재정의(오버라이드) 된 것이 있다면 Child 클래스에서 재정의 된 내용으로 실행하게 됩니다. 물론 Parent 타입으로 선언된 변수이기 때문에, 이 경우 Child만 갖고 있는 메서드는 실행이 불가능하겠지요.

(참고로 위의 클래스 타입 변수 선언은 특정 클래스의 필드로도, 혹은 메서드의 로컬 변수로도 선언이 가능하다는 점도 기억해 둡시다)

 

자, 이 경우에는 기본적으로 Parent라는 부모 클래스가 있는데, 이를 상속받는 Child라는 클래스를 당연히 선언하게 됩니다. Child 클래스 안에는 extends로 Parent를 상속받고, Parent에 선언된 메서드 중 재정의 할 내용이 있다면 이 오버라이드 내용이 작성되어 있을 것입니다. 그리고 자식 클래스 자체의 필드도 존재하겠죠. 

 

그런데 만일, 우리가 이 자식 클래스(Child)가 따로 클래스 파일을 만들 만큼 중요하지도 않고, 딱 한 번만 사용하게 되는 간단한 클래스라면 어떻게 해야 할까요? 이런 경우에 '익명 객체'를 사용하게 됩니다. 별도의 클래스 선언 없이 바로 익명 객체를 통해 자식 클래스를 선언하는 것과 동일한 효과를 얻게 되는 것이죠. 

 

단, 이 익명 객체는 지금까지 우리가 설명하고 학습해 온 자식 클래스(또는 인터페이스 구현 클래스) 형태와 다소 차이가 있기 때문에, 헷갈리기 쉬운 선언 방식과 구조를 갖고 있습니다. 주의해서 살펴보시기를 바랍니다. 차근차근 설명하겠습니다. 

 

만일 어떤 '부모 클래스'가 있고, 이를 상속받는 자식 클래스를 선언하는데, 따로 상속받는 자식 클래스 선언 없이 바로 이름 없는 자식 클래스를 선언하고 사용한다면? 아래의 형태를 따르게 됩니다. 

 

 

부모클래스 필드|변수 = new 부모클래스(매개값,..) {
    // 필드
    // 메서드
};

 

위의 코드를 잘 살펴보세요. 단순히 부모 클래스 타입의 변수를 선언하는 것이 아니라 위 코드 자체가 부모 클래스를 상속 받는 자식 클래스를 선언하는 코드입니다.

 

일단, 부모클래스(매개값) { ... }; 의 영역은 무엇을 의미할까요? 이 부분은, '부모클래스'를 상속받는 "자식 클래스"를 생성하는데 이 자식 클래스는 중괄호 { }와 같이 선언된다는 것을 의미합니다. 별도의 클래스를 만들었다면 작성했을 코드의 내용들이 작성되는 부분인 것이죠. new 키워드가 있다는 것은, 이렇게 선언된 "자식 클래스"의 인스턴스를 생성한다는 의미가 됩니다. 

 

참고로 해당 익명의 "자식 클래스"에서부모클래스(매개값)은 부모 생성자를 호출하는 부분이라고 생각하면 됩니다. 이런 형태로 생성자가 선언되기 때문에, 익명 객체의 내부 선언문에서는 생성자를 사용할 수 없다는 특징도 기억해 두시기 바랍니다.