본문 바로가기
Golang/Study

chapter3(3) primitive type - uint and casting and overflow

by 윤원용 2022. 1. 24.

casting은 변수가 표현하는 범위인 type(자료형)을 확장(up casting) 또는 축소(down casting) 하는 작업을 casting이라 한다. java에서는 class 간의 상속 혹은 구현 관계에서도 casting이 적용된다. (Go는 class가 없다. 하지만 구현체가 있으므로 구현체 공부할 때 비슷한 게 나오지 않을까??)
하지만 이전 글에서 말했던 대로 Go는 type의 상하관계가 뭐든 auto casting을 지원하지 않는다. 

 

uint는 사용처는 제한적이다. 왜냐? 변수를 명시적 선언하지 않는 이상 묵시적 선언을 하면 정수인 경우 무조건 int이기 때문에 묵시적 선언 시 casting을 하거나 명시적 선언 시 type을 명시하는 방법뿐이다. 다른 방법으론 int로 표현할 수 없는 양수를 표현할 때 uint를 사용할 것 같다.

uint8과 byte 자료형에 대해 조금 이야기를 해야 하는데 이유는 uint8을 byte로 casting해도 byte이 아닌 uint8이라는 것이다.... (차별받는 byte...)

그럼 byte는 음수를 표현할 수 있냐? 그것 또한 아니다. 

위처럼 코드를 보면 b8 = ui8 부분이 있다. 이 부분은 byte와 uint8이 표현할 수 있는 byte의 크기가 같기 때문에 casting을 할 필요가 없다. 다만 주위 깊게 봐야 하는 부분은 byte type으로 casting 했음에도 불과하고 출력 결과를 보면

byte 불쌍해 ㅠㅠ

이렇듯 uint8만 출력되는 것을 볼 수 있다. 그리고 java의 byte type과 똑같이 생각하고 사용하면 안 되는데 그 이유는 java는 char type이 별도로 존재하고 byte type은 음수를 표현할 수 있기 때문이다. (앞글에서 말함)

깜박하고 byte type에 음수를 집어넣는 경우 어떻게 될까? 

다행히 IDE가 알아서 막아준다. 하지만 casting 관점에서 보면 문제없이 진행할 수 있는데 이럴 경우 발생하는 것이 Overflow다. Overflow는 a라는 변수가 b라는 변수보다 표현할 수 있는 byte가 큰 값(literal)을 저장하고 있을 때 b라는 변수에 casting을 통해 a라는 변수를 대입 시 발생한다.

overflow

이때 a int16 type이고 값은 128인 literal을 저장한 후 b라는 변수에 변수 a를 int8 type으로 casting 하여 대입하면 Overflow다. 간단하게 예시를 들면 어떤 사람이 윗옷 사이즈를 105를 입어야 하는데 95를 입을 때 발생하는 것을 Overflow라 이해해도 괜찮을 것 같다. 

 

★ Overflow를 잘 이해하려면 10진수로 표현하는 숫자를 2진수로 표현할 줄 알아야 한다. ★

Go는 Overflow가 발생 시 Wrap Around가 발생되는데 다음 포스트의 주제이다. ㅃ2~

'Golang > Study' 카테고리의 다른 글

chapter3(5) primitive type - float and complex  (0) 2022.02.01
chapter3(4) primitive type - wrap around  (0) 2022.01.30
chapter3(2) primitive type - boolean and int  (0) 2022.01.23
chapter3(1) variable  (0) 2022.01.19
chapter2(3) go test  (0) 2022.01.18