프로그래밍 언어/파이썬

__repr__, __str__의 차이점

hyeseong-dev 2024. 3. 20. 15:20

__repr____str__는 파이썬에서 객체를 문자열로 표현하기 위해 사용되는 두 가지 매직 메소드입니다. 이 둘은 비슷해 보일 수 있지만, 사용 목적과 호출되는 상황에서 차이가 있습니다.

__repr__ 메소드:

  • __repr__의 주 목적은 객체의 공식적인 문자열 표현을 제공하는 것입니다. 이 문자열은 가능한 한 해당 객체를 정확하게 나타낼 수 있어야 합니다. 이상적으로는, __repr__에 의해 반환된 문자열을 사용하여 해당 객체를 재생성할 수 있을 정도로 정확해야 합니다(예: eval(repr(object)) == object).
  • __repr__는 주로 개발자가 사용하며, 디버깅과 로깅에서 유용하게 활용됩니다.
  • 파이썬 인터프리터에서 객체를 단독으로 평가했을 때 보이는 결과는 __repr__ 메소드에 의해 반환된 문자열입니다.
  • 객체의 __str__ 메소드가 구현되어 있지 않은 경우, 파이썬은 __repr__을 대신 호출합니다.

__str__ 메소드:

  • __str__의 목적은 객체의 "비공식적인" 또는 "출력하기 쉬운" 문자열 표현을 제공하는 것입니다. 이는 일반 사용자가 이해하기 쉬운 형태로 되어야 합니다.
  • __str__print() 함수나 str() 내장 함수가 호출될 때 사용됩니다.
  • __str__의 구현은 객체를 사람이 읽기 편한 형태로 표현하는 데 중점을 둡니다.

차이점 요약:

  • __repr__은 객체의 개발자 친화적인 표현을 제공하며, 이상적으로는 객체의 정확한 표현을 나타냅니다. __repr__의 결과는 객체를 재생성하는 데 사용할 수 있는 정도로 정확해야 합니다.
  • __str__은 객체의 사용자 친화적인 표현을 제공하며, 최종 사용자가 읽기 쉬운 형태로 정보를 출력하는 데 사용됩니다.
  • __str__이 구현되어 있지 않으면 __repr__이 대체로 사용되며, 객체를 문자열로 표현할 필요가 있을 때 언제나 __repr__은 호출될 수 있습니다.

일반적으로, 모든 클래스에 __repr__을 구현하는 것이 좋으며, 사용자에게 보다 친숙한 문자열 표현이 필요할 때 __str__을 추가로 구현합니다.

코드 예시

아래는 __repr____str__ 매직 메소드를 사용하는 간단한 파이썬 코드 예시입니다. 이 코드는 Person 클래스를 정의하고, 두 메소드의 차이점을 보여주기 위해 각각을 구현합니다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        # 객체를 정확하게 표현하며, 가능하면 이 문자열을 사용해 동일한 객체를 재생성할 수 있어야 함
        return f"Person('{self.name}', {self.age})"

    def __str__(self):
        # 사용자가 읽기 쉬운 형태로 객체를 표현함
        return f"{self.name} is {self.age} years old."

# Person 객체 생성
person = Person("John Doe", 30)

# __repr__ 메소드 호출: 대화형 인터프리터나 repr() 함수 사용 시
print(repr(person))  # 출력: Person('John Doe', 30)

# __str__ 메소드 호출: print() 함수 또는 str() 함수 사용 시
print(person)  # 출력: John Doe is 30 years old.

설명:

  • __init__ 메소드는 Person 클래스의 객체가 생성될 때 이름과 나이를 초기화합니다.
  • __repr__ 메소드는 Person 객체의 개발자 친화적인 표현을 제공합니다. 이 예제에서는 Person 객체를 재생성할 수 있는 파이썬 표현식을 문자열로 반환합니다. 이 방식은 디버깅과 로깅에 유용하게 사용될 수 있습니다.
  • __str__ 메소드는 Person 객체를 사용자 친화적인 방식으로 표현합니다. 이는 최종 사용자가 객체에 대해 읽을 때 직관적으로 이해할 수 있는 형태로 정보를 제공합니다. print(person)을 호출하면 이 메소드가 사용됩니다.

이 예시는 __repr____str__이 어떻게 다르게 사용될 수 있는지를 보여줍니다. 일반적으로, __repr__은 개발자를 위한 것이며, __str__은 최종 사용자를 위한 것입니다.