2025. 4. 23. 10:08ㆍHigh 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(); // ✅ 간접 접근
}
}
🔎 해설:SubClass
는 Inner
클래스를 통해 SuperClass
의 private
필드에 접근할 수 있게 됩니다.
이는 자바의 중첩 클래스가 외부 클래스의 private 영역에 접근 가능한 특성을 응용한 예외적 케이스입니다.
🧾 정리: 상황별 접근 가능 여부
상황 | 하위 클래스에서 직접 접근 | 간접 접근 (메서드 또는 중첩 클래스 활용) | 비고 |
---|---|---|---|
private 필드 직접 접근 | ❌ | ✅ (getter/setter 활용) | 캡슐화 보장 |
내부 클래스에서 private 필드 접근 | ✅ | - | 컴파일러가 지원 |
상위 클래스 중첩 클래스 사용 | ❌ | ✅ (중첩 클래스 내부에서) | 중요한 예외 규칙 |
✅ 마무리
자바의 private
접근 제어자는 강력한 캡슐화를 제공하지만,
내부 클래스와 상속받은 중첩 클래스의 존재로 인해 우회적인 접근이 가능합니다.
이러한 특성을 이해하고 적절히 활용하면,
보안을 해치지 않으면서도 유연한 클래스 설계를 할 수 있습니다.
'High Level Programming Language > Learning the Java Language' 카테고리의 다른 글
JavaBean의 Property란? (0) | 2025.04.23 |
---|---|
자바의 오버라이딩과 공변 리턴 타입(Covariant Return Type) 완벽 가이드 (1) | 2025.04.23 |
Lesson: Object-Oriented Programming Concepts (0) | 2024.07.01 |
Lesson: Classes and Objects [Lambda, Enum] (0) | 2024.06.10 |
Lesson: Packages (0) | 2024.06.07 |