🔥 숫자 타입 변환

544자
8분

Swift에서는 코드의 모든 일반적인 정수 상수와 변수에 대해 Int 타입을 사용하는 것이 좋습니다. 음수가 아닌 것으로 알려진 경우에도 마찬가지입니다. 일상적인 상황에서 기본 정수 타입을 사용하면 정수 상수와 변수가 코드에서 즉시 상호 운용될 수 있고, 정수 리터럴 값에 대해 추론된 타입과 일치하게 됩니다.

다른 정수 타입은 외부 소스의 명시적으로 크기가 지정된 데이터나 성능, 메모리 사용량 또는 기타 필요한 최적화로 인해 특별히 필요한 경우에만 사용하세요. 이러한 상황에서 명시적으로 크기가 지정된 타입을 사용하면 우연한 값 오버플로를 잡아내고 사용 중인 데이터의 특성을 암시적으로 문서화하는 데 도움이 됩니다.

정수 변환

정수 상수나 변수에 저장할 수 있는 숫자의 범위는 각 숫자 타입마다 다릅니다. Int8 상수나 변수는 -128에서 127 사이의 숫자를 저장할 수 있는 반면, UInt8 상수나 변수는 0에서 255 사이의 숫자를 저장할 수 있죠. 크기가 지정된 정수 타입의 상수나 변수에 맞지 않는 숫자는 코드를 컴파일할 때 오류로 보고됩니다.

let cannotBeNegative: UInt8 = -1
// UInt8은 음수를 저장할 수 없으므로 오류가 발생합니다.
let tooBig: Int8 = Int8.max + 1
// Int8은 최댓값보다 큰 숫자를 저장할 수 없으므로 오류가 발생합니다.
swift

각 숫자 타입마다 저장할 수 있는 값의 범위가 다르기 때문에 숫자 타입 변환을 사례별로 선택해야 합니다. 이러한 선택적 접근 방식은 숨겨진 변환 오류를 방지하고 코드에서 타입 변환 의도를 명확히 하는 데 도움을 줍니다.

특정 숫자 타입을 다른 타입으로 변환하려면 기존 값으로 원하는 타입의 새 숫자를 초기화하면 됩니다. 아래 예제에서 상수 twoThousandUInt16 타입이고, 상수 oneUInt8 타입입니다. 타입이 같지 않기 때문에 직접 더할 수 없어요. 대신 이 예제는 one의 값으로 초기화된 새로운 UInt16을 생성하기 위해 UInt16(one)을 호출하고, 원래 값 대신 이 값을 사용합니다.

let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
swift

이제 덧셈의 양쪽이 모두 UInt16 타입이므로 덧셈이 허용됩니다. 출력 상수(twoThousandAndOne)는 두 개의 UInt16 값의 합이므로 UInt16 타입으로 추론됩니다.

SomeType(ofInitialValue)은 Swift 타입의 이니셜라이저를 호출하고 초기 값을 전달하는 기본적인 방법입니다. 내부적으로 UInt16UInt8 값을 받아들이는 이니셜라이저를 가지고 있으므로, 이 이니셜라이저를 사용하여 기존 UInt8에서 새로운 UInt16을 만드는 것이죠. 그러나 여기에는 어떤 타입이든 전달할 수는 없습니다. UInt16이 이니셜라이저를 제공하는 타입이어야 합니다. 새로운 타입(자신만의 타입 정의 포함)을 받아들이는 이니셜라이저를 제공하도록 기존 타입을 확장하는 것은 Extensions에서 다룹니다.

정수와 부동 소수점 변환

정수 타입과 부동 소수점 숫자 타입 간의 변환은 명시적으로 이루어져야 합니다.

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi는 3.14159이고, Double 타입으로 추론됩니다.
swift

여기서 상수 three의 값은 Double 타입의 새로운 값을 생성하는 데 사용되므로, 덧셈의 양쪽이 모두 같은 타입이 됩니다. 이 변환이 없다면 덧셈이 허용되지 않을 거예요.

부동 소수점에서 정수로의 변환도 명시적으로 이루어져야 합니다. 정수 타입은 Double 또는 Float 값으로 초기화될 수 있습니다.

let integerPi = Int(pi)
// integerPi는 3이고, Int 타입으로 추론됩니다.
swift

이런 식으로 새로운 정수 값을 초기화하는 데 사용될 때 부동 소수점 값은 항상 잘립니다. 즉, 4.754가 되고, -3.9-3이 됩니다.

참고

숫자 상수와 변수를 결합하는 규칙은 숫자 리터럴에 대한 규칙과 다릅니다. 리터럴 값 3은 리터럴 값 0.14159에 직접 더할 수 있는데, 이는 숫자 리터럴 자체에 명시적인 타입이 없기 때문입니다. 숫자 리터럴의 타입은 컴파일러가 평가하는 시점에만 추론됩니다.

이렇게 Swift에서는 숫자 타입 간의 변환을 명시적으로 처리해야 합니다. 이를 통해 의도하지 않은 타입 변환으로 인한 오류를 방지하고, 코드의 의도를 명확히 할 수 있습니다. 상황에 맞는 적절한 숫자 타입을 사용하고, 필요할 때는 명시적인 타입 변환을 통해 안전하고 예측 가능한 코드를 작성할 수 있겠죠?

그럼 Swift의 숫자 타입 변환을 적극 활용하여 다양한 상황에 맞는 코드를 작성해 보시기 바랍니다!