C# [형 변환]
각 자료형은 서로 변환하는 것이 가능할 수도 있고 그렇지 않을 수도 있다.
- 부가적인 코드를 지정하지 않고 자연스럽게 형 변환(Type Conversion)되는 것을 '암시적 변환'이라고 한다.
- 개발자가 명시적으로 형 변환임을 알리는 것을 '명시적 변환'이라고 한다.
암시적 변환
1바이트의 byte 데이터가 2바이트의 short 형에 대입된다면 문제되는 것이 있는가?
- 없다.
byte 데이터에는 0 ~ 255 범위의 수가 담기는데, short 형 데이터에는 -32,768 ~ 32767 범위의 값을 담을 수 있기 때문이다.
이 처럼 범위가 작은 데이터 타입에서 그 값을 충분히 담을 수 있는 큰 타입으로 형 변환하는 것은 컴파일러가 '암시적 변환(Implicit conversion)'으로 간주해서 오류 없이 컴파일 과정을 완료할 수 있다.
하지만 반대로 큰 값을 표현할 수 있는 데이터에서 작은 타입으로 대입하는 경우에는 암시적 변환이 불가능하다.
명시적 변환
2바이트인 ushort 형의 데이터가 동일하게 2바이트인 char 형으로 대입된다면?
이러한 경우 C# 컴파일러는 ushort에서 char로 형 변환을 할 수 없다는 에러와 함께 컴파일을 중단해버린다.
char 타입은 문자만 담도록 지정된 형식이라고 약속되어있기 때문이다. 하지만 알파벳 'A'는 65라는 숫자 값을 가지고 있다는 사실을 개발자가 알고 있고, 이것이 의도한 것이라면 굳이 못하게 막을 이유가 없다.
이처럼 '개발자가 의도한 형 변환'이었음을 컴파일러에게 알려야 할 때 '명시적 변환(Explicit conversion)'이라는 의미로 괄호를 지정한다.
이 밖에도 큰 데이터 타입에서 작은 데이터 타입으로 형 변환할 때도 '명시적 변환'을 사용해야 한다.
4바이트 타입의 int 형에서 2바이트 타입의 short 형으로 값을 대입하면 -32,768 ~ 32767 범위의 값은 정상적으로 변환할 수 있지만, 그 범위를 넘어버리면 개발자가 의도한 값이 나오지 않는다.
이런 상황에서 '암시적 변환'이 가능하다면 무심코 사용한 형 변환 코드 탓에 심각한 오류가 발생하는 프로그램을 만들 가능성이 있으므로 C# 컴파일러는 이런 경우 반드시 '명시적 변환을 하도록 강제하고 있다.
- 형 변환을 다른 말로 캐스팅(casting)이라고도 한다. 그리고 명시적 형 변환을 할 때 타입을 명시하기 위해 사용한 괄호 연산자를 형 변환 연산자(cast operator)라고 한다. ex) short s = (short)n;이라는 코드가 있다면 ()괄호가 바로 형변환 연산자에 해당한다.
Reference
시작하세요! C# 12 프로그래밍 기본 문법부터 실전 예제까지