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[0] as 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판
반응형
'Study > C#' 카테고리의 다른 글
nameof() 연산자의 활용 (0) | 2021.09.29 |
---|---|
String.Format()을 보간 문자열로 대체하기 (0) | 2021.07.29 |
const보다는 readonly 사용이 권장되는 이유 (0) | 2021.07.27 |
지역변수를 선언할 때는 var를 사용을 권장하는 이유 (0) | 2021.07.19 |
ThreadPool 사용 예시 (0) | 2021.05.28 |