옵셔널의 값 반환이 왜 Optional(값)의 형태로 출력되는가?

임혜정·2024년 6월 29일
1

위는 어떤 코드 뭉치에 의해서 Optional(3) 으로 출력이 되는가?

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 속성은 그 값이 문자열로 변환될 때 어떻게 보일지를 정의한다.


Optionaldescription 속성

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)가 동작하는 방식

  1. print(num)를 호출하면, numOptional<Int> 타입이다.
  2. print 함수는 num.description을 호출하여 문자열로 변환한다.
  3. num3이라는 값을 가지므로, num.some(3)이다.
  4. Optionaldescription 속성에 따라 Optional(3)이라는 문자열이 반환된다.
  5. print 함수는 이 문자열을 콘솔에 출력한다.

전체 동작 과정

  1. num 변수는 Optional 타입이며, 값으로 3을 가진다.
  2. print(num)가 호출되면, numdescription 속성이 호출된다.
  3. description 속성은 Optional 타입의 값을 확인한다.
  4. 값이 있으므로, description 속성은 Optional(3)이라는 문자열을 반환한다.
  5. print 함수는 이 문자열을 출력한다.

코드 예제

다음은 전체 동작 과정을 간단히 보여주는 코드 예제

var num: Int? = 3
print(num)  // 출력: Optional(3)

이것이 print(num)Optional(3)으로 출력되는 과정이다. Optional 타입은 값이 있거나 없을 수 있는 변수를 나타내며, CustomStringConvertible 프로토콜을 채택하여 값이 출력될 때의 문자열 표현을 정의한다.


이런 식으로 의문을 가질 수 있다는 것부터가 앎의 시작이다. 나는 스스로 호기심이 많다고 생각했는데 이 정도로는 안되겠다라고 생각했다. 더더더더더더더 궁금해해야한다.

profile
오늘 배운걸 까먹었을 미래의 나에게..⭐️

2개의 댓글

comment-user-thumbnail
2024년 7월 1일

퍼가요~

1개의 답글