기본 (The Basics) - 숫자 타입 변환 (Numeric Type Conversion)

00yhsp·2024년 3월 29일

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

외부 소스에서 명시적으로 크기가 지정된 데이터 또는 성능, 메모리 사용, 또는 다른 성능 최적화를 위해 특별히 필요한 경우에만 다른 정수타입을 사용해야 한다.
이러한 상황에서 명시적인 크기의 타입을 사용하면 실수로 인한 값 초과를 포착하고 사용 중인 데이터의 특성을 알 수 있다.

정수 변환 (Integer Conversion)

정수를 저장할 수 있는 상수 또는 변수의 숫자 범위는 각 숫자 타입에 따라 다르다.
Int8 상수 또는 변수는 -128과 127 사이 숫자를 저장할 수 있는 반면,
UInt8 상수 또는 변수는 0과 255 사이의 숫자를 저장할 수 있다.
크기가 지정된 정수 타입의 상수 또는 변수에 맞지 않는 숫자는 컴파일 타임에 오류가 발생한다.

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

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

특정 숫자 타입을 다른 숫자 타입으로 변환하려면 기존값으로 원하는 타입의 새 숫자를 초기화한다.
아래 예제에서 상수 twoThousand는 UInt16 타입인 반면 상수 one은 UInt8 타입이다.
두 상수는 타입이 다르기 때문에 직접 더할 수 없다.
그래서 이 예제에서는 UInt16(one)을 호출하여 one의 값을 UInt16으로 초기화하여 새로운 값을 사용한다.

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

양쪽의 타입이 UInt16이므로 덧셈은 제대로 동작한다.
출력 상수(twoThousandAndOne)는 두 UInt16 값을 더하므로 UInt16 타입으로 추론된다.

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

정수와 부동 소수점 변환 (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

여기서 상수 three는 타입 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에 직접 추가할 수 있다.
    이것의 타입은 컴파일러 실행 시점에서만 추론된다.
profile
iOS Dev

0개의 댓글