파이썬에서 str()과 repr()은 모두 객체를 문자열로 표현하기 위해 사용되는 메서드입니다. 두 함수는 같은 목적을 가진 것처럼 보이지만, 실제로는 중요한 차이점이 존재합니다.
파이썬 내장 함수인 str(x)를 호출했을 때 어떤 일이 일어나는지 생각해 본 적이 있으신가요? str(x)의 반환 값은 두 가지 메서드에 의해 결정됩니다. 기본적으로는 __str__이 우선 선택되며, 해당 메서드가 정의되어 있지 않으면 __repr__이 대체(fallback)로 사용됩니다.
공식 문서의 정의
먼저 파이썬 공식 문서에서 각 함수를 어떻게 설명하고 있는지 살펴보겠습니다.
>>> help(str)
Help on class str in module builtins:
class str(object)
| str(object='') -> str
| str(bytes_or_buffer[, encoding[, errors]]) -> str
|
| Create a new string object from the given object.
>>> help(repr)
Help on built-in function repr in module builtins:
repr(obj, /)
Return the canonical string representation of the object.
For many object types, including most builtins,
eval(repr(obj)) == obj.예제로 확인하는 차이점
>>> str(123)
'123'
>>> repr(123)
'123'
>>> # 위 결과에서 정수 데이터에는 두 메서드 간 차이가 없음을 알 수 있습니다
>>> # 이제 문자열 데이터를 두 메서드에 적용해 보겠습니다
>>> str('Python')
'Python'
>>> repr('Python')
"'Python'"정수 값에 대해서는 repr()과 str()의 반환 결과가 동일하지만, 문자열의 경우에는 차이가 있습니다. 하나는 격식 있는(formal) 표현이고, 다른 하나는 격식 없는(informal) 표현입니다.
공식 파이썬 문서에 따르면 __str__은 객체의 "비격식적인"(읽기 쉬운) 문자열 표현을 얻는 데 사용되고, __repr__은 객체의 "격식 있는" 문자열 표현을 얻는 데 사용됩니다.
두 표현 방식의 핵심적인 차이는 str 값에 대한 __repr__의 기본 구현이 eval 함수의 인자로 전달될 수 있으며, 그 결과로 유효한 문자열 객체가 반환된다는 점입니다. 즉, eval() 함수는 문자열을 받아 그 내용을 파이썬 코드로 해석하여 실행합니다.
따라서 "'Python'"을 eval에 전달하면 정상적으로 작동합니다. 반면 'Python'을 전달하면 오류가 발생하는데, 이는 Python이라는 이름이 정의되지 않은 변수로 해석되기 때문입니다. 아래 코드를 통해 확인해 보겠습니다.
>>> x = "Python" >>> repr(x) "'Python'" >>> x1 = eval(repr(x)) >>> x == x1 True
반면 __str__의 반환 값을 eval의 인자로 사용하면 실패하게 됩니다.
>>> y = "Python" >>> str(y) 'Python' >>> y1 = eval(str(y)) Traceback (most recent call last): File "<pyshell#51>", line 1, in <module> y1 = eval(str(y)) File "<string>", line 1, in <module> NameError: name 'Python' is not defined
datetime 객체로 보는 또 다른 예제
>>> import datetime >>> now = datetime.datetime.now() >>> str(now) '2019-03-29 01:29:23.211924' >>> repr(now) 'datetime.datetime(2019, 3, 29, 1, 29, 23, 211924)'
위 출력 결과에서 str(now)는 now 객체의 값을 담은 사람이 읽기 좋은 문자열을 생성하는 반면, repr(now)는 now 객체를 다시 만들기 위해 필요한 파이썬 코드를 그대로 반환합니다.
핵심 차이점 정리
| str() | repr() |
|---|---|
| 객체를 읽기 쉽게 만듦 | 객체를 재현할 수 있는 코드를 제공 |
| 최종 사용자를 위한 출력 생성 | 개발자를 위한 출력 생성 |
여러분의 클래스에 __str__과 __repr__을 구현할 때는 위의 차이점을 반드시 고려해야 합니다. 디버깅과 로깅에는 repr()이, 화면에 정보를 보여줄 때는 str()이 적합합니다.