2013년 1월 14일 월요일

[Java] 중첩, 네스티드, 로컬, 익명 클래스

중첩 클래스는 Outer클래스 객체 생성없이 Inner 클래스에서 단독적으로 객체를 생성되지 못한다. 즉, Outer클래스에 종속적이다. Outer클래스 안에 Inner클래스를 정의한다. 따라서 Outer에 있는 멤버와 메소드를 Inner에서 참조하거나 호출 가능하다.

정적내부클래스(네스티드 클래스)
많이 보는 클래스는 아니지만 Outer 클래스의 객체를 생성하지 않더라도 Inner클래스의 메소드를 사용할 수 있다. Outer클래스에 종속적이지 않고 단일 클래스로 취급하면서 클래스변수와 메소드를 호출할 수 있다.

로컬내부클래스
클래스가 메소드 내에 정의되어 있는 클래스이다. 메소드 안에서 클래스를 정의해 놓기 때문에 가독성이 좋다.

익명내부클래스(anonymous)
클래스의 선언부(시그너쳐)가 없다. 추상클래스와 인터페이스를 생성할 때 사용한다.
객체 생성과 동시에 {...}를 통해 명령부를 수행.

일반 클래스
class Myclass implements Interface{
                        .
                        .
                        .
}
Myclass obj1 = new Myclass();

익명내부클래스
public static void main(String[] args){
   Interface obj2 = new Interface(){
                        .
                        .
                        .
}
두개의 객체 obj1과 obj2는 같은 것이다!


즉, Interface를 implements한 class 객체를 생성하는 코드(혹은 추상 클래스를 상속한 class 객체를 생성하는 코드)와 익명 내부클래스에서 객체를 생성하는 코드는 같다.
차이는 익명내부클래스에서 만든 obj2는 한번만 만들어 사용할 것이고 객체 생성시 데이터를 전달하거나 리턴받지 못한다. 새로운 클래스를 다시 만들어 객체를 만들어 내기가 귀찮을 때 많이 사용한다. 그리고 인터페이스나 추상클래스는 객체를 생성하지 못하지만 이와 같은 방법으로 일시적으로 객체를 생성하여 활용할 수 있다는 장점이 있다.

댓글 없음:

댓글 쓰기