본문 바로가기
Swift

Swift: print가 값을 출력하는 방법

by songmoro 2025. 7. 13.
728x90
func print(
    _ items: Any...,
    separator: String = " ",
    terminator: String = "\n"
)

print(Character("G"))
print("S")
print(3.14)

 

어떤 값이든 print를 사용하면 값이 출력된다.


모든 타입의 항목을 받아 텍스트 표현으로 출력한다고 하는데,

커스텀 구조체/클래스에서도 CustomStringConvertible을 채택하지 않았는데, 값이 출력되는 원리가 궁금해서 찾아봤다.

 

 


print는 내부적으로 String(describing:)을 호출한 결과와 같다고 한다.

그렇다면 String(describing:)은 무엇이냐?

 

struct Point {
    let x: Int, y: Int
}

let p = Point(x: 21, y: 30)
print(String(describing: p))
// Prints "Point(x: 21, y: 30)"
extension Point: CustomStringConvertible {
    var description: String {
        return "(\(x), \(y))"
    }
}

print(String(describing: p))
// Prints "(21, 30)"

String(describing:)은 말 그대로 객체를 텍스트로 출력해 주는 메서드이다.

 

여기서 드는 의문점은 그럼 String(describing:)은 어떤 방식으로 객체를 텍스트로 전환해주는가? 였는데
아래와 같은 원리로 동작한다고 한다.

 

모든 타입의 인스턴스를 문자열로 변환하는 메서드. 프로토콜 적합성에 따라 다음 방법 중 하나로 문자열 표현을 생성

  • 인스턴스가 TextOutputStreamable 프로토콜을 준수: 빈 문자열 s에 instance.wirte(to: s)를 호출한 결과
  • 인스턴스가 CustomStringConvertible 프로토콜을 준수: instance.description을 호출한 결과
  • 인스턴스가 CustomDebugStringConvertible 프로토콜을 준수: instance.debugDescription을 호출한 결과
  • 그 외에는 Swift 표준 라이브러리에 의해 자동으로 제공

 

print가 이러한 방식으로 동작한다고 하면, dump는 어떠한 방식인가?

 

 

dump는 출력을 위해 mirror를 사용

참고

https://developer.apple.com/documentation/swift/print(_:separator:terminator:)
https://developer.apple.com/documentation/swift/dump(_:name:indent:maxdepth:maxitems:)
https://developer.apple.com/documentation/swift/string/init(describing:)-588wb
https://developer.apple.com/documentation/swift/mirror

728x90