C#/클래스와 객체지향

C# 클래스와 객체지향 - 15. 섀도잉과 하이딩

tita 2024. 5. 28. 22:16

변수에 같은 이름을 사용하면 이름 사이에 충돌이 발생하게 됩니다. 이러한 것을 이름 재사용이라 부르면 다음과 같은 종류가 있습니다.

  • 오버로딩(Overloading)
  • 오버라이딩(Overriding)
  • 섀도잉(Shadowing)
  • 하이딩(Hiding)

하나씩 알아보도록 하겠습니다.

 

 

[섀도잉]

Class Program
{
    public static int number = 01;
    
    static void Main(string[] args)
    {
        int number = 20;
        Console.WrtieLine(number);
    }
}

/*
[실행 결과]
20
*/

 

C언어 기반의 프로그래밍 언어의 대부분은 변수 이름이 겹칠 때 자신과 가장 가까운 변수를 사용하게 되어 있습니다.

이렇게 특정한 영역에서 이름이 겹쳐서 다른 변수를 가리는 것을 섀도잉(Shadowing)이라 표현합니다.

 

 

 

 

 

[하이딩]

부모 클래스와 자식 클래스 사이 동일한 이름으로 멤버를 만들면 하이딩(Hiding)이라 표현합니다.

 

변수 하이딩과 메서드 하이딩에 대해 알아보도록 하겠습니다.

 

<변수 하이딩>

class Program
{
    class Parent
    {
        public int variable = 123;
    }
    
    class Child : Parent
    {
        public string variable = "shadowing";
    }
    
    static void Main(string[] args)
    {
        Child child = new Child();
        Console.WriteLine(child.variable);
    }
}

/*
[실행 결과]
shadowing
*/

 

이전과 마찬가지로 자신과 가장 가까운 것을 사용하게 됩니다. 이렇게 하이딩을 사용하게되면 정상적인 상속을 막을 수 있게 됩니다.

여기서 만약 부모의 int 자료형을 사용하고 싶다면 부모로 자료형을 변환하고 사용하면 됩니다.

static void Main(string[] args)
{
    Child child = new Child();
    Console.WriteLIne(((Parent) child).variable);
}

 

 

 

<메서드 하이딩>

class Program
{
    class Parent
    {
        public void Method()
        {
            Console.WriteLine("부모의 메서드");
        }
    }
    
    class Child : Parent
    {
        public void Method()
        {
            Console.WriteLine("자식의 메서드");
        }
    }
    
    static void Main(string[] args)
    {
        Child child = new Child();
        child.Method();
        ((Parent)child).Method();
    }
}

 

이런 식으로 코드를 작성하면 정상적으로 작동합니다. 하지만 개발 환경을 보면 'Child.Method()는 상속된 Parent.Method() 멤버를 숨깁니다. 숨기려면 new 키워드를 사용하십시오' 라는 문구가 뜹니다.

이 말은 Method() 메서드가 하이딩 되었다는 말입니다.

 

다음 장에서 살펴보도록 하겠습니다.