티스토리 뷰

Swift

Literal

Zedd0202 2022. 1. 23. 16:08
반응형

 

안녕하세요 :) Zedd입니다.

오늘은 Literal에 대해서 공부!

 

얼마전에 Literal이 뭔지 아냐는 질문을 받았었는데, 

문자..? < 라고 대답했는데요. 

컴퓨터 분야에서 이 Literal이 어떤 의미인지 정확히 몰랐던 것 같아서 정리해보려고 합니다.

Swift를 예제로 들겠지만, 다른 프로그래밍언어에서도 똑같다고 생각하면 될 듯! 

 

# Literal

Swift 공식문서에서 다음과 같이 정의합니다. 

A literal is the source code representation of a value of a type, such as a number or string.

숫자 또는 문자열과 같은 타입 값(value)의 소스 코드 표현

한마디로 

let x = 42

에서 42를 Literal이라고 할 수 있습니다. 

우리가 42를 딱 봤을 때 어? Int네? 라고 생각하겠지만,

literal은 자체적으로 타입을 가지고 있지 않습니다.

그렇기에 Swift는 literal의 타입을 유추하려고 시도하게 됩니다. (type inference)

예를 들어,

let x: Int8 = 42

위와같은 코드에서 명시적인 타입 명시를 사용하여 42가 Int8임을 추론합니다.

하지만

let x = 42

위와같이 적절한 타입 정보가 없으면 Swift 표준 라이브러리에 정의된 기본 Literal 타입 중 하나라고 추론하게 됩니다.

integer literals -> Int
floating-point literals -> Double
string literals -> String
Boolean literals ->  Bool


이런식으로 말이죠!

let x = 42

위 코드에서 Swift는 integer literals이 들어왔기 때문에 Int로 추론하게 됩니다. 

 

# ExpressibleBy...Literal

integer literals -> Int
floating-point literals -> Double
string literals -> String
Boolean literals ->  Bool


위와 같이 Swift가 Literal을 보고 타입유추가 가능한 이유는 

Int, Double, String, Bool과 같은 primitive type들은 

ExpressibleByIntegerLiteral, ExpressibleByStringLiteral..과 같은 프로토콜을 준수하고 있기 때문입니다.

예를들어, 

let x: Int8 = 42

Int8은 ExpressibleByIntegerLiteral을 준수하고 있기 때문에 정수 Literal 42에 대한 타입으로 사용할 수 있는 것이죠.

이 프로토콜들 덕분에 

let x: String = 42

이런것들이 컴파일에러를 일으키게 되는것이죠!

 

# Custom literal

자 위에서 말했듯이..

literal은 자체적으로 타입을 가지고 있지 않습니다.

그래서 재밌는 일을 할 수 있게 되는데요..

extension Int: ExpressibleByStringLiteral {
    public init(stringLiteral value: String) {
        self = Int(value)!
    }
}

let x: Int = "1"

print(x is Int, x is String) // true, false

Int가 ExpressibleByStringLiteral을 준수하도록 하고, 필수 이니셜라이저를 적절하게 구현해주면

let x: Int = "1"

이런것도 가능해집니다. :D

물론 위와 같이 하려면 반드시 ""안에 숫자가 들어가야겠죠? 

 

반응형

'Swift' 카테고리의 다른 글

Swift 5.6 ) Introduces existential any  (5) 2022.04.03
Swift ) Sequence  (0) 2022.02.05
Literal  (0) 2022.01.23
Swift ) prefix / suffix  (1) 2021.12.01
Swift 5.5 ) Codable synthesis for enums with associated values  (0) 2021.11.18
WWDC 21 ) What‘s new in Swift  (3) 2021.06.11
댓글
댓글쓰기 폼
반응형
Total
4,016,118
Today
610
Yesterday
2,463