스위프트에는 다양한 형태의 정수형이 있습니다.
마치 C언어에서 정수형의 크기에 따라 int, long 등으로 사용하는 것과 유사한 것 같네요.
어떤 형태의 정수형이 있는지, 각각이 서로 어떻게 호환 혹은 캐스팅 되는지 알아보겠습니다.
우선 어떤 형태의 정수형의 종류를 살펴보겠습니다.
정수형의 종류
스위프트에서는 사용하는 정수형 타입은
Int
Int8
Int16
Int32
Int64
UInt8
UInt16
UInt32
UInt64
가 있습니다.
다른 언어를 통해 정수형을 먼저 접하셨다면 바로 알겠지만
뒤의 숫자는 사용하는 비트 수,
'U'의 유무는 signed 인지, unsigned인지를 나타냅니다.
즉, Int8 은 부호가 있고 8비트를 이용하여 값을 나타내기 때문에,
표현하는 값의 범위는
-128 ~ 127 까지를 나타냅니다.
UInt8은 부호 없이 8비트를 이용하여 값을 표현하므로,
표현하는 값의 범위는
0 ~ 255 가 됩니다.
자료형 | 범위 | 부호여부 | 크기 |
Int8 | -128 ~ 127 | 부호 있음 | 8 비트 |
Int16 | -32768 ~ 32767 | 부호 있음 | 16 비트 |
Int32 | -2147483648 ~ 2147483647 | 부호 있음 | 32 비트 |
Int64 | -9223372036854775808 ~ 9223372036854775807 |
부호 있음 | 64 비트 |
UInt8 | 0 ~ 255 | 부호 없음 | 8 비트 |
UInt16 | 0 ~ 65535 | 부호 없음 | 16 비트 |
UInt32 | 0 ~ 4264967295 | 부호 없음 | 32 비트 |
UInt64 | 0 ~ 18446744073709551615 | 부호 없음 | 64 비트 |
그렇다면 Int 는 무엇일까요?
Int 는 실행 환경에 크기가 달라지는 자료형입니다.
Int 형은
해당 컴퓨터의 CPU 비트 수에 따라
크기가 달라지게 됩니다.
-> 8비트 컴퓨터 : Int == Int8
-> 16비트 컴퓨터 : Int == Int16
-> 32비트 컴퓨터 : Int == Int32
-> 64비트 컴퓨터 : Int == Int64
따라서 Int 형을 사용하면
CPU 환경에 따라
코드가 변경되어야 할 때
유용하다고 합니다.
정수형 타입 간의 캐스팅
앞서 정수형 타입의 종류를 살펴보았습니다.
이번에는 각 타입을 선언하여 사용하고 있을 때,
다른 타입의 변수에 값을 전달하는 방법을 살펴보도록 하겠습니다.
Int 형의 변수 a 를 선언하고 값 32를 할당하였습니다.
Int 형의 a 를 Int64 형의 b에 할당하려고 하니 오류가 발생합니다.
Int 형을 Int64 형으로 자동으로 바꿔줄 수 없다는 내용입니다.
Int64() 의 생성자를 사용해서 캐스팅하라고 하네요.
마찬가지로 Int8을 Int16으로도 자동으로 변환되지 않습니다.
따라서 다른 사이즈가 크던지 작던지에 관계없이,
다른 타입으로 할당하기 위해서는 캐스팅이 필요하다는 것을 알 수 있습니다.
그렇다면 큰 타입에서 작은 타입으로 보내줄 때,
남는 부분은 어떻게 될지 값이 어떻게 될지 확인해 보겠습니다.
사실 이 부분이 제가 이 글을 쓰는 이유입니다.
저도 궁금했거든요 ㅋㅋㅋㅋ
Int8 의 범위는 -128 ~ 127 이고,
Int16의 범위는 -32768 ~ 32767 였습니다.
그렇다면 Int16 형 30000의 값을 넣고,
Int8로 바꾸어 할당하면 어떻게 변하는지 확인하겠습니다.
코드를 작성하는 단계에서는 오류가 발생이 되지 않네요.
에디터가 확인해줄 수 있는 문제가 아닌 걸까요?
Int8(30000) 은 바로 에러 잡아주던데...
쨌든 이 코드를 실행해주면
넹. 예상대로 에러가 발생합니다.
이 값을 표현하는데 비트가 충분치 않다고 하네요.
앞으로 코드를 짤 때 이런 부분은 조심하도록 해야할 것 같습니다.
무심코 다른 타입으로 캐스팅해서 넣어줬다가,
실행했을 때서야 에러가 발생할 수도 있고,
입력되는 값에 따라 바로 에러를 찾지 못하고 잠재적인 버그가 될 수도 있으니까요.
이번엔 음수 값을 unsigned 한 타입에 넣어보겠습니다.
넵. 이것도 실행단계에서 에러가 발생하네요.
잠재적인 버그가 되지 않도록 항상 경우의 수를 고려하도록 하겠습니다.
어렵진 않지만,
확실하게는 알지 못했던 내용들을 주제로
글을 써보았습니다.
앞으로도 크고 작은 내용들을
그때 그때 공부하면서 게시글을 남겨보도록 하겠습니다.
읽어주셔서 감사합니다.
첨언할 내용이 있다면 남겨주세요.
더 공부하겠습니다ㅎㅎ
'Swift' 카테고리의 다른 글
[Swift] ARC에 대해서 알아보자 (1) | 2021.09.02 |
---|---|
[Swift] Delegate 방식으로 데이터 전달하기 - 예제 (0) | 2021.09.02 |