Log to grow

[C# 기초] 형변환 (암시적, 명시적 형변환, overflow) 본문

PL/C#

[C# 기초] 형변환 (암시적, 명시적 형변환, overflow)

kkkrrr 2020. 1. 6. 19:58

1. 형변환

어떤 자료형으로 선언된 변수를 다른 자료형으로 변환하는 것을 형변환이라고 한다. 이 때, 코드에 직접 변환 될 자료형을 입력해야 하는 것을 '명시적 형변환'이라고 하고, 변환 될 자료형을 입력하지 않아도 되는 형변환을 '암시적 형변환'이라고 한다.

 

 

2. 암시적 형변환

암시적 형변환은 작은 범위의 자료형에서 넓은 범위의 자료형으로 변환할 때 일어난다. 예를 들어, int 타입과 long 타입을 비교해보자.

int 타입보다 long 타입이 더 넓은 범위의 정수를 담을 수 있다. 따라서, int 타입으로 선언된 변수는 아래와 같이 long 타입으로 선언된 변수로 변환될 수 있다.

 

int a = 1;
long b = a;

 

하지만 반대의 경우는 어떨까? long 타입으로 선언된 변수는 int 타입 변수에 담길 수 없다. long 타입으로 선언된 a에 할당된 메모리는 b 변수에 할당된 메모리보다 크기 때문이다. 작은 그릇에 큰 그릇을 담을 수 없는 것과 같다.

 

long a = 1;
int b = a; // 에러 발생

 

발생한 에러 내용을 읽어보면 long 타입을 int 타입으로 암시적 형변환 할 수 없다는 내용이다. 따라서, 이런 경우에는 명시적으로 형변환을 해주어야 한다.

 

3. 명시적 형변환

다시 long 타입으로 선언된 변수를 int 타입 변수에 담는 경우를 생각해보자. 이 경우, long 타입으로 선언되었던 a 변수를 int 타입으로 변경해주어야 한다. 이 때, a 변수 앞에 (int) 를 붙여주어 int 형으로 변환된다는 것을 표시한다.

 

long a = 1;
int b = (int)a;

 

이렇게 하면 long 타입으로 선언되었던 a가 int 타입으로 명시적 형변환 되어 b 변수에 담기게 된다.

 

4. 주의 해야할 점 (overflow)

하지만 모든 값이 위처럼 형변환 될 수 있는 것은 아니다. 위의 경우에서는 long 타입 변수 a에 담겼던 값이 int 타입의 범위인 -2,147,483,648 ~ 2,147,483,647 사이에 있었기 때문에 형변환이 가능했다.

그런데 만약 a에 담긴 값이 이 범위를 벗어나는 값이라면 형변환을 했을 때 어떤 일이 일어날까? 바로 overflow가 발생하게 된다. 예를 들어 아래와 같이 a에 int 타입의 범위를 넘어가는 2147474648을 대입하고 int 형으로 명시적 형변환을 해보자.

 

long a = 2147484648;
int b = (int)a; // b = -2147482648

 

실제로 b의 값을 출력해보면 -2147482648의 값이 출력된다. int 형 타입이 2147482648을 담지 못하고 가장 작은 값인 -2147482648 이 출력된 것이다. 이러한 현상을 overflow라고 한다. 따라서, 명시적 형변환을 할 때에는 overflow가 일어나는지 주의해야한다.

Comments