내부클래스


내부클래스


내부클래스란?

내부 클래스란 클래스 내에 선언된 클래스이다. 클래스 내에 다른 클래스를 선언하는 이유는

두 클래스가 서로 긴밀한 관계에 있기 때문이다.

내부 클래스는 외부 클래스를 제외하고 다른 클래스에서 잘 사용되지 않는 것이여야 한다.

class Line {

    public int line = 100;

    // 내부클래스
    public class Point {
        public int x;
        public int y;

        public int getLine() {
            return line;    // <- 객체 생성없이 외부 클래스의 멤버변수 접근 가능.
        }
    }

    public Point getPoint() {
        return new Point();
    }
}


내부 클래스의 장점

• 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.

코드의 복잡성을 줄일 수 있다.(캡슐화)


내부 클래스 접근하기

public static void main(String[] args) {

    Line line = new Line();
    
    Line.Point test = line.getPoint();

}


내부 클래스의 종류와 특징

필드가 클래스로 바뀐 것 뿐이지 본질은 같다.(iv, cv, lv)

class Outer {

    // iv
    class InstanceInner {}

    // cv
    static class StaticInner {}

    // lv
    void myMethod() {
        class LocalInner{}
    }

}


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

• 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일

class InnerEx1 {

    /**
     * static 변수 및 메서드를 선언할 수 없다.
     * final static은 상수이므로 허용한다.
     */
    class InstanceInner {
        int iv = 100;
        final static int CONST = 200;
    }

    /**
     * static 클래스만 static멤버를 정의할 수 있다.
     */
    static StaticInner {
        final static int iv = 300;
        static int cv = 240;
    }

    void myMethod() {
        /**
         * static 변수 및 메서드를 선언할 수 없다.
         * final static은 상수이므로 허용한다.
         */
        class LocalInner{
            int iv = 300;
            final static int CONST = 400;
        }
    }
}


class InnerEx3 {
    private int outerIv = 0;
    static int outerCv = 0;

    class InstanceInner {
        int iiv = outerIv; //=> 외부 클래스의 private 멤버도 접근 가능하다.
        int iiv2 = outerCv;
    }

    static class StaticInner {
        // static class는 외부 클래스의 인스턴스 멤버에 접근할 수 없다.
        // int siv = outerIv;
        static int scv = outerCv;
    }

    void myMethod() {
        int lv = 0;
        final int LV = 0; //JDK1.8 부터 final 생략가능.

        class LocalInner {
            int liv = outerIv;
            int liv2 = outerCv;
            int liv3 = lv;
            int liv4 = LV;
        }
    }
}

지역 클래스는 외부 클래스의 인스턴스멤버와 static멤버를 모두 사용할 수 있으며,

지역 클래스가 포함된 메서드에 정의된 지역변수도 사용할 수 있다. 단 final이 붙은

지역변수만 접근가능한데 그 이유는 메서드가 수행을 마쳐서 지역변수가 소멸된 시점에도,

지역 클래스의 인스턴스가 소면된 지역변수를 참조하려는 경우가 발생할 수 있기 때문이다.