부모 클래스로 선언된 객체가 실제로 어떤 자식 클래스인지 판별하고, 자식 클래스의 기능을 활용하는 방법에는 여러 가지가 있다. 이 글에서는 대표적인 방법인 is 연산자, as 연산자, 명시적 캐스팅, switch 패턴 매칭, 제네릭을 활용한 변환 방법을 소개한다.
1. is 연산자를 사용한 판별 후 캐스팅
is 연산자를 사용하면 객체가 특정 자식 클래스인지 확인할 수 있으며, 이를 통해 자동으로 캐스팅이 가능하다.
public class Parent { }
public class ChildA : Parent { public void SpecialMethodA() => Debug.Log("ChildA 실행!"); }
public class ChildB : Parent { public void SpecialMethodB() => Debug.Log("ChildB 실행!"); }
void CheckAndUseChild(Parent obj)
{
if (obj is ChildA childA) // ChildA인지 판별 후 자동 캐스팅
{
childA.SpecialMethodA();
}
else if (obj is ChildB childB) // ChildB인지 판별 후 자동 캐스팅
{
childB.SpecialMethodB();
}
else
{
Debug.Log("알 수 없는 타입입니다.");
}
}
- is 연산자를 사용하면 객체의 타입을 판별하면서 동시에 해당 타입으로 캐스팅이 이루어진다.
- if (obj is ChildA childA) 형태를 사용하면 obj가 ChildA 타입일 경우 자동으로 childA로 변환된다.
2. as 연산자를 사용한 캐스팅
as 연산자는 객체를 특정 타입으로 변환하려 시도하며, 변환에 실패하면 null을 반환한다.
void CheckAndUseChild(Parent obj)
{
ChildA childA = obj as ChildA;
if (childA != null)
{
childA.SpecialMethodA();
return;
}
ChildB childB = obj as ChildB;
if (childB != null)
{
childB.SpecialMethodB();
return;
}
Debug.Log("알 수 없는 타입입니다.");
}
- as 연산자는 변환이 실패해도 예외가 발생하지 않고 null을 반환하므로, null 체크를 통해 안전하게 변환 여부를 확인할 수 있다.
- is 연산자에 비해 변환 과정을 분리하여 작성해야 하므로 코드가 다소 길어질 수 있다.
3. 명시적 캐스팅을 사용한 변환
명시적 캐스팅을 사용하면 강제적으로 타입 변환이 가능하지만, 타입이 맞지 않으면 InvalidCastException이 발생할 수 있다.
void CheckAndUseChild(Parent obj)
{
try
{
((ChildA)obj).SpecialMethodA();
}
catch (InvalidCastException)
{
try
{
((ChildB)obj).SpecialMethodB();
}
catch (InvalidCastException)
{
Debug.Log("알 수 없는 타입입니다.");
}
}
}
- (ChildA)obj와 같이 명시적 캐스팅을 사용하면 강제로 타입 변환이 이루어진다.
- 변환할 수 없는 타입일 경우 InvalidCastException이 발생하므로, try-catch를 사용하여 예외 처리를 해야 한다.
4. switch 패턴 매칭을 활용한 판별
C# 7.0 이상에서는 switch 문에서 is 패턴 매칭을 활용하여 특정 타입을 판별할 수 있다.
void CheckAndUseChild(Parent obj)
{
switch (obj)
{
case ChildA childA:
childA.SpecialMethodA();
break;
case ChildB childB:
childB.SpecialMethodB();
break;
default:
Debug.Log("알 수 없는 타입입니다.");
break;
}
}
- switch 문을 사용하면 여러 타입을 처리할 때 코드의 가독성이 향상된다.
- is 연산자를 이용한 방법과 원리는 동일하지만, switch를 활용하면 더욱 직관적인 구조를 만들 수 있다.
최종 정리
| 방법 | 장점 | 단점 |
| is 연산자 | 안전하고 가독성이 좋음 | |
| as 연산자 | null 체크로 안전함 | is보다 코드가 다소 길어짐 |
| 명시적 캐스팅 ((ChildA)obj) | 코드가 짧음 | 잘못된 타입이면 InvalidCastException 발생 가능 |
| switch 패턴 매칭 | 가독성이 높음 | C# 7.0 이상에서만 사용 가능 |
-
- 안전성을 고려한다면 is 연산자를 사용하는 것이 가장 추천되는 방법이다.
- 코드의 가독성을 높이고 싶다면 switch 패턴 매칭을 활용하는 것이 효과적이다.
'소프트웨어 공학 > 코딩' 카테고리의 다른 글
| C#] ReactiveProperty 및 ReactiveCollections 구현 (0) | 2025.03.13 |
|---|---|
| C#,유니티] 제네릭과 상속을 함께 사용하는 방법 (0) | 2025.03.11 |
| 유니티] Attribute [RequireComponent(typeof())] 개요 및 활용법 (0) | 2025.03.07 |
| 유니티] ScriptableObject 알아보기 (0) | 2025.03.06 |
| Async와 Coroutine 비교: 컨트롤 플로우 관점에서의 평가 (0) | 2025.03.04 |