스터디대화중에 하이딩 에 대한이야기 나와 이번에 정리하게 되었습니다.

자바에서 하이딩(Hiding)은 주로 변수(필드)에 적용되는 개념으로,
부모 클래스와 자식 클래스에 같은 이름의 인스턴스 변수가 존재할 때 발생합니다.
이 경우, 자식 클래스에서 해당 이름의 변수를 사용하면 부모 클래스의 변수가 아닌 자식 클래스에 선언된 변수가 사용됩니다.
마치 부모의 변수가 자식의 변수에 의해 "가려지는(hidden)" 것과 같죠.
오버라이딩(Overriding)과 헷갈릴 수 있는데, 오버라이딩은 메서드에 적용되는 개념이고,
하이딩은 변수에 적용되는 개념이라는 중요한 차이가 있습니다.
static 변수에도 적용 가능: 인스턴스 변수뿐만 아니라 static 변수에도 하이딩이 적용될 수 있습니다.아래 예제 코드를 보면서 하이딩이 어떻게 동작하는지 자세히 살펴볼게요.
class Parent {
String name = "부모 이름"; // 부모 클래스의 name 변수
public void display() {
System.out.println("Parent display: " + name);
}
}
class Child extends Parent {
String name = "자식 이름"; // 자식 클래스의 name 변수 (부모의 name을 하이딩)
public void display() {
System.out.println("Child display: " + name);
}
public void showParentName() {
// super 키워드를 사용하여 부모 클래스의 name 변수에 접근 가능
System.out.println("Parent's name from Child: " + super.name);
}
}
public class HidingExample {
public static void main(String[] args) {
// 1. 부모 클래스 타입으로 부모 객체 생성
Parent p1 = new Parent();
System.out.println("p1.name: " + p1.name); // "부모 이름"
p1.display(); // "Parent display: 부모 이름"
System.out.println("---");
// 2. 자식 클래스 타입으로 자식 객체 생성
Child c1 = new Child();
System.out.println("c1.name: " + c1.name); // "자식 이름" (하이딩된 자식 변수 사용)
c1.display(); // "Child display: 자식 이름" (오버라이딩된 자식 메서드 사용)
c1.showParentName(); // "Parent's name from Child: 부모 이름"
System.out.println("---");
// 3. 부모 클래스 타입으로 자식 객체 생성 (다형성)
Parent p2 = new Child();
System.out.println("p2.name: " + p2.name); // "부모 이름" (참조 변수의 타입이 Parent이므로 Parent의 name 사용)
p2.display(); // "Child display: 자식 이름" (메서드 오버라이딩은 런타임에 결정되므로 자식의 메서드 사용)
}
}
Parent 클래스name이라는 String 타입의 인스턴스 변수를 가지고 있습니다. display() 메서드는 자신의 name 변수를 출력합니다.Child 클래스Parent를 상속받습니다. name이라는 String 타입의 인스턴스 변수를 또 선언했습니다.display() 메서드를 오버라이딩(Overriding)했습니다. showParentName() 메서드에서는 super.name을 사용하여 부모 클래스의 name 변수에 접근합니다.HidingExample의 main 메서드Parent p1 = new Parent();
→ 부모 객체를 부모 타입으로 참조. 부모 변수와 부모 메서드 사용.
Child c1 = new Child();
→ 자식 객체를 자식 타입으로 참조. 자식 변수와 오버라이딩 메서드 사용.
Parent p2 = new Child();
→ 다형성으로 자식 객체를 부모 타입으로 참조.
변수는 부모 변수, 메서드는 자식 메서드 사용.
| 특징 | 하이딩 (Hiding) | 오버라이딩 (Overriding) |
|---|---|---|
| 대상 | 변수(필드) | 메서드 |
| 결정 시점 | 컴파일 시점 (참조 변수 타입에 따라 결정) | 런타임 시점 (실제 객체 타입에 따라 결정) |
| 목적 | 부모 변수를 자식 변수로 가리는 것 | 부모 메서드의 동작을 자식에서 재정의하는 것 |
| 키워드 | super.변수명으로 부모 변수 접근 가능 | super.메서드명()으로 부모 메서드 호출 가능 |
하이딩은 자바에서 변수의 상속과 관련된 특수한 경우입니다.
일반적으로는 변수 하이딩보다는 메서드 오버라이딩을 훨씬 더 많이 사용하고 권장됩니다.
변수 하이딩은 코드를 복잡하게 만들고 혼란을 줄 수 있기 때문에 보통은 피하는 것이 좋습니다.