Optional
은 값이 있거나 없을 수 있는 변수. Int?
타입은 정수 값을 가지거나 값이 없을 수 있다. Optional
은 두 가지 상태를 가질 수 있다:
.some(값)
.none
Optional
출력의 동작 원리Optional
변수를 print
함수로 출력할 때, 내부적으로 CustomStringConvertible
이라는 프로토콜이 사용된다. 이 프로토콜은 값이 문자열로 변환될 때 어떻게 보일지를 정의한다. 아래는 디버깅 메세지 출력방식에 대한 코드인데 이로서 description 속성이 어떻게 구현되어 있을 지 추측할 수 있다.
https://github.com/swiftlang/swift/blob/main/stdlib/public/core/Optional.swift
CustomStringConvertible
프로토콜Optional
타입은 CustomStringConvertible
프로토콜을 채택한다. 이 프로토콜은 description
이라는 속성을 가진다. description
속성은 그 값이 문자열로 변환될 때 어떻게 보일지를 정의한다.
Optional
의 description
속성Optional
타입은 CustomStringConvertible
프로토콜을 채택하고 description
속성을 다음과 같이 구현한다.
extension Optional: CustomStringConvertible {
public var description: String {
switch self {
case .none: // 값없다면 : self가 .none이면
return "nil" //nil을 반환
case .some(let wrapped): // 값있다면 : self가 .some(let wrapped)이면
return "Optional(\(wrapped))" // ⭐️⭐️Optional(\(wrapped))의 형태로 반환
}
}
}
❗️위는 개발자들에 의해 추측된 코드이다. Xcode 내부의 프레임워크 코드는 일반적으로 비공개 소스 코드로 구성되어 있어 직접 접근할 수 없기 때문이다.
여기서 wrapped
는 실제 값을 나타낸다.
print(num)
가 동작하는 방식print(num)
를 호출하면, num
은 Optional<Int>
타입이다.print
함수는 num.description
을 호출하여 문자열로 변환한다.num
이 3
이라는 값을 가지므로, num
은 .some(3)
이다.Optional
의 description
속성에 따라 Optional(3)
이라는 문자열이 반환된다.print
함수는 이 문자열을 콘솔에 출력한다.num
변수는 Optional
타입이며, 값으로 3
을 가진다.print(num)
가 호출되면, num
의 description
속성이 호출된다.description
속성은 Optional
타입의 값을 확인한다.description
속성은 Optional(3)
이라는 문자열을 반환한다.print
함수는 이 문자열을 출력한다.다음은 전체 동작 과정을 간단히 보여주는 코드 예제
var num: Int? = 3
print(num) // 출력: Optional(3)
이것이 print(num)
가 Optional(3)
으로 출력되는 과정이다. Optional
타입은 값이 있거나 없을 수 있는 변수를 나타내며, CustomStringConvertible
프로토콜을 채택하여 값이 출력될 때의 문자열 표현을 정의한다.
이런 식으로 의문을 가질 수 있다는 것부터가 앎의 시작이다. 나는 스스로 호기심이 많다고 생각했는데 이 정도로는 안되겠다라고 생각했다. 더더더더더더더 궁금해해야한다.
퍼가요~