티스토리 뷰
안녕하세요 :) 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 (9) | 2022.04.03 |
---|---|
Swift ) Sequence (1) | 2022.02.05 |
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 |
- WKWebView
- swift delegate
- swift3
- Combine
- UIBezierPath
- actor
- swift array
- np-complete
- github
- Accessibility
- np-hard
- Git
- WidgetKit
- SwiftUI
- swift sort
- 회고
- WWDC
- ios 13
- 제이슨 파싱
- Xcode
- IOS
- swift tutorial
- swift 공부
- 피아노
- fastlane
- FLUTTER
- Swift
- 스위프트
- 스위프트 문법
- iOS delegate
- Total
- Today
- Yesterday