본문 바로가기

SWIFT 공식문서 문법 알아보기/01.The Basics

Swift 공식문서 해설 The Basics - Numeric Type Conversion (1-7)

숫자 타입의 변환 (Numeric Type Conversion)

코드에서 정수형 상수나 변수를 사용할 때 양수인 정수만 사용하고 있더라도 범용성이 좋은 Int타입을 사용하는 게 좋습니다. 기본적인 정수형 타입을 모든 상황에서 사용한다는 것은 코드에서 정수형 상수나 변수가 즉시 상호 운용될 수 있고 문자 그대로의 정수 값으로 추론된 유형과 일치합니다. 

다른 정수형 타입(UInt8, Uint16, UInt32, Uint64, Int8, Int16, Int32, Int64)을 쓰는 경우는 오직 작업에서 즉시 특별한 필요가 있을 경우, 외부 소스로부터 명백한 크기의 데이터, 메모리 사용의 성능을 위해서, 기타 필요한 최적화 경우에만 사용합니다. 위와 같은 상황에서 명백한 크기의 타입을 사용할 경우 우연한 오버플로우 값이나 사용 중인 데이터 특성을 문서화하는데 도움을 줍니다.

정수형의 변환 (Integer Conversion)

정수형 상수나 변수의 저장 가능한 범위는 숫자 타입에 따라 다릅니다. Int8의 상수나 변수는-128 ~ 127까지 저장할 수 있고 반면에 Uint8의 상수나 변수는 0~225까지 저장이 가능합니다. 맞지 않는 크기의 상수나 변수의 타입은 코드가 컴파일될 때 오류가 발생합니다. 

 

let cannotBeNegative: UInt8 = -1
// UInt8 cannot store negative numbers, and so this will report an error
let tooBig: Int8 = Int8.max + 1
// Int8 cannot store a number larger than its maximum value,
// and so this will also report an error

 

각각의 숫자 타입은 다른 범위를 저장할 수 있기 때문에 숫자 타입의 변화는 상황에 근거하여 선택해야 합니다. 이런 선택은 숨겨진 변환 오류를 막아주고 코드에서 변환 의도를 명백하게 하는데 도움을 줍니다. 

특정한 하나의 숫자타입을 바꾸기 위해서는 기존의 값을 새롭게 희망하는 숫자로 초기화해야 합니다. 아래의 예시에서 the constant twoThousand는 UInt16인 반면에  상수 one은 UInt8입니다. 그들은 같은 타입이 아니기 때문에 직접 더하는 것이 불가능합니다. 그 대신에 예시는 one의 값으로 초기화된 새로운 UInt16을 만들기 위해 UInt16(one)을 불러 새로운 값을 기존의 값에 대체하였습니다. 

 

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

 

양쪽의 덧셈이 UInt16이 타입이 되었기 때문에 덧셈이 허용됩니다. 결과 상수(twoThousandAndOne)는 UInt16 값의 합이기 때문에 UInt16으로 추론됩니다.

 

*부연설명

다른 정수형 타입뿐만 아니라 문자, 부동형 소수점 모두 같은 방식으로 변환이 가능합니다

ex) String(), Int(), Double()

단 문자열을 Int, Double로 변경할 경우 일반 문자열이나("버스", "택시"), 숫자에 문자열이 섞여(응답하라 1997) 있는 경우는 변환이 안됩니다.

매우 중요한 점은 기존의 타입 값을 변경하는 것이 아닌 기존의 값과 상관없는 새로운 값을 만든 것입니다. 

위 예시처럼 let one: UInt8 = 1 이 UInt16으로 바뀌는 것이 아닌 UInt16(one)이라는 새로운 값이 만들어진 것입니다.

정수형과 부동형 소수점 변환 (Integer and Floating-Point Conversion)

정수형과 부동형 소수점 사이의 숫자 타입 변환은 명확하게 만들어야 합니다.

 

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double

 

상수값 3은 새로운 타입 Double로 변경했고 양쪽의 덧셈은 같은 타입이 되었습니다. 위와 같은 변화가 없었다면 덧셈은 불가능했습니다. 또한 부동형 소수점에서 정수형으로 바꾸는 것도 명확하게 만들어져야 합니다. 정수형 타입은 Double, Float 값으로 초기화해야 합니다. 

 

let integerPi = Int(pi)
// integerPi equals 3, and is inferred to be of type Int

 

부동형 소수점 값은 이러한 방식으로 소수점 자리가 잘린 채로 새로운 정수형으로 초기화됩니다. 이 말은 4.75는 4가, -3.9는 -3이 됩니다.

Note

상수나 변수의 수를 결합하는 규칙은 일반적인 수를 결합하는 법칙과 다릅니다. 일반 값 3과 일반 값 0.14159은 명확한 타입이 없기 때문에 바로 합칠 수 있습니다. 그들의 타입은 컴파일러에 의해 평가되는 지점에서만 추론됩니다.

 

*부연설명

평상시의 사용하는 숫자 규칙과 코딩 내에서 규칙이 다르다는 말