Java

77. 내부클래스의 제어자와 접근성 - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2024. 12. 23. 16:22

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

  • 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일
class Outer {
    private class InstanceInner {}
    protected static class StaticInner {}
    
    void myMethod() {
    	class LocalInner {}
    }
}

class Ex7_12 {
    class InstanceInner {
    	int iv = 100;
        static int cv = 100;		// 에러 static 변수를 선언할 수 없다.
        final static int CONST = 100;	// final static은 상수이므로 허용
    }
    static class StaticInner {
    	int iv =200;
        static int cv = 200;	// static클래스만 static멤버를 정의할 수 있다.
    }
    
    void myMethod() {
    	class LocalInner {
            int iv = 300;
            static int cv = 300;	// 에러 static 변수를 선언할 수 없다.
            final static int CONST = 300;	// final static은 상수이므로 허용
        }
    }
}

 

2. 예제1

class Outer {
    private int outerIv = 0;
    static  int outerCv = 0;
    
    class InstanceInner {
    	int iiv  = outerIv;	// 외부 클래스의 private멤버도 접근가능하다.
        int iiv2 = outerCv;
    }
    
    static class StaticInner {
    	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;
	// 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다.
            int liv3 = lv;	// 에러 (JDK1.8부터는 에러 아님) 값이 바뀌지 않는 변수는 상수로 간주
            int liv4 = LV;	// OK.
        }
    }
}

 

3. 예제2

class Outer2 {
    class InstanceInner {
    	int iv = 100;
    }
    static class StaticInner {
    	int iv = 200;
        static int cv = 300;
    }
    
    void myMethod() {
    	class LocalInner {
            int iv = 400;
        }
    }
}

class Ex7_15 {
    public static void main(String[] args) {
        Outer2 oc = new Outer2();	// 외부 클래스의 인스턴스를 먼저 생성해야 인스턴스 클래스의
        Outer2.InstanceInner ii = oc.newInstanceInner(); // 인스턴스를 생성 가능
        
        System.out.println("ii.iv : " + ii.iv);
        System.out.pritnln("Outer2.staticInner.cv : " Outer2.StaticInner.cv);
        
        // 스태틱 내부 클래스의 인스턴스는 외부클래스를 먼저 생성하지 않아도 된다.
        Outer2.StaticInner si = new Outer2.staticInner();
        System.out.println("si.iv : " + si.iv);
    }
}