debugPrint와 CustomDebugStringConvertible에 대해

Choooose·2023년 5월 10일
0

Swift

목록 보기
4/5

이번 5월 iOS 원티드 프리 온보딩을 들으면서 CustomDebugStringConvertible 프로토콜에 대해 알게 되었는데
생각보다 활용도가 높고 debugPrint 라는 함수도 알게되어 정리를 하게 되었다.

debugPrint와 print


우리가 기존에 쓰던 print문은 print문 내의 우리가 예상하는 출력 결과를 출력한다.

예를 들어

print("hello")

라면 결과값은 hello 를 예상하고 출력하는 것이며 출력 결과 또한 같다.

그러나 debugPrint는 우리가 생각하는 것보다 많은 정보를 출력할때 즉, 디버깅할 때의 용도로 사용하기 위한 print문이라고 할 수 있다.

예를 들어

debugPrint("hello")

같은 값을 출력했을때 결과값은 hello가 아닌 "hello" 가 출력되게 된다.

또 다른 예시로 아래와 같은 범위를 출력할때

var numbers = 1...5

위와 같이 print문은 1…5 의 변수 범위 자체를 출력하고

debugPrint문은 1…5 ClosedRange 라는 범위의 정보까지를 출력하는 것을 확인할 수 있다.

따라서 디버깅 시에는 debugPrint 문을 활용하면 출력되는 내용뿐만 아니라 내용의 성질, 정보까지도 출력할 수 있어 더욱 효과적이다.

또한 debugPrint는 일반 print문과 마찬가지로

separatorterminator를 파라미터로 가지고 있으며 활용할 수 있다.


CustomDebugStringConvertible과 CustomStringConvertible


이 글을 쓰게 된 계기이자 debugPrint에 대해 알게된 계기? 이다.


먼저 두 프로토콜의 역할은

특정 객체를 원하는 문자열로 변경하여 반환하게 해준다.

라고 한 마디로 정리할 수 있다.

예를 들어

위와 같은 구조체 객체를 출력하면 아래처럼 구조체 객체 자체가 출력되지만

CustomStringConvertible 프로토콜을 선언하고
description 연산 프로퍼티에서 원하는 문자열 값을 리턴하도록 하면

이때 description이라는 연산 프로퍼티를 필수로 구현하여 리턴될 문자열을 정의하도록 해야한다.

또한 CustomDebugStringConvertible의 경우 description 이 아닌 debugDescription 이라는 연산 프로퍼티를 구현하며 방식은 위와 같다.

객체를 출력했을 때 개발자가 직접 지정한 문자열을 출력하는 것을 확인할 수 있다.


그렇다면 `CustomDebugStringConvertible` 과 `CustomStringConvertible` 은 어떻게 다른 것일까?

debugPrintprint를 봤다면 알겠지만 차이점은

두 프로토콜을 동시에 채택했을 때 debugPrint 에서만 CustomDebugStringConvertible 프로토콜을 통해 반환한 문자열이 출력된다.

또한 print에서만 CustomStringConvertible 프로토콜을 통해 반환한 문자열이 출력된다.

따로 쓰게되면 상관없이 출력된다.

여기서 조금 신기한 점은 “debugPrint : 5 입니다.” 라는 문자열이라는 정보가 포함된 출력을 예상하였는데 일반 print 문과 같다는 점이었다.

공식문서에서 찾아본 바로는

명확하게 나오지는 않았지만
CustomDebugStringConvertible의 목적이 디버깅 문자열을 반환하기 위한 목적이기 때문에 일반 문자열과는 다르게 디버깅 타입을 정의하는 것이 아닌 이미 구현된 디버깅 문자열을 그대로 출력하기 때문이다.

따라서 일반 문자열이 출력될때 큰 따옴표가 같이 출력되지만(디버깅 문자열) 디버깅 문자열은 이미 디버깅을 위한 문자열이기 때문에 디버깅 문자열 자체만 출력된다.

다시 정리하면

CustomDebugStringConvertible을 통해 반환되는 문자열은 이미 디버깅 문자열이기 때문에 debugPrint를 통해 출력해도 디버깅 정보를 표시하지 않는다.



활용


아래의 프로젝트에서 활용해보았고 PR로 남겨두었다.

https://github.com/TaekH/Wanted_PreOnboarding_MyCreditManager/pull/2


참조


https://developer.apple.com/documentation/swift/debugprint(_:separator:terminator:)/

https://developer.apple.com/documentation/swift/customdebugstringconvertible

https://developer.apple.com/documentation/swift/customstringconvertible

0개의 댓글