일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- stopcoroutine
- 클래스
- OnMouseClick
- 불러오기
- 리액트네이티브
- 마우스
- 훅
- 키보드
- 구독
- 리액트
- 중단
- Unity
- useEffect
- File
- 코루틴
- 오버플로우
- C#
- 유니티
- Explicit Conversion
- 저장
- >.NET
- 팁
- GetKey
- 명시적형변환
- Subscribe
- oveflow
- implicit Conversion
- 암시적형변환
- Fetch
- JSON
- Today
- Total
Log to grow
[C# 기초] 형변환 (암시적, 명시적 형변환, overflow) 본문
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가 일어나는지 주의해야한다.
'PL > C#' 카테고리의 다른 글
[C# 기초] 배열 (선언, 초기화, 인덱스) (1) | 2020.01.24 |
---|---|
[C# 기초] 기본 자료형 (정수형, 실수형, 문자형, 논리형 등) (0) | 2020.01.06 |
[C# 기초] 변수 (변수 선언과 사용법) (0) | 2020.01.03 |
[C# 기초] 토큰 (예약어, 식별자, 리터럴, 연산자, 구분자) (1) | 2020.01.02 |