08. 기본(The Basic) - 숫자 타입 변환과 타입별칭(Numeric Type Conversion & Type Aliases)

이경은·2024년 1월 3일
0

요약

  1. 숫자타입 변환(Type Conversion)
    : 정수는 자동으로 Int타입을 가지지만 특별한 경우에 SomeType(ofInitialValue) 이러한 형태로 값의 범위가 다른 숫자타입으로 변환하여 사용할 수 있습니다.
    • 정수 변환
      - UInt, UInt8, UInt16, Int등 다양한 타입간 연산을 명시적으로 형변환하여 사용할 수 있음.
    • 정수부동소수점 변환
      - 정수 변환과 마찬가지로 형변환을 통해 타입을 바꿀 수 있으나, 부동소수점 -> 정수로 바뀌는 경우 소수점 아래는 버려집니다.
  2. 타입 별칭(Type Aliases)
    • 이미 존재하는 타입을 다른 이름으로 정의하는 것. 외부 소스에서 특정 크기의 데이터로 작업할 때, 상황에 맞는 이름으로 기존 타입을 참조하려는 경우에 유용하게 사용됩니다.



숫자 타입 변환(Numeric Type Conversion)

음수를 사용하지 않더라도 코드에서 상수와 변수가 정수로 지정된 경우 Int타입을 가지게 됩니다. 일반적인 상황에서 기본 정수 타입을 사용하는 것은 정수 타입의 상수와 변수가 코드에서 즉시 상호 운용 가능하며 정수 리터럴 값의 유추된 타입이 일치한다는 것을 의미합니다.

외부 소스에서 명시적으로 크기가 지정된 데이터 또는 성능, 메모리 사용, 또는 다른 성능 최적화를 위해 특별히 필요한 경우에만 다른 정수 타입을 사용해야합니다. 이러한 상황에서 명시적으로 다른 정수 타입을 사용하면 실수로 발생하는 값의 범위가 어떻게 변화하는지 알 수 있습니다.

일반적인 상황에서 Int외 특정한 범위를 가지는 숫자 타입을 사용하는 것은 권장되지 않습니다.(ex Int8, UInt16 등)
해당 변수가 특정 범위를 벗어나서는 안되는 경우에만 특정범위의 숫자 타입을 사용하는 것을 권장합니다.(성능최적화 등)



정수 변환(Integer Conversion)

정수를 저장할 수 있는 상수 또는 변수의 숫자 범위는 각 숫자 타입에 따라 다릅니다. Int8변수는 -128127사이의 숫자를 저장할 수 있는 반면, UInt8변수는 0255사이의 숫자를 저장할 수 있습니다.

크기가 지정된 정수 타입을 벗어나는 숫자가 변수에 지정되면, 컴파일 시 오류가 발생합니다.

let cannotBeNegative: UInt8 = -1	// error : Unsigned Int타입에는 음수를 저장할 수 없습니다.
let tooBig: Int8 = Int8.max + 1		// error : Int8의 최대값을 초과하는 값을 저장할 수 없습니다.

각 숫자 타입은 다른 범위의 값을 저장할 수 있으므로 숫자 타입 변환을 각 타입별로 선택해야합니다. 이 방식은 숨겨진 변환 오류를 방지하고 코드에서 타입 변환 의도를 명시적으로 만드는데 도움을 줍니다.

특정 숫자 타입을 다른 숫자 타입을 변환하려면 기존값으로 원하는 타입의 새 숫자를 초기화합니다. 아래의 예제에서 상수 twoThousandUInt16 타입인 반면에 상수 oneUInt8 타입입니다. 두 상수는 타입이 다르기 때문에 직접 연산할 수 없습니다. 대신 이 예제에서 UInt16(one)을 호출하여 one의 값을 새로운 UInt16으로 초기화하면 기존 값 대신에 새로운 값을 사용합니다.

let twoThousand: UInt16 = 2_000	// UInt16 타입인 twoThousand
let one: UInt8 = 1				// UInt8 타입인 one
let twoThousandAndOne = twoThousand + UInt16(one)	// 같은 UInt16 타입으로 변환해야만 연산이 가능하다.

위처럼 양쪽의 UInt16이므로 덧셈은 이제 제대로 동작합니다. 출력 상수(twoThousandAndOne)은 두 UInt16 값을 더하므로 UInt16 타입으로 추론됩니다.

위의 SomeType(ofInitialValue)는 Swift타입의 초기화를 호출하고, 초기화 값을 전달하는 기본적인 방법입니다. 이전에 UInt16UInt8값을 허용하는 초기화가 있으므로 초기화는 기존 UInt8에서 새로운 UInt16을 만드는데 사용됩니다. 그러나 UInt16이 제공하는 초기화 타입 이외에는 전달할 수 없습니다. 기존 타입을 확장하여 새로운 타입(자신이 정의한 새로운 타입)을 받아들이는 초기화를 제공하는 것은 확장(Extension)에서 다룰 예정입니다.



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

정수와 부동소수점 숫자 타입의 변환은 명시적으로 변환해야 합니다.

let three = 3							// Int 타입으로 추론되는 three
let pointOneFourOneFiveNine = 0.14159	// Double 타입으로 추론되는 pointOneFourOneFiveNine
let pi = Double(three) + pointOneFourOneFiveNine	// Int 타입은 Double로 타입변환한 후에 Double과 연산이 가능하다.

여기서 상수 three는 타입 Double의 새로운 값으로 생성하는데 사용되어 덧셈의 양쪽이 동일한 타입입니다. 이 변환이 없으면 덧셈이 허용되지 않습니다.

부동 소수점을 정수로 변환하는 것 또한 명시적으로 변환해야 합니다. 정수 타입은 Double또는 Float로 초기화 될 수 있습니다.

let integerPi = Int(64)	// Int타입으로 변환하면서 소수점 아래를 '내림'하여 3.14159는 Int타입의 3이 됩니다.

부동소수점 값은 새로운 정수 값으로 초기화할 때, 소수점 아래를 버립니다. 예를들면 Double에서 Int로 타입이 변환될 때 4,754가 되고, -3.9-3이 됩니다.

숫자 상수와 변수를 결합하는 규칙은 숫자 리터럴 규칙과 다릅니다. 리터럴 값 3은 숫자 리터럴에 명시적인 타입이 없으므로 리터럴 값 0.14159에 직접 추가할 수 있습니다. 리러럴 값의 타입은 컴파일러가 실행되는 시점에서만 추론됩니다.


타입 별칭 (Type Aliases)

타입 별칭(Type Aliases)은 이미 존재하는 타입을 다른 이름으로 정의하는 것을 말합니다. 타입 별칭은 typealias 키워드를 사용하여 정의할 수 있습니다.

타입 별칭은 외부 소스에서 특정 크기의 데이터로 작업할 때와 같이 상황에 맞는 이름으로 기존 타입을 참조하려는 경우에 유용합니다.

typealias AudioSample = UInt16

타입 별칭을 정의하면 원래 이름을 사용할 수 있는 모든 위치에서 별칭을 사용할 수 있습니다.

var maxAmplitudeFound = AudioSample.min		// 변수 maxAmplitudeFound에는 UInt16의 최소값인 0이 할당되었습니다.

여기서 AudioSampleUInt16의 별칭으로 정의됩니다. 별칭이므로 AudioSample.min에 대한 호출은 실제로 UInt16.min을 호출하며 maxAmplitudeFound 변수의 초기값은 0이 됩니다.

0개의 댓글