Study/C#

캐스트보다는 is, as가 더 좋음

13.d_dk 2021. 7. 28. 17:18
728x90
반응형

변수 타입의 형변환이 필요

    • C#은 정적 타이핑을 수행하는 언어
    • 타입 불일치가 발생하더라도 컴파일러가 이를 확인해줌
    • C#은 .NET framework에서 정의해둔 메서드의 원형에 따라 object 타입의 인자를 취하도록 메서드를 정의하는 경우가 있음 (예시 : ThreadPool)
    • 이렇게 전달된 매개변수는 다른 클래스나 인터페이스로 형을 변환한 후 사용
    • 아래는 ThreadPool에서 object 타입의 인자를 받아 형변환 후 사용하는 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
public override void Update(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(ThreadPoolCallbackUpdate, new object[] { e });
}
 
public void ThreadPoolCallbackUpdate(Object sender)
{
    object[] objArr = sender as object[];
 
    DataArgs args = objArr[0as DataArgs;
 
    _updateData(args);
}
cs

 

C#에서 형변환의 방법 : 캐스트와 as 그리고 is

    • 형변환은 캐스팅하는 방법과 as 연산자를 사용하는 방법이 있음
    • 여기에서 is 연산자로 확인하는 과정을 추가하여 방어적인 코드를 작성할 수 있음
    • 형변환은 실패하는 경우를 대비하는 코드들이 필요
    • 여기서 캐스팅을 사용하면 try/catch 구문을 사용하여 예외처리를 통해 방어적인 코드를 작성
    • 반면, as를 사용하는 경우 형변환 실패 시 null을 반환하므로 이를 처리하는 구문을 추가하여 방어적인 코드를 작성할 수 있음
    • 상대적으로 as를 사용한 형변환의 코드가 짧고 읽기에도 간결
    • 캐스팅과 as를 통한 형변환은 각각 아래와 같음
1
2
3
4
5
6
7
8
9
10
11
12
object o = Factory.GetObject();
 
MyType t = o as MyType;
 
if(t != null)
{
    // MyType 타입의 t 객체 사용
}
else
{
    // 오류! 형변환 실패
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
object o = Factory.GetObject();
 
try
{
    MyType t;
    t = (MyType)o;
    // MyType 타입의 t 객체 사용
}
catch
{
    // 오류! 형변환 실패
}
cs

 

캐스트와 as 그리고 is의 사용 시 주의점

    • as를 사용한 형변환을 동작시키기 위해서는 이 객체는 지정한 타입이거나 혹은 지정한 타입을 상속한 타입이어야 하며 나머지는 null을 반환함
    • as는 null을 받을 수 없는 타입에 대한 형변환에 대하여 컴파일되지 않음
    • 이때는 var을 통해 nullable한 타입을 사이에 활용함
    • 캐스팅의 경우 서로 다른 형변환이 가능한 경우가 있는데 이는 숫자 타입에 대한 변환
    • 예를 들어 long을 short으로 변환하는 경우 정보는 잃어버리지만 변환이 가능함
1
2
3
4
5
6
7
object o = Factory.GetValue();
 
var i = o as int ?
if(i != null)
{
    Console.WriteLine(i.Value);
}
cs

 

Reference

  • effective C#; 강력한 C# 코드를 구현하는 50가지 전략과 기법 3판
반응형