본문 바로가기
Java Study

"섀도잉(Shadowing)"과 "하이딩(Hiding)"

by xogns93 2024. 7. 8.

"섀도잉(Shadowing)"과 "하이딩(Hiding)"

비슷한 개념처럼 보일 수 있지만, 약간의 차이가 있습니다. 두 개념 모두 서브클래스에서 슈퍼클래스의 멤버를 다시 정의하는 경우를 다루지만, 적용되는 멤버 유형과 그 동작 방식에서 차이가 있습니다.

 

섀도잉(Shadowing)

섀도잉은 서브클래스에서 슈퍼클래스의 인스턴스 변수(필드)를 다시 정의할 때 발생합니다. 이 경우, 서브클래스의 필드가 슈퍼클래스의 필드를 "섀도"합니다.

자바에서 클래스의 필드와 메서드의 로컬 변수 간에 이름이 동일할 때, 로컬 변수가 해당 이름을 "섀도우"(shadow)합니다. 즉, 메서드 내에서 동일한 이름을 가진 로컬 변수가 필드를 가리기 때문에, 해당 메서드 내에서는 로컬 변수가 사용됩니다.

class SuperClass {
    public int value = 10;
}

class SubClass extends SuperClass {
    public int value = 20; // 섀도잉 발생
}

public class ShadowingExample {
    public static void main(String[] args) {
        SuperClass superClass = new SuperClass();
        SubClass subClass = new SubClass();

        System.out.println("superClass.value: " + superClass.value); // 10
        System.out.println("subClass.value: " + subClass.value);     // 20

        // 타입을 SuperClass로 캐스팅
        SuperClass castedSubClass = subClass;
        System.out.println("castedSubClass.value: " + castedSubClass.value); // 10
    }
}

하이딩(Hiding)

하이딩은 서브클래스에서 슈퍼클래스의 정적 메서드를 동일한 시그니처로 다시 정의할 때 발생합니다. 이 경우, 서브클래스의 정적 메서드가 슈퍼클래스의 정적 메서드를 "숨깁니다".

상속 관계에서 하위 클래스가 상위 클래스의 필드나 메서드와 동일한 이름의 필드나 메서드를 가질 때 "하이드(hide)" 현상이 발생합니다. 즉, 하위 클래스의 필드나 메서드가 상위 클래스의 필드나 메서드를 숨기게 됩니다. 이 현상은 주로 필드와 정적 메서드(static method)에서 발생합니다.

class SuperClass {
    public static void staticMethod() {
        System.out.println("SuperClass staticMethod");
    }
}

class SubClass extends SuperClass {
    public static void staticMethod() { // 하이딩 발생
        System.out.println("SubClass staticMethod");
    }
}

public class HidingExample {
    public static void main(String[] args) {
        SuperClass.staticMethod(); // SuperClass staticMethod
        SubClass.staticMethod();   // SubClass staticMethod

        // 타입을 SuperClass로 캐스팅
        SuperClass castedSubClass = new SubClass();
        castedSubClass.staticMethod(); // SuperClass staticMethod
    }
}

차이점 요약

  1. 적용 대상:
    • 섀도잉: 인스턴스 변수(필드)에 적용됩니다.
    • 하이딩: 정적 메서드에 적용됩니다.
  2. 동작 방식:
    • 섀도잉: 서브클래스의 인스턴스 변수는 슈퍼클래스의 인스턴스 변수를 "섀도"합니다. 슈퍼클래스 타입으로 캐스팅된 객체는 여전히 슈퍼클래스의 변수를 참조합니다.
    • 하이딩: 서브클래스의 정적 메서드는 슈퍼클래스의 정적 메서드를 "숨깁니다". 정적 메서드는 런타임이 아닌 컴파일 타임에 결정되므로, 슈퍼클래스 타입으로 캐스팅된 객체는 여전히 슈퍼클래스의 정적 메서드를 호출합니다.

결론

  • **섀도잉(Shadowing)**은 서브클래스에서 슈퍼클래스의 인스턴스 변수를 다시 정의할 때 발생합니다. 섀도잉된 변수를 참조할 때는 참조 변수의 타입에 따라 참조되는 변수가 결정됩니다.
  • **하이딩(Hiding)**은 서브클래스에서 슈퍼클래스의 정적 메서드를 다시 정의할 때 발생합니다. 하이딩된 메서드를 호출할 때는 호출하는 변수의 타입에 따라 호출되는 메서드가 결정됩니다.

 

'Java Study' 카테고리의 다른 글

클래스(static) 메서드와 인스턴스 메서드  (0) 2024.07.11
리팩토링(Refactoring)  (0) 2024.07.10
캐스팅 ( Casting )  (1) 2024.07.05
필드(Field)  (0) 2024.06.28
메서드(Method)와 생성자(Constructor)  (0) 2024.06.28