익명 중첩 클래스란 객체 생성 시 해당 클래스의 내용을 재정의 또는 추가하기 위해 사용하는 것을 말한다. 클래스를 만드는 것이 아닌 객체 생성 시점에서의 재정의/추가이기 때문에 클래스 원본의 내용은 수정되지 않는다. 한 마디로 정의하면 1회용 상속이라고 이해할 수 있다.
익명 중첩 클래스의 형태
Phone.java
publicclassPhone{publicvoidcall(){System.out.println("전화 기능 실행"); }}
AnonymousInnerClassExample01.java
publicclassAnonymousInnerClassExample01 {publicstaticvoidmain(String[] args){Phone phone =newPhone();phone.call();Phone galaxy =newPhone(){publicvoidcall(){System.out.println("Galaxy 통화 기능 실행"); } };galaxy.call();Phone iPhone =newPhone(){publicvoidcall(){System.out.println("iPhone 통화 기능 실행"); } };iPhone.call(); }}
위의 코드에서 galaxy와 iPhone 객체 뒷 부분의 { } 가 익명 중첩 클래스이다.
publicclassAnonymousInnerClassExample02 {publicstaticvoidmain(String[] args){Button menu =newButton(){ @Overridepublicvoidpush(){System.out.println("메뉴 출력"); } };Button order =newButton(){ @Overridepublicvoidpush(){System.out.println("메뉴 주문"); } };Button cancel =newButton(){ @Overridepublicvoidpush(){System.out.println("주문 취소"); } };Button exit =newButton(){ @Overridepublicvoidpush(){System.out.println("프로그램 종료"); } };//같은 클래스로 만들어진 객체지만 익명 중첩 클래스의 내용으로 인해 실행코드가 달라진다.menu.push();order.push();cancel.push();exit.push(); }}
Button 클래스는 push의 형태만 만들고 내용을 작성하지 않기 위해 추상 클래스로 구현하였다. 또한 익명 중첩 클래스를 활용하여 각각 용도에 맞는 버튼들을 일회성 객체로 구현하였다. 물론 각각의 종류에 해당하는 버튼들을 Button의 하위 클래스로 구현하여 객체로 생성해도 된다. 만약 그렇게 된다면 코드는 다음과 같을 것이다.