[C#] 섀도잉(Shadowing)과 하이딩(Hiding) : 멤버 숨김의 이해
안녕하세요! 이번 포스트에서는 C#의 섀도잉(Shadowing)과 하이딩(Hiding)에 대해 알아보겠습니다. 이 두 개념은 상속 관계에서 부모 클래스의 멤버를 자식 클래스에서 다시 정의할 때 중요한 역할을 합니다.
섀도잉(Shadowing)과 하이딩(Hiding)이란 무엇인가요?
C#에서 섀도잉과 하이딩은 자식 클래스에서 부모 클래스의 멤버(필드, 속성, 메서드 등)를 다시 정의하는 것을 의미합니다. 이를 통해 부모 클래스의 멤버를 자식 클래스에서 가릴 수 있습니다.
하이딩(Hiding)
하이딩은 자식 클래스에서 부모 클래스의 멤버와 동일한 이름을 가진 새로운 멤버를 정의하는 것입니다. 이를 위해 new 키워드를 사용합니다. 하이딩된 멤버는 부모 클래스의 참조를 통해서는 보이지 않고, 자식 클래스의 참조를 통해서만 접근할 수 있습니다.
하이딩 예시
public class BaseClass
{
public void Display()
{
Console.WriteLine("BaseClass Display");
}
}
public class DerivedClass : BaseClass
{
public new void Display()
{
Console.WriteLine("DerivedClass Display");
}
}
class Program
{
static void Main(string[] args)
{
BaseClass baseClass = new BaseClass();
DerivedClass derivedClass = new DerivedClass();
BaseClass baseDerived = new DerivedClass();
baseClass.Display(); // BaseClass Display
derivedClass.Display(); // DerivedClass Display
baseDerived.Display(); // BaseClass Display
}
}
위 예시에서 DerivedClass의 Display 메서드는 BaseClass의 Display 메서드를 하이딩합니다. new 키워드를 사용하여 명시적으로 부모 클래스의 메서드를 숨깁니다. 그러나 BaseClass 타입의 참조를 통해서는 여전히 부모 클래스의 메서드가 호출됩니다.
오버라이딩(Overriding)이란 무엇인가요?
오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것입니다. 이를 통해 부모 클래스의 메서드를 자식 클래스에서 새로운 동작으로 대체할 수 있습니다. 오버라이딩은 부모 클래스의 메서드를 virtual로 선언하고, 자식 클래스의 메서드를 override로 선언하여 수행됩니다.
오버라이딩의 예시
public class BaseClass
{
public virtual void Display()
{
Console.WriteLine("BaseClass Display");
}
}
public class DerivedClass : BaseClass
{
public override void Display()
{
Console.WriteLine("DerivedClass Display");
}
}
class Program
{
static void Main(string[] args)
{
BaseClass baseClass = new BaseClass();
DerivedClass derivedClass = new DerivedClass();
BaseClass baseDerived = new DerivedClass();
baseClass.Display(); // BaseClass Display
derivedClass.Display(); // DerivedClass Display
baseDerived.Display(); // DerivedClass Display
}
}
위 예시에서 DerivedClass의 Display 메서드는 BaseClass의 Display 메서드를 오버라이딩합니다. 부모 클래스의 메서드는 virtual 키워드로 선언되고, 자식 클래스의 메서드는 override 키워드로 재정의됩니다. 따라서 BaseClass 타입의 참조를 통해서도 자식 클래스의 오버라이딩된 메서드가 호출됩니다.
하이딩과 오버라이딩의 차이점
- 하이딩(Hiding):
- new 키워드를 사용하여 부모 클래스의 멤버를 가립니다.
- 부모 클래스의 참조를 통해서 부모 클래스의 멤버에 접근할 수 있습니다.
- 주로 메서드, 속성, 필드에서 사용됩니다.
- 컴파일러 경고가 발생할 수 있으며, 의도적으로 하이딩을 사용함을 명시합니다.
- 오버라이딩(Overriding):
- virtual 키워드와 override 키워드를 사용하여 부모 클래스의 메서드를 재정의합니다.
- 부모 클래스의 참조를 통해서도 자식 클래스의 오버라이딩된 메서드가 호출됩니다.
- 주로 메서드에서 사용됩니다.
- 런타임 다형성을 제공합니다.
섀도잉(Shadowing)
섀도잉은 C#에서 명시적인 키워드 없이도 발생할 수 있는 현상으로, 주로 로컬 변수와 필드 간의 이름 충돌을 말합니다. 특정 블록 내에서 정의된 변수가 블록 외부에 정의된 같은 이름의 변수를 가리는 경우를 말합니다.
섀도잉 예시
public class ShadowExample
{
public int value = 10;
public void ShowValue()
{
int value = 20; // 섀도잉 발생
Console.WriteLine(value); // 20 출력
Console.WriteLine(this.value); // 10 출력
}
}
class Program
{
static void Main(string[] args)
{
ShadowExample example = new ShadowExample();
example.ShowValue();
}
}
위 예시에서 메서드 ShowValue 내에서 선언된 로컬 변수 value는 클래스 필드 value를 섀도잉합니다. 메서드 내에서 value를 참조하면 로컬 변수가 사용되고, this.value를 사용하면 클래스 필드에 접근할 수 있습니다.
섀도잉과 하이딩의 차이점
- 하이딩: 주로 상속 관계에서 발생하며, new 키워드를 사용하여 부모 클래스의 멤버를 가립니다. 자식 클래스의 참조를 통해서만 접근할 수 있습니다.
- 섀도잉: 주로 동일한 범위 내에서 이름 충돌이 발생하며, 명시적인 키워드 없이 로컬 변수가 필드나 다른 변수 이름을 가립니다. this 키워드를 사용하여 가려진 변수에 접근할 수 있습니다.
하이딩의 주의점
하이딩을 사용할 때는 몇 가지 주의할 점이 있습니다:
- 명시적 사용: 하이딩할 때는 new 키워드를 명시적으로 사용하여 의도를 분명히 해야 합니다. 이를 통해 코드의 가독성을 높이고, 실수를 줄일 수 있습니다.
- 부모 클래스의 메서드 호출: 부모 클래스의 메서드를 호출하고 싶다면, 부모 클래스 타입의 참조를 사용해야 합니다.
섀도잉의 주의점
섀도잉은 코드의 가독성을 떨어뜨릴 수 있으므로 주의해서 사용해야 합니다:
- 명확한 변수 명명: 동일한 이름을 피하고, 명확한 변수명을 사용하여 섀도잉을 피합니다.
- 명시적 참조: 필요할 경우 this 키워드를 사용하여 가려진 변수에 명시적으로 접근합니다.
결론
이번 포스트에서는 C#의 섀도잉과 하이딩에 대해 알아보았습니다. 이 두 개념은 상속 관계에서 부모 클래스의 멤버를 자식 클래스에서 다시 정의할 때 중요한 역할을 합니다. 하이딩과 섀도잉을 올바르게 이해하고 사용하면, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다. 추가적인 질문이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요!
'Programming > C#' 카테고리의 다른 글
C# 인덱서(Indexer) 배열과 유사한 접근성 제공 (0) | 2024.06.09 |
---|---|
C# 제네릭 (Generics) 타입의 유연성과 안전성을 동시에 (0) | 2024.06.09 |
C# 다형성 (Polymorphism) 객체지향 프로그래밍의 유연성과 확장성 (0) | 2024.06.09 |
C# 상속(Inheritance) 객체지향 프로그래밍의 핵심 개념 (0) | 2024.06.09 |
C# 값 복사와 참조 복사 데이터 전송의 기본 개념 (0) | 2024.06.09 |