안녕하세요. 박민성입니다. 🤗
오늘은 C#에 is, as, 명시적 캐스팅에 대해서 글을 쓰고자 합니다. 🤔
이것 또한 그냥 겉핥기 식으로 알고 있었는데여 더 자세히 알아보기 위해서
이 주제를 토대로 글을 쓰고자 합니다.
1. 명시적 캐스팅
object val = "Hello";
string text = (string)val;
직접 대상 타입을 지정해서 변환하는 방식입니다.
실제 객체가 string이면 정상적으로 변환이 가능합니다.
하지만 실제 타입이 다르면 실행 중 예외가 발생합니다.
object val = 10;
string text = (string)val; // InvalidCastException
명시적 캐스팅은 해당 객체가 확실히 그 타입이라고 알고 있을 때이어야 사용할 수 있습니다.
2. as 연산자
string text = val as string;
as는 변환에 성공하면 변환된 참조를 반환하고 실패하면 예외 대신 null을 반환합니다.
object val = "Hello";
string text = val as string;
Console.WriteLine(text); // Hello
실패하는 경우에는
object val = 10;
string text = val as string;
Console.WriteLine(text == null); // true
요런식으로 null검사를 함께 사용합니다.
as는 일반적으로 참조 형식이나 nullable 값 형식에 사용합니다.
object value = 10;
// int number = value as int; // 컴파일 오류
int? number = value as int?; // 가능
3. is 연산자
object val = "Hello";
bool result = val is string;
Console.WriteLine(result); // true
is는 객체가 특정 타입인지 확인해서 bool을 반환합니다.
if (val is string)
{
string text = (string)val;
Console.WriteLine(text.Length);
}
타입 확인 후 다시 캐스팅하는 방법도 있지만
if (value is string text)
{
Console.WriteLine(text.Length);
}
전에 배웠던 패턴 매칭을 사용해서 검사와 변수 생성을 동시에 할 수 있습니다.
4. 상속 관계에서도 사용 가능
public class Animal
{
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine("멍멍");
}
}
Animal animal = new Dog();
변수의 선언 타입은 Animal이지만 실제 객체는 Dog입니다.
여기서
명시적 캐스팅은
Dog dog = (Dog)animal;
dog.Bark();
as는
Dog dog = animal as Dog;
if (dog != null)
{
dog.Bark();
}
is는
if (animal is Dog dog)
{
dog.Bark();
}
이런식으로 다 가능합니다. (하지만 이런 상황에서는 is가 가장 좋겠죠?)
5. is는 정확히 같은 타입만 확인할까요?
아닙니다. 해당 타입으로 호환 가능한지도 확인합니다.
Dog dog = new Dog();
Console.WriteLine(dog is Dog); // true
Console.WriteLine(dog is Animal); // true
Console.WriteLine(dog is object); // true
Dog는 Animal을 상속하고 모든 타입은 object와 호환되므로 모두 true입니다.
이런식으로 is는 호환 가능한 타입들도 true를 반환합니다.
이상으로 C# is, as, 명시적 캐스팅에 대해서 알아보았는데요~!
유니티 개발하면서 추상클래스 사용할 때 많이 사용해봤는데여 이렇게 글을 작성해보면서
또 리마인드도 되고 짜짤짜짤한 것들도 알게되었습니다. ☺️
오늘은 살짝.... ? 알찬 하루였습니다.
내일은 더욱 알차게 보내고 작성해보도록 하겠습니다.
봐주셔서 감사합니다. ☺️