07. 기본(The Basic) - 타입세이프티와 타입추론(Type Safety and Type Inference), 숫자 리터럴(Numeric Literals)

이경은·2023년 12월 31일
0

요약

  1. Swift는 타입세이프(Type-Safe)한 언어.
    • 상수, 변수의 타입과 관련된 오류발생을 막을 수 있음.
  2. Swift는 타입추론(Type Inference)을 제공.
    • 편의성. 모든 상수와 변수에 특정타입을 지정하지 않아도 Swift가 타입을 추론하고 지정해줌.
  3. 숫자 리터럴(Numeric Literals) 사용방법


타입 세이프티(Type Safety)

앞서 설명한 것처럼 Swift는 타입에 엄격한 프로그래밍 언어입니다(=Type Safety). 타입 세이프 언어를 사용하면 코드가 사용할 수 있는 값의 타입을 명확하게 알 수 있습니다. 이로 인해 발생 가능한 실수를 막을 수 있습니다.

let strConts: String = 31	// error : String 타입의 상수에 숫자리터럴을 저장할 수 없습니다.
let intConts: Int = 3.14159	// error : Int(정수)타입의 상수에 부동소수점 리터럴을 저장할 수 없습니다.

Swift는 코드를 컴파일할 때, 타입 검사를 수행하여 일치하지 않는 타입을 오류로 표시합니다. 이를 통해 개발 단계에서 가능한 빨리 오류를 포착하고 수정할 수 있습니다.

타입 검사는 타른 타입의 값으로 작업할 때 오류를 피하는데 도움이 됩니다. 그러나 이것이 선언하는 모든 상수와 변수의 타입을 지정해야한다는 것은 아닙니다. 필요한 값의 특정 타입을 지정하지 않으면 Swift는 적절한 타입으로 타입 추론(Type Inference)을 사용합니다. 타입 추론을 통해 컴파일러는 코드를 컴파일 할 때 제공한 값을 검사하여 특정 식의 타입을 자동으로 추론할 수 있습니다.



타입 추론(Type Inference)

타입 추론 때문에 Swift는 C 또는 Objective-C와 같은 언어보다 타입 선언을 더 적게 할 수 있습니다. 상수와 변수는 여전히 명시적으로 타입을 지정하지만, 타입을 지정하는 많은 동작을 도와줍니다.

타입추론은 상수 또는 변수에 초기값을 선언할 때 아주 유용합니다. 이것은 종종 선언하는 시점에 상수 또는 변수에 리터럴 값(Literal Value)또는 리터럴(Literal)을 지정하여 수행됩니다.(리터럴 값은 아래 예에서 423.14159와 같은 소스코드에 직접 표시되는 값입니다.)

예를 들어 어떤 타입인지 선언하지 않고 새로운 상수를 42의 리터럴 값으로 지정하면 Swift는 정수처럼 보이는 숫자로 초기화했기 때문에 상수가 Int라고 추론합니다.

let meaningOfLife = 42
// meaningOfLife는 Int타입으로 추론됩니다.

Int 타입에 해당하는 숫자(리터럴)를 값으로 지정하면, 별도의 타입선언을 하지 않더라도 Swift는 타입추론을 통해 변수를 Int라고 추론한다.

반대로 어떤 부동소수점 리터럴의 타입인지 선언하지 않으면 Swift는 Double이라고 추론합니다. Swift는 부동소수점 숫자의 타입을 추론할 때, 항상 Float보다 Double을 우선적으로 선택합니다.

let pi = 3.14159
// pi는 Double타입으로 추론됩니다.

표현식에서 정수와 부동소수 리터럴을 결합하면 컨텍스트에서는 Double타입으로 유추합니다.

let anotherPi = 3 + 0.14159
// anotherPi는 Double타입으로 추론됩니다.

3인 리터럴 값에는 명시적인 타입이 없으므로, 같은 항 내에 부동소수점 리터럴이 존재하는 경우 Double이 유추됩니다.

부동소수점 리터럴에는 DoubleFloat보다 높은 우선순위를 가지며, 이항연산자(+, -, *, /)로 구분된 리터럴에도 타입추론은 동일하게 효과를 발휘한다.




숫자 리터럴(Numeric Literals)

정수 리터럴은 아래와 같이 쓸 수 있습니다.

  • 접두사 없는 10진수
  • 0b 접두사로 2진수
  • 0o 접두사로 8진수
  • 0x 접두사로 16진수

아래의 예에서 모든 정수 리터럴은 10진수 17의 값을 가집니다(같은 값).

let decimalInteger = 17
let binaryInteger = 0b10001		// 2진수에서의 17
let octalInteger = 0o21			// 8진수에서의 17
let hexadecimalInteger = 0x11	// 16진수에서의 17

부동소수점 리터럴은 10진수(접두사 없음) 또는 16진수(접두사 0x)일 수 있습니다. 소수점 양쪽에 항상 숫자(또는 16진수)가 있어야 합니다.
10진수는 대문자 또는 소문자 e로 표시되는 지수를 가질 수도 있습니다.
16진수는 대문자 또는 소문자 p로 표시되는 지수를 가질 수도 있습니다.

지수가 x인 10진수는 기본 숫자에 10x10^x가 곱해집니다.

  • 1.25e2는 1.25 x 10², 또는 125.0
  • 1.25e-2는 1.25 x 15 x 2⁻², 또는 0.0125

지수가 x 인 16진수는 기본 숫자에 2ˣ 가 곱해집니다:

  • 0xFp2 는 15 x 2² , 또는 60.0
  • 0xFp-2 는 15 x 2⁻² , 또는 3.75

아래의 예에서 모든 부동 소수점 리터럴은 10진수 12.1875를 가집니다.

let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0

숫자 리터럴은 읽기 쉽게 만드는 추가 포맷을 포함할 수 있습니다. 정수와 부동소수점 모두 추가 0으로 채워질 수 있으며, 가독성을 높이기 위해 밑줄을 포함할 수 있습니다. 어떤 형식도 리터럴의 기본 값에는 영향을 주지 않습니다.

let paddedDouble = 000123.456	// 123.456
let oneMillion = 1_000_000	// 1000000
let justOverOneMillion = 1_000_000.000_000_1	// 1000000.0000001

0개의 댓글