개발일지/Java

Java 멤버 내부 클래스

E-room 2022. 9. 9. 23:09
728x90

인스턴스 내부 클래스와 정적 내부 클래스를 합쳐서 부른다

객체 내부에 멤버의 형태로 존재하며, 외부 클래스의 모든 접근 지정자의 멤버에 접근할 수 있다.

 

인스턴스 내부 클래스

객체 내부에 멤버의 형태로 존재하며, 외부 클래스의 모든 접근 지정자의 멤버에 접근할 수 있다.

class Outer {
    private int num = 1; // 외부 클래스 인스턴스 변수
    private static int sNum = 2; // 외부 클래스 정적 변수

    private InClass inClass; // 내부 클래스 자료형 변수 선언

    public Outer() {
        inClass = new InClass(); // 외부 클래스 생성자
    }

    class InClass { // 인스턴스 내부 클래스
        int inNum = 10; // 내부 클래스의 인스턴스 변수
        void Test() {
            System.out.println("Outer num = " + num + "(외부 클래스의 인스턴스 변수)");
            System.out.println("Outer sNum = " + sNum + "(외부 클래스의 정적 변수)");
        }
    }

    public void testClass() {
        inClass.Test();
    }

}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        System.out.println("외부 클래스 사용하여 내부 클래스 기능 호춡");
        outer.testClass();
    }
}
// 출력값
외부 클래스 사용하여 내부 클래스 기능 호출
Outer num = 1(외부 클래스의 인스턴스 변수)
Outer sNum = 2(외부 클래스의 정적 변수)

인스턴스 내부 클래스는 외부 클래스의 내부에 위치한다.

private접근 제어자를 사용하고 있음에도 내부에서 외부 클래스의 인스턴스 변수와 정적 변수에 각각 접근하여 해당 값을 사용하고 있다.

반드시 외부 클래스를 생성한 이후에 사용해야 한다. -> 정적 변수와 정적 메서드는 인스턴스 내부 클래스에서 선언 불가

 

정적 내부 클래스

static 키워드 사용

외부 클래스의 존재와 무관하게 정적 변수를 사용할 수 있다.

public class Main {
    public static void main(String[] args) {
        Outer.StaticInClass a = new Outer.StaticInClass(); // 정적 이너 클래스의 객체 생성
        a.test();
    }
}

class Outer {
    private int num = 3; // 내부 클래스의 인스턴스 변수
    private static int sNum = 4;
    void getPrint() {
        System.out.println("인스턴스 메서드");
    }
    static void getPrintStatic() {
        System.out.println("스태틱 메서드");
    }
    static class StaticInClass { // 정적 내부 클래스
        void test() {
            System.out.println("Outer num = " + sNum + "(외부 클래스의 정적 변수)");
            getPrintStatic();
            // num 과 getPrint() 는 정적 멤버가 아니라 사용 불가.
        }
    }
}
// 출력값
Outer num = 4(외부 클래스의 정적 변수)
스태틱 메서드

 

728x90