[Java] Java 중첩 클래스 및 변수 접근

artp·2025년 11월 4일
0

java

목록 보기
32/32
post-thumbnail

Java 중첩 클래스 및 변수 접근

1. private static 변수의 특징

public class NestedOuter {
    private static int outClassValue = 3;
    private int outInstanceValue = 2;

    // 정적 중첩 클래스는 다른 클래스를 단순히 중첩해 둔 것일 뿐임.
    // 쉽게 이야기해서, 둘은 아무런 관계가 없음.
    // 같은 클래스에 있으니, 정적 중첩 클래스에서 외부클래스의 private에 접근할 수 있다는 특징이 있을 뿐임.
    static class Nested {
        private int nestedInstanceValue = 1;

        public void print() {
            // 자신의 멤버에 접근
            System.out.println(nestedInstanceValue);

            // 바깥 클래스의 인스턴스 멤버는 접근할 수 없음 (인스턴스를 모르므로)
//            System.out.println(outInstanceValue);

            // 바깥 클래스의 클래스 멤버에는 접근할 수 있음
            System.out.println(outClassValue);
        }

    }
}

private static int outClassValue와 같은 변수는 다음과 같은 특징을 가집니다.

  • static 키워드:

    • 이 변수는 클래스 변수(Class Variable)로 분류됩니다.
    • NestedOuter 클래스가 JVM의 메서드 영역(Method Area)에 로드될 때 단 한 번 생성됩니다.
    • 따라서 NestedOuter 클래스의 인스턴스(객체)를 생성하지 않고도 NestedOuter.outClassValue와 같이 클래스 이름을 통해 직접 접근할 수 있습니다.
  • private 접근 제어자:

    • 이 변수는 NestedOuter 클래스 내부에서만 접근이 허용됩니다.
    • 여기서 '내부'란 NestedOuter 클래스 자체의 메서드뿐만 아니라, 그 안에 선언된 중첩 클래스(예: static class Nested)도 포함합니다.
    • NestedOuter.java 코드에서 Nested 클래스의 print() 메서드가 outClassValue에 접근할 수 있었던 이유가 바로 이것입니다.

결론: private static 변수는 클래스 외부에서는 접근할 수 없지만, 클래스 내부의 어디서든 객체 생성 없이 접근할 수 있습니다.

2. 정적 중첩 클래스 (Static Nested Class)의 특징

public class NestedOuter {
    private static int outClassValue = 3;
    private int outInstanceValue = 2;

    // 정적 중첩 클래스는 다른 클래스를 단순히 중첩해 둔 것일 뿐임.
    // 쉽게 이야기해서, 둘은 아무런 관계가 없음.
    // 같은 클래스에 있으니, 정적 중첩 클래스에서 외부클래스의 private에 접근할 수 있다는 특징이 있을 뿐임.
    static class Nested {
        private int nestedInstanceValue = 1;

        public void print() {
            // 자신의 멤버에 접근
            System.out.println(nestedInstanceValue);

            // 바깥 클래스의 인스턴스 멤버는 접근할 수 없음 (인스턴스를 모르므로)
//            System.out.println(outInstanceValue);

            // 바깥 클래스의 클래스 멤버에는 접근할 수 있음
            System.out.println(outClassValue);
        }

    }
}
public class NestedOuterMain {
    public static void main(String[] args) {
//        NestedOuter outer = new NestedOuter(); // 필요x
        NestedOuter.Nested nested = new NestedOuter.Nested();
        nested.print();

        System.out.println("nestedClass = " + nested.getClass());
    }
}

static class Nested와 같은 정적 중첩 클래스는 다음과 같은 특징을 가집니다.

  • 바깥 클래스 인스턴스와의 독립성:

    • static 키워드가 붙었기 때문에, 정적 중첩 클래스는 바깥 클래스(NestedOuter)의 특정 '인스턴스'에 종속되지 않습니다.
    • 이는 바깥 클래스의 인스턴스 멤버(예: outInstanceValue)에 직접 접근할 수 없다는 것을 의미합니다. (접근하려면 바깥 클래스의 인스턴스를 명시적으로 전달받아야 합니다.)
    • 단지 바깥 클래스 내부에 선언되어 이름 공간(namespace)만 공유하는 것에 가깝습니다.
  • 객체 생성 방법:

    • 바깥 클래스의 인스턴스 없이 new NestedOuter.Nested()와 같이 바깥 클래스 이름을 통해 직접 생성합니다.
    • 만약 static이 없는 일반 내부 클래스(Inner Class)였다면, NestedOuter outer = new NestedOuter(); outer.new Inner();와 같이 바깥 클래스의 인스턴스를 통해 생성해야 합니다.

결론: 정적 중첩 클래스는 바깥 클래스의 인스턴스와 무관하게 독립적으로 존재하며 생성될 수 있습니다.

3. 지역 클래스 (Local Class)의 특징

public class LocalOuterV1 {
    private int outInstanceVar = 3; // 필드

    public void process(int paramVar) { // 메서드
        int localVar = 1;

        class LocalPrinter { // 지역클래스
            int value = 0; // 지역클래스의 필드

            public void printData() { // 지역클래스의 메서드
                System.out.println("value = " + value);
                System.out.println("localVar = " + localVar);
                System.out.println("paramVar = " + paramVar);
                System.out.println("outInstanceVar = " + outInstanceVar);
            }
        }

        LocalPrinter printer = new LocalPrinter();
        printer.printData();
    } // end of process

    public static void main(String[] args) {
        LocalOuterV1 localOuter = new LocalOuterV1();
        localOuter.process(2);
    }

}

process() 메서드 내부에 선언된 class LocalPrinter와 같은 지역 클래스는 다음과 같은 특징을 가집니다.

  • 스코프(Scope)의 한정:

    • 지역 클래스는 자신이 선언된 메서드 블록 내에서만 유효하며, 그 외부에서는 존재 자체를 알 수 없습니다.
    • 이는 메서드 내부에 선언된 지역 변수(예: int localVar)와 동일한 스코프 규칙을 따릅니다.
  • 접근 제어자 사용 불가:

    • 지역 클래스에는 public, private, protected와 같은 접근 제어자를 사용할 수 없습니다.
    • 그 이유는 접근 제어자가 '외부'에서의 접근을 제어하는 목적인데, 지역 클래스는 이미 스코프 자체가 메서드 내부로 엄격하게 한정되어 있어 '외부'라는 개념이 무의미하기 때문입니다.
    • 마찬가지로 지역 변수에도 접근 제어자를 붙이지 않는 것과 동일한 이유입니다.

결론: 지역 클래스는 스코프가 메서드 내부로 한정되어 있으므로, 외부에서의 접근을 제어하는 접근 제어자가 필요 없으며 사용할 수도 없습니다.

profile
donggyun_ee

0개의 댓글