Programming/swift

[Swift Basic] 숫자 타입 변환 Numeric Type Conversion

유나니 2022. 11. 23. 22:36

Int타입은 음수가 아닌 경우에도 모든 일반적인 정수 상수 및 변수에 대해 사용합니다. 일반적인 상황에서 기본 정수 타입을 사용하는 것은 정수 상수와 변수는 코드에서 즉각적으로 상호 운용이 가능하다는 것을 말합니다. 그리고 정수 리터럴 값에 대해 추론된 타입과 일치한다는 것을 의미합니다.

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

 

정수 변환 Integer Conversion

정수 상수나 변수에서 저장될 수 있는 숫자의 범위는 숫자 타입에 따라 다릅니다. Int8 상수나 변수의 경우 -128과 127 사이의 숫자를 저장할 수 있지만, UInt8 상수나 변수에는 0과 255 사이의 숫자를 저장할 수 있습니다. 범위(크기가 지정된) 밖의 숫자를 상수나 변수에 사용할 경우 컴파일할 때 에러가 나타납니다.

    let cannotBeNegative: UInt8 = -1
    // UInt8은 음수를 저장하지 못합니다. 만약 음수를 저장한다면, 에러를 나타냅니다.
    let tooBig: Int8 = Int8.max + 1
    // Int8은 그것의 최대숫자보다 큰 수를 저장하지 못합니다. 만약 최대값보다 큰 수를 저장한다면 에러를 나타냅니다.

각 숫자의 타입은 다른 법위의 값을 저장할 수 있으므로, 케이스 별로 숫자 타입 변환을 선택해야 합니다. 이 옵트인(opt-in) 접근 방식은 숨겨진 변환 오류를 방지하고 타입 변환 의도를 코드에서 명시적으로 만드는 데 도움이 됩니다.

특정 숫자 타입을 다른 타입으로 변환하려면, 원하는 타입의 새 숫자를 기존 값으로 초기화합니다. 아래의 예에서 상수 twoThousand는 UInt16 타입이고,  상수 1은 UInt8 타입입니다. 동일한 유형이 아니므로 함께 추가할 수 없습니다. 대신 이 예제는 UInt16(one)을  호출해 값 1로 초기화된 새 UInt16을 생성하고 원본 대신 이 값을 사용합니다.

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

이제 양쪽이 이제 UInt16 타입이므로 추가가 허용됩니다. 출력 상수(twoThousandAndOne)은 두 개의 UInt16 값으로 더해졌기 때문에 UInt16으로 추론됩니다.

ㄶSomeType(ofIntitialValue)는 Swift 타입의 초기화를 호출하고 초기값을 전달하는 기본 방법입니다. 뒤에서는 UInt16은 UInt8을 받아들이기 위해 초기화를 하므로 이 초기화는 기존 UInt8에서 새 UInt16로 만드는 데 사용합니다. 어떤 유형도 여기에 전달할 수 없습니다. UInt16이 초기화 프로그램을 제공하는 타입이어야 합니다. 새로운 타입(자기 자신의 타입 정의를 포함하는)을 허용하는 초기화 프로그램을 제공하기 위해 기존 유형을 확장하는 것은 확장(Extentions)에서 다룹니다.

 

 

정수와 부동소수 변환 Integer and Floating-Point Conversion

정수와 부동 소수 사이에 숫자 타입변환을 하기 위해서는 반드시 명시적으로 이루어져야 합니다.

    let three = 3
    let pointOneFourOneFiveNine = 0.14159
    let pi = Double(three) + pointOneFourOneFiveNine
    // pi는 3.14159와 같습니다. 그리고 Double타입으로 추론됩니다.

상수 three의 값은 Double 타입의 새로운 값을 만드는 데 사용되므로 양쪽이 동일한 타입이 됩니다. 이 변환이 없으면 더할 수 없습니다.

부동 소수에서 정수로 변환하기 위해서는 반드시 명시적으로 이루어져야 합니다. 정수 타입은 Double이나 Float 값으로 초기화될 수 있습니다.

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

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

 

NOTE.

숫자 상수와 변수를 합치는 규칙은 숫자 리터럴 규칙과 다릅니다. 리터럴 값 3은 리터럴 값 0.14159에 직접 추가될 수 있습니다. 이는 숫자 리터럴은 명시적인 타입을 갖고 있지 않기 때문입니다. 타입은 컴파일러에 의해 평가되는 시점에만 추론됩니다.