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


하이딩(Hiding)이란 무엇인가요?

자바에서 하이딩(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: 자식 이름" (메서드 오버라이딩은 런타임에 결정되므로 자식의 메서드 사용)
    }
}

코드 분석

1. Parent 클래스

  • name이라는 String 타입의 인스턴스 변수를 가지고 있습니다.
  • display() 메서드는 자신의 name 변수를 출력합니다.

2. Child 클래스

  • Parent를 상속받습니다.
  • name이라는 String 타입의 인스턴스 변수를 또 선언했습니다.
    → 이것이 바로 하이딩(Hiding)을 발생시키는 부분입니다.
  • display() 메서드를 오버라이딩(Overriding)했습니다.
  • showParentName() 메서드에서는 super.name을 사용하여 부모 클래스의 name 변수에 접근합니다.

3. HidingExamplemain 메서드

  • Parent p1 = new Parent();
    → 부모 객체를 부모 타입으로 참조. 부모 변수와 부모 메서드 사용.

  • Child c1 = new Child();
    → 자식 객체를 자식 타입으로 참조. 자식 변수와 오버라이딩 메서드 사용.

  • Parent p2 = new Child();
    → 다형성으로 자식 객체를 부모 타입으로 참조.
    변수는 부모 변수, 메서드는 자식 메서드 사용.


핵심 정리: 하이딩 vs. 오버라이딩

특징하이딩 (Hiding)오버라이딩 (Overriding)
대상변수(필드)메서드
결정 시점컴파일 시점 (참조 변수 타입에 따라 결정)런타임 시점 (실제 객체 타입에 따라 결정)
목적부모 변수를 자식 변수로 가리는 것부모 메서드의 동작을 자식에서 재정의하는 것
키워드super.변수명으로 부모 변수 접근 가능super.메서드명()으로 부모 메서드 호출 가능

결론

하이딩은 자바에서 변수의 상속과 관련된 특수한 경우입니다.
일반적으로는 변수 하이딩보다는 메서드 오버라이딩을 훨씬 더 많이 사용하고 권장됩니다.
변수 하이딩은 코드를 복잡하게 만들고 혼란을 줄 수 있기 때문에 보통은 피하는 것이 좋습니다.

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글