코드를 작성하다 보면, 상속 관계를 상당히 많이 사용하게 된다.
is와 as는 두 클래스간의 상속 관계를 알려줌으로써 더욱 안전하게 상속 관계를 사용할 수 있게 해주는 키워드이다.
먼저, is연산자는 인스턴스가 특정 클래스로 캐스팅이 될 수 있는가를 true, false로 알려주는 키워드이다.
using System;
using Test;
namespace Test
{
public class A
{
}
public class B : A
{
}
public class C
{
}
}
class MainClass
{
public static void Main()
{
A newA = new A();
B newB = new B();
C newC = new C();
bool AisB = newA is B;
bool BisA = newB is A;
bool AisC = newA is C;
bool BisC = newB is C;
bool CisA = newC is A;
bool CisB = newC is B;
Console.WriteLine(AisA);
Console.WriteLine(AisB);
Console.WriteLine(BisA);
Console.WriteLine(BisB);
Console.WriteLine();
Console.WriteLine(AisC);
Console.WriteLine(BisC);
Console.WriteLine(CisA);
Console.WriteLine(CisB);
return 0;
}
}
위의 코드를 보자.
B는 A를 상속받고 있기 때문에, 당연히 newB는 A로 업캐스팅이 가능하다.
하지만, A는 B의 부모클래스이기 때문에 처음부터 A로 생성된 인스턴스는 B로 다운캐스팅이 불가능하다.
C는 A,B와 어떠한 상속관계도 아니므로 당연히 서로 캐스팅이 불가능하다.
위의 결과를 보면 아래와 같다.
B는 A로 업캐스팅이 가능하기 때문에 newB is A 만이 true로 표시된 것을 볼 수 있다.
이처럼 인스턴스가 특정 클래스로 캐스팅이 가능한지 여부를 반환해주는 것이 is 연산자이다.
as연산자는 is연산자의 기능과 더불어 실제 캐스팅까지 수행해주는 연산자이다. 아래 코드를 보자.
using System;
using Test;
namespace Test
{
public class A
{
}
public class B : A
{
}
}
class MainClass
{
public static void Main()
{
A newA = new A();
B newB = new B();
B CastedB = newA as B;
A CastedA = newB as A;
if(CastedB == null)
{
Console.WriteLine("CastedB is NULL");
Console.WriteLine();
}
else
{
Console.WriteLine("CastedB is not NULL");
Console.WriteLine();
}
if (CastedA == null)
{
Console.WriteLine("CastedA is NULL");
Console.WriteLine();
}
else
{
Console.WriteLine("CastedA is not NULL");
Console.WriteLine();
}
}
}
실행해보면 아래와 같다.
CastedB는 null을 가리키고 있으며, castedA는 null이 아닌 대상을 가리키고 있다.
즉, 캐스팅이 가능하다면 캐스팅된 대상을 반환해주며, 캐스팅이 안된다면 null을 반환하는 것이다.
is연산자처럼 캐스팅 여부를 파악할 수 있을 뿐더러 실제 캐스팅까지 실행해주는 연산자인 것이다.
'C# > C#' 카테고리의 다른 글
C# - ref, out (0) | 2024.08.13 |
---|---|
C# - const, readonly (0) | 2024.08.10 |
C# - 클래스, 접근 제한 지정자, 프로퍼티 (0) | 2024.07.27 |
C# - C#의 자료형 (0) | 2024.07.24 |
C# - 클래스와 콘솔 출력 (2) | 2024.07.24 |