하위 클래스와 내부 클래스의 private 멤버 접근 이해하기

2025. 4. 23. 10:08High Level Programming Language/Learning the Java Language

🧩 자바에서 private 멤버 접근: 상속과 내부 클래스의 관점

자바의 캡슐화(Encapsulation) 개념은 객체지향 프로그래밍의 핵심 요소 중 하나입니다. 이 개념을 이해하기 위해선 private 키워드가 실제로 어떤 제한을 두는지 명확히 알아야 합니다.

이번 글에서는 상속 구조에서 하위 클래스가 상위 클래스의 private 멤버에 접근할 수 있는가, 그리고 내부 클래스(inner class)에서는 어떻게 접근이 가능한가를 코드 예제와 함께 정리해보겠습니다.

 

📌 1. 하위 클래스는 상위 클래스의 private 멤버를 상속하지 않는다

자바에서 private 멤버는 해당 클래스 내부에서만 접근 가능합니다. 하위 클래스에서는 직접 접근할 수 없습니다.

class SuperClass {
    private int secret = 42;
}

class SubClass extends SuperClass {
    public void printSecret() {
        // System.out.println(secret); // ❌ 컴파일 오류 발생
    }
}

🔎 해설:
하위 클래스는 상위 클래스의 private 필드를 직접 상속하거나 접근할 수 없습니다. 이는 캡슐화를 보장하기 위한 자바의 설계 철학입니다.

 

📌 2. public 또는 protected 메서드를 통한 간접 접근

하위 클래스는 상위 클래스에 정의된 getter 메서드를 통해 private 필드에 간접 접근할 수 있습니다.

class SuperClass {
    private int secret = 42;

    protected int getSecret() {
        return secret;
    }
}

class SubClass extends SuperClass {
    public void printSecret() {
        System.out.println("상위 클래스의 비밀: " + getSecret()); // ✅ 간접 접근 가능
    }
}

🔎 해설:
간접 접근을 허용함으로써 private 필드 보호는 유지하면서도 유연한 기능 확장이 가능합니다.

 

📌 3. 내부 클래스(Inner Class)는 외부 클래스의 private 멤버에 직접 접근 가능

내부 클래스는 자신을 감싸고 있는 외부 클래스의 모든 private 멤버에 직접 접근할 수 있습니다.

class Outer {
    private String secret = "외부 클래스의 비밀";

    class Inner {
        void revealSecret() {
            System.out.println(secret);  // ✅ 직접 접근 가능
        }
    }
}

🔎 해설:
내부 클래스는 외부 클래스의 모든 멤버에 접근 가능합니다.
이는 컴파일러가 자동으로 synthetic 메서드를 생성하여 접근 권한을 우회하기 때문입니다.

 

📌 4. 하위 클래스가 상속한 중첩 클래스(Nested Class)를 통해 private 멤버 간접 접근

하위 클래스가 상위 클래스의 중첩 클래스를 상속받으면,
그 중첩 클래스는 상위 클래스의 private 멤버에 접근할 수 있으므로 결과적으로 하위 클래스도 간접 접근이 가능합니다.

class SuperClass {
    private String secret = "슈퍼클래스의 비밀";

    protected class Inner {
        void showSecret() {
            System.out.println("접근된 비밀: " + secret); // ✅ 내부에서 접근 가능
        }
    }
}

class SubClass extends SuperClass {
    public void useInner() {
        Inner inner = new Inner();
        inner.showSecret();  // ✅ 간접 접근
    }
}

🔎 해설:
SubClassInner 클래스를 통해 SuperClassprivate 필드에 접근할 수 있게 됩니다.
이는 자바의 중첩 클래스가 외부 클래스의 private 영역에 접근 가능한 특성을 응용한 예외적 케이스입니다.

 

🧾 정리: 상황별 접근 가능 여부

상황 하위 클래스에서 직접 접근 간접 접근 (메서드 또는 중첩 클래스 활용) 비고
private 필드 직접 접근 ✅ (getter/setter 활용) 캡슐화 보장
내부 클래스에서 private 필드 접근 - 컴파일러가 지원
상위 클래스 중첩 클래스 사용 ✅ (중첩 클래스 내부에서) 중요한 예외 규칙

 

✅ 마무리

자바의 private 접근 제어자는 강력한 캡슐화를 제공하지만,
내부 클래스와 상속받은 중첩 클래스의 존재로 인해 우회적인 접근이 가능합니다.

이러한 특성을 이해하고 적절히 활용하면,
보안을 해치지 않으면서도 유연한 클래스 설계를 할 수 있습니다.