본문 바로가기
👩‍💻 BackEnd/☕️ 자바 [Java]

[Java] 자바의 정석 : 내부 클래스의 제어자와 접근성 / 익명 클래스

by minhe2810 2024. 2. 27.

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

: 클래스는 원래 default , public 접근 제어자만 사용할 수 있지만 내부 클래스의 제어자는 변수에 사용가능한 제어자와 동일 

 

package pkg2;

public 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;
            final static int CONST = 300; // final static 은 상수이므로 허용
        }
    }

    public static void main(String[] args) {
        System.out.println(InstanceInner.CONST);
        System.out.println(StaticInner.cv);
//        System.out.println(LocalInner.CONST);  메서드 안에 있는 지역 내부 클래스의 static 상수는 해당 메서드 내에서만 사용이 가능함.

    }
}

 

 

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

  • 인스턴스 멤버가 static 멤버를 사용할 수 있지만 
  • static 멤버는 인스턴스 멤버를 사용할 수 없다. 

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

  • 내부 클래스에서는 외부 클래스의 private 멤버도 접근 가능하다. 
package pkg2;

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

    void myMethod() {
        final int lv = 0; // 값이 바뀌지 않는 변수는 상수로 간주 
        final int Lv = 0; // JDK 1.8 부터 final 생략 가능 

        class LocalInner {        // 2. 지역 내부 클래스를 감싸고 있는 메서드의 상수만 사용가능. 
            int liv = outerIv;
            int liv2 = outerCv;
            // 외부 클래스의 지역변수는 final 이 붙은 변수(상수) 만 접근 가능하다. 
            int liv3 = lv;
            int liv4 = Lv;

            void method() {
                System.out.println(lv);
            }
        }
    }

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

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

 

 


익명 클래스 

  • 이름이 없는 일회용 클래스. 정의와 생성을 동시에 
  • 클래스 이름을 제거, 조상의 이름을 작성하는 것임. 
  • 익명이라서 이름이 없음. 
new 조상클래스이름() {
	// 멤버 선언 
}

new 구현인터페이스이름(){
	// 멤버 선언
}

 

 

...으아.. 힘들다... 점점 더 내용 정리가 부실해지기 시작..