내부 클래스(Inner Class)

이승준·2021년 7월 25일
1

Java Study

목록 보기
12/12

내부 클래스란?


  • 클래스 내에 선언된 클래스.

  • 두 클래스가 서로 긴밀한 관계에 있을 때 사용.

  • 내부 클래스 장점

    • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근이 가능하다.
    • 코드의 복잡성을 줄일 수 있다.
    • 해당 클래스에서만 내부 클래스를 사용할 수 있게 클래스를 감출 수 있다. (캡슐화)

내부 클래스의 종류와 특징


  • 내부 클래스의 종류는 변수 선언위치에 따른 종류와 같다.

인스턴스 클래스

  • 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다룸.
  • 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업을 할 목적으로 선언

스태틱 클래스

  • 외부 클래스의 멤버변수 선언위치에 선언.
  • 외부 클래스의 static멤버처럼 다룸.
  • 특히 static 메서드에 사용될 목적으로 선언됨.

지역 클래스

  • 외부 클래스의 메서드나 초기화 블럭 안에 선언.
  • 선언된 영역 내부에서만 사용이 가능.
  • 메서드의 호출이 끝나면 메서드에 사용된 지역변수의 유효성은 사라짐
  • 메서드 호출 이후에도 사용해야 하는 경우가 있을 수 있으므로 지역 내부 클래스에서 사용하는 메서드의 지역 변수나 매개 변수는 final로 선언됨.

익명 클래스

  • 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스
  • 일회성 클래스 (사용되고 나서 GC에 의해 메모리가 수집 됨.)
  • 이름이 없기 때문에 생성자 없음.
  • 조상 클래스의 이름 또는 구현하고자 하는 인터페이스 이름을 사용해 정의
  • 둘 이상의 인터페이스 구현이 불가능하다.
  • 오로지 단 하나의 클래스만 상속
new SuperClass() { 
    @Override
    void method(){}
}
또는
new InterfaceImpClass() { 
}

내부 클래스의 제어자와 접근성


  • 내부 클래스도 멤버변수, 지역변수와 마찬가지로 선언된 위치에 따라 같은 성질을 갖는다.
  • 멤버 변수들처럼 private,protected 등 접근 제어자 사용이 가능.
  • 내부 클래스 중에서 스태틱클래스만 static 변수를 가질 수 있음.
    • 단, final static 키워드가 붙은 멤버 변수는 다른 내부 클래스에서도 사용이 가능. (상수 취급이므로)
public class Outer { 
    private int outIv = 1; 
    InstanceClass ic = new InstanceClass(); 
    static StaticClass sc = new StaticClass(); 
    private class InstanceClass {   //인스턴스 클래스
        private int iv; 
        final static int CONST = 100; 
        public InstanceClass() { 
            iv = 1; 
            outIv = 2; 
        } 
        public void hello() { 
            System.out.println("Hello instanceClass" + outIv);  //외부 클래스 멤버 변수(outIv) 사용
        } 
        public int getIv() { 
            return iv; 
        } 
        public void setIv(int num) { 
            iv = num; 
        } 
    } 
    static class StaticClass {  //스태틱 클래스
        private static int cv; 
        public StaticClass() { 
            cv = 2; 
        } 
        public void hello() { 
            System.out.println("Hello instanceClass"); 
        } 
        public int getCv() { 
            return cv; 
        } 
        public void setCv(int num) { 
            cv = num; 
        } 
    } 
    public void method() { 
        int count = ic.getIv(); 
        ic.hello(); 
        
        class LocalClass {   //지역 클래스
            final static int C = 3; 
    
            public void hello(int num) { 
                count = 1;  // ERROR! .. count는 실제로 final int count = ic.getIv() 로 지역 클래스 메서드가 해당 메서드의 지역변수를 사용 해야하는 경우 final로 되어 상수화 됨.
                for (int i = 0; i < num+count; i++) { 
                    System.out.println("Hello"); 
                } 
            } 
        } 
        LocalClass instanceClass = new LocalClass();   //해당 메서드 안에서만 사용 가능.
        instanceClass.hello(LocalClass.C); 
    } 
    public void anonymousMethod() { 
        Object lv = new Object() {   //익명 클래스
            @Override 
            public String toString() { 
               return "Anonymous!!"; 
            } 
        }; 
        System.out.println(lv); 
        AnonyMousInterface anonyMousInterface = new AnonyMousInterface() {  //익명 클래스, AnonyMousInterface 구현
            @Override 
            public void method() { 
                System.out.println("Anonymous Interface!!"); 
            } 
        }; 
        anonyMousInterface.method(); 
    } 
}
profile
끊임없이 생각하는 주니어 웹 개발자입니다.

0개의 댓글