티스토리 뷰



내부 클래스란 특정 클래스 안에 또 다른 클래스가 정의되는 것을 의미한다. 


# 내부 클래스 장점과 주의사항

- 내부 클래스는 외부 클래스의 모든 멤버들을 마치 자신의 멤버처럼 사용할 수 있다.

   (private로 선언된 멤버도 사용할 수 있다.)

- static 내부 클래스를 제외하고는 다른 내부 클래스는 항상 외부 클래스를 통해야 생성할 수 있다.



# 내부 클래스가 필요한 이유

- 내부클래스는 다중상속의 문제점을 해결하는 하나의 방안이다. 여러개의 인터페이스를 구현해서, 다중상속을 구현하지만, 여전히 하나의 추상클래스 밖에 상속하지 못하기 때문에 제한이 있다. 이를 해결하는 것이 내부클래스로, 특정 클래스를 내부클래스가 상속하게 하여 보다쉽게 다중상속의 기능을 제공하게 된다.

이벤트 중심 시스템(Event Driven System)과 같은 제어 프레임워크의 구현에서, 내부클래스가 많이 사용된다.


# 내부 클래스의 종류

 종류

 설명

실무 사용빈도

 Member

 멤버 변수나 멤버 메서드들과 같이 클래스가 정의된 경우에 사용한다.

 잘 쓰임

 Local

 특정한 메서드 내에 클래스가 정의된 경우에 사용한다.

 잘 안쓰임

 Static

 static 변수(클래스 변수)와 같이 클래스가 static으로 선언된 경우에 사용한다.

 잘 안쓰임

 Anonymous 참조할 수 있는 이름이 없는 경우에 사용한다.

 잘 쓰임


# Member 내부 클래스

  class Outer {

      ...

     class Inner {

     }

      ...

}

객체를 생성해야만 사용할 수 있는 멤버들과 같은 위치에 정의되는 클래스를 말한다.


- 예제

// MemberInner.java
public class MemberInner {
    int a = 10;
    private int b = 100;
    static int c = 200;
    
    class Inner {   // 내부 클래스 정의
        public void printData(){
            System.out.println("int a : "+a);
            System.out.println("private int b : "+b);   // 주시하자!
            System.out.println("static int c : "+c);
        }
    }
    public static void main(String[] args) {
        //MemberInner outer = new MemberInner();
        //MemberInner.Inner inner = outer.new Inner();
        MemberInner.Inner inner = new MemberInner().new Inner();
        inner.printData();
        // 그런데 메인에서 이렇게 내부 클래스를 생성하여 사용하는 경우는
        // 거의 없다. 보통 외부 클래스의 멤버 메서드에서 내부 클래스를 
        // 사용하고, 메인에서는 외부 클래스를 생성하고 멤버 메서드를 
        // 호출하여 사용한다.
    }
}


# Anonymous(익명) 내부 클래스

  class Outer {

     ...

    public void methodA(){ // 멤버 메서드

      new Inner(){

      }; // 세미콜론이 있다!

    }

  ...

 }   

한 번만 사용하고 버려지는 객체를 사용할 때 유용한 내부 클래스다. (효율적인 메모리 사용)



- 예제

// MyTest3.java
public class MyTest3 {
    private String msg = "super";

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

// InnerEx3.java
public class InnerEx3 {
    public InnerEx3(){ // 생성자
        print(new MyTest3());
        
        print(new MyTest3(){    
            // MyTest3()을 상속받고 재정의 한다. 
            // 즉, MyTest3()를 상속받은 익명의 자식클래스다.
            String msg = "sub";

            public String getMsg(){
                return msg;
            }
        }); // 세미콜론이 있다! 주의하자.
    }
    
    public void print(MyTest3 m){
        String msg = m.getMsg();    // MyTest3 클래스의 msg 를 리턴한다.
        System.out.println("msg:"+msg);
    }
    
    public static void main(String[] args) {
        //InnerEx3 ex3 = new InnerEx3();
        new InnerEx3(); // 생성자만 필요하므로 인스턴스를 저장하지 않아도 된다.
    }
    
}

'프로그래밍 > Java' 카테고리의 다른 글

자바(java) - 인터페이스 예제  (0) 2013.07.10
자바(java) - 다형성  (0) 2013.07.10
자바(java) - super와 super()  (0) 2013.07.09
자바(java) - 오버라이딩(Overriding)  (0) 2013.07.09
자바(java) - 클래스 상속  (0) 2013.07.09
댓글