프로그래밍 정리/자바

Inner Class(내부 클래스) - static nested class, local class, annoymous class, instance class

주누다 2011. 8. 12. 14:26
반응형

내부 클래스 

 

내부 클래스(inner class)란?

    - 클래스 내부에 또 다른 클래스가 정의됨

    - 한 클래스를 다른 클래스의 내부 클래스로 선언하여 두 클래스의
      멤버들간에 쉽게 접근이 가능

    - 외부에 불필요한 클래스를 감춤으로써 복잡성을 줄임(캡슐화)

 

     * 캡슐화

        - 객체를 다른 객체가 접근할 수 있는 부분인 노출부와 그렇지
         못한 상세 구현부로 분리하는 것

        - 캡슐화된 메소드의 기능만을 알고
          그 기능만을 사용할 뿐 그 기능에 대해서 알 수 없음

        - 특정 개체가 독립적으로 역할을 제대로 수행하기 위해 필요한 데이터와 기능을 하나로 묶어 관리하는 것

        - 정보의 보호 목적에서 만들어진 개념

 

        ex) '사람'이 있다면 사람에 '코', '눈', '귀'가 있음. 코는 냄새를 맡고 눈은 볼 수 있고, 귀는 듣는 기능이 있음.

            하지만 눈, 코, 귀가 어떻게 기능을 작용하는지에 대한 정보는 알수 없음 

 

내부 클래스의 종류와 특징

    - 내부클래스는 마치 변수를 선언하는 것과 같은 위치에 선언할 수 있음

    - 선언위치에 따라 유효범위와 성질이 변수와 유사

 

    종류

    local 클래스(지역 클래스)

        - 외부 클래스의 메서드나 초기화블럭 안에 선언, 선언된 영역 내부에서만 사용가능

        - 특정 메서드 안에서 정의되는 클래스. 특정 메서드 안에서 선언되는 지역변수와 같은 것. 메서드가 호출될 때

          생성할 수 있으며 메서드의 수행력이 끝나면 지역변수와 같이 자동 소멸


        => 

            class Outer{

                ...

                public void A(){

                    ...

                    class Innner{}

                    ...

                }

            }

 

    Annoymous class (익명 클래스)

        - 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(일회용)

        - 이름이 없는 것을 의미. 자바의 프로그램적으로 해석하면 정의된 클래스의 이름이 없다는 것

        =>

            class Outer{

                ...

                Inner inner = new Inner(){

                    public void A{

                            ...                        

                    }

                };

            }

 

    Instance클래스(인스턴스 클래스) 

        - 외부클래스의 멤버변수 선언위치에 선언하며, 외부클래스의 인스턴스멤버 변수처럼 다루어짐.

          주로 외부클래스의 인스턴스멤버들과 관련된 작업에 사용된 목적으로 선언

        - 객체를 생성해야만 사용할 수 있는 멤버들과 같은 위치에 정의되어 있는 클래스.
          즉 내부 클래스를 생성하려면 외부 클래스의 객체를 생성한 후에 생성할 수 있음

        - Outer outer = new Outer();

        Outer.Inner inner = outer.new Inner();

        =>

            class Outer{

                ...                        // 구현부

                class Inner{}

                    ...

            }

 

    static nested class(Static class or Nested class)

        - 외부클래스와 멤버변수 선언위치에 선언하며, 외부클래스의 static멤버처럼 다루어짐. 주로 외부 클래스의
          static 멤버, 특히 static 메서드에서 사용될 목적으로 선언

        - static 내부 클래스로 어쩔 수 없이 정의하는 경우가 있는데 내부 클래스 안에 static 변수를 가지고 있다면
          해당 내부 클래스는 static으로 선언해야함.

        => 

            class Outer{

                ...

                static class Inner{}

                ...

            }

 

 

 

    * static nested 클래스와 instance 클래스의 생성 방식이 다름.

        - static nested클래스는 new [Outer 클래스명].[nested 클래스명]으로 바로 생성.

        - instance 클래스는 먼저 Outer 클래스에 대한 인스턴스를 생성한 후 outer.new [Inner 클래스명]()으로 생성

        =>

            Inner Class

            Outer outer = new Outer();

            Outer.Inner = outer.new Inner();

        

            static nested class

            Outer.Inner inner = new Outer.Inner();

반응형