파이썬에서 클래스를 사용하는 것은 객체 지향 프로그래밍(OOP)의 핵심입니다. 클래스는 데이터와 그 데이터를 다루는 메소드를 함께 묶어 새로운 타입을 정의합니다. 이를 통해 코드를 더욱 체계적으로 구성하고 재사용할 수 있습니다. 클래스와 관련된 몇 가지 기본 개념을 단계별로 살펴보고, 이해를 돕기 위해 간단한 예제를 제시하겠습니다.
클래스를 정의하려면 class
키워드를 사용합니다. 클래스 이름은 관례적으로 대문자로 시작합니다.
class Dog:
pass
이 코드는 아무 기능도 하지 않는 가장 간단한 클래스를 정의합니다.
__init__
클래스의 인스턴스(객체)가 생성될 때 초기 상태를 설정하기 위해 __init__
메소드를 사용합니다. 이 메소드는 "생성자"로 알려져 있습니다.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
여기서 self
는 객체 자신을 참조하는 변수입니다. name
과 age
는 객체 생성 시 전달되는 파라미터입니다.
클래스에는 데이터를 다루는 함수인 메소드를 추가할 수 있습니다.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print(f"{self.name} says woof!")
bark
메소드는 강아지가 짖는 행동을 시뮬레이션합니다.
클래스를 정의한 후에는 해당 클래스의 인스턴스를 생성하여 사용할 수 있습니다.
my_dog = Dog("Buddy", 5)
print(my_dog.name) # Buddy 출력
print(my_dog.age) # 5 출력
my_dog.bark() # Buddy says woof! 출력
클래스는 다른 클래스로부터 속성과 메소드를 상속받을 수 있습니다. 이를 통해 코드 재사용성을 높일 수 있습니다.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Cat(Animal):
def speak(self):
return f"{self.name} says meow"
class Dog(Animal):
def speak(self):
return f"{self.name} says woof"
cat = Cat("Felix")
dog = Dog("Buddy")
print(cat.speak()) # Felix says meow 출력
print(dog.speak()) # Buddy says woof 출력
이러한 기본 사항을 이해하면 파이썬에서 객체 지향 프로그래밍의 기본을 잘 다룰 수 있게 됩니다. 초보자라면 처음에는 어려울 수 있지만, 다양한 예제와 함께 연습하면서 점차 익숙해질 수 있습니다.
self
의 개념self
는 클래스 내부에서 인스턴스 자기 자신을 참조하기 위해 사용되는 변수입니다. 메서드를 호출할 때, 파이썬은 메서드의 첫 번째 파라미터로 객체 자신을 자동으로 전달합니다. 이 첫 번째 파라미터가 self
입니다. self
를 사용하여 클래스 내의 다른 메서드나 속성에 접근할 수 있습니다.
__init__
메서드__init__
메서드는 클래스의 생성자 함수로, 객체가 생성될 때 자동으로 호출됩니다. 객체의 초기화를 담당하며, 필요한 초기 설정을 수행하고 객체의 초기 상태를 설정합니다.
class Car:
def __init__(self, color, brand):
self.color = color
self.brand = brand
위 코드에서 Car
클래스는 색상(color
)과 브랜드(brand
) 두 개의 속성을 가집니다. 객체를 생성할 때 이 두 속성을 초기화합니다.
__str__
메서드__str__
메서드는 객체를 문자열로 변환할 때 호출되며, 객체의 "문자열 표현"을 반환합니다. 주로 객체의 정보를 문자열로 출력할 필요가 있을 때 사용됩니다.
class Car:
def __init__(self, color, brand):
self.color = color
self.brand = brand
def __str__(self):
return f"{self.brand} in {self.color}"
이제 Car
객체를 print()
함수로 출력하면 __str__
메서드에서 반환한 문자열이 출력됩니다.
__repr__
메서드__repr__
메서드는 객체의 "공식적인" 문자열 표현을 반환합니다. 주로 개발자가 그 객체를 이해하는 데 도움이 되는 정보를 제공합니다. 이 메서드의 목적은 가능하면, 해당 문자열을 eval()
함수에 넣었을 때, 그 객체를 재생성할 수 있는 유효한 파이썬 표현식을 반환하는 것입니다.
class Car:
def __init__(self, color, brand):
self.color = color
self.brand = brand
def __repr__(self):
return f"Car('{self.color}', '{self.brand}')"
__len__
메서드__len__
메서드는 컨테이너 타입의 객체(리스트, 문자열, 딕셔너리 등)의 길이를 반환할 때 사용됩니다. 사용자 정의 클래스에서 이 메서드를 구현하면, len()
함수를 사용해 객체의 "길이"를 얻을 수 있습니다.
class MyCollection:
def __init__(self):
self.items = []
def add_item(self, item):
self.items.append(item)
def __len__(self):
return len(self.items)
이제 MyCollection
인스턴스에 대해 len()
함수를 호출하면, __len__
메서드가 실행되어 컬렉션의 길이를 반환합니다.
클래스와 객체를 사용하면 코드를 더 조직적으로 구성할 수 있고, 데이터와 해당 데이터를 조작하는 메서드를 캡슐화하여 프로그램의 복잡성을 관리할 수 있습니다. self
, __init__
, __str__
와 같은 특별한 메서드들은 파이
썬의 객체 지향 프로그래밍에서 객체를 더 유연하고 효과적으로 다루기 위해 제공됩니다.
__repr__
메서드는 파이썬 클래스에서 매우 중요한 역할을 하는데, 이 메서드는 객체를 대표하는 문자열을 만들어내는 기능을 합니다. 이 문자열은 주로 개발자가 코드를 읽거나 디버깅할 때 해당 객체가 어떤 것인지 빠르게 이해할 수 있게 도와줍니다. __repr__
의 목적은 그 객체를 완벽하게 설명하는 파이썬 코드 조각을 제공하는 것이며, 이론적으로는 이 문자열을 eval()
함수에 넣었을 때 원본 객체와 똑같은 새 객체를 만들어낼 수 있어야 합니다.
간단히 말해서, __repr__
메서드는 객체를 개발자 친화적으로 표현하는 방법입니다. 이 메서드를 통해 생성된 문자열로부터 그 객체를 다시 만들 수 있는 코드를 제공하는 것이 이상적입니다. 이는 객체의 상태를 정확하게 반영하는 문자열을 만들어내어, 코드를 읽거나 수정할 때 해당 객체를 쉽게 이해하고 사용할 수 있게 해줍니다.
예를 들어, 어떤 책 객체에 대한 __repr__
메서드가 다음과 같이 구현되어 있다고 가정해봅시다:
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def __repr__(self):
return f"Book('{self.title}', '{self.author}')"
이 경우, Book
객체의 __repr__
메서드는 Book('책 제목', '저자 이름')
형태의 문자열을 반환합니다. 이 문자열을 보면, 해당 Book
객체를 어떻게 생성할 수 있는지 명확히 알 수 있습니다. 또한, 이 문자열을 eval()
함수에 넣으면 동일한 책 객체를 새로 만들 수 있습니다.
결론적으로, __repr__
메서드는 객체를 개발자가 이해하기 쉬운 형태로 정확하게 표현하는 문자열을 제공하는 데 목적이 있으며, 가능하다면 그 문자열로부터 객체를 재생성할 수 있도록 하는 것이 바람직합니다.
__repr__
메서드와 __str__
메서드는 모두 파이썬에서 객체의 문자열 표현을 제공하기 위해 사용되지만, 주된 목적과 사용되는 상황에서 차이가 있습니다.
__repr__
메서드__repr__
의 결과가 출력됩니다. 또한, print()
함수나 str()
함수를 호출했을 때 해당 객체에 __str__
메서드가 구현되어 있지 않으면 __repr__
이 대신 호출됩니다.__str__
메서드__str__
은 객체를 문자열로 변환할 때 (예: print()
함수 사용 시) 보다 친근하고 이해하기 쉬운 형태로 정보를 제공하고자 할 때 사용됩니다.print()
함수로 출력하거나 str()
함수를 사용해 문자열로 변환할 때 __str__
메서드가 호출됩니다. 만약 __str__
메서드가 구현되어 있지 않으면, Python은 대신 __repr__
메서드를 사용합니다.class Example:
def __init__(self, value):
self.value = value
def __repr__(self):
return f'Example({self.value})' # 개발자를 위한 정확한 표현
def __str__(self):
return f'String value: {self.value}' # 사용자를 위한 읽기 쉬운 표현
이 예시에서 Example
객체를 print()
함수로 출력하면 __str__
메서드가 호출되어 "String value: 값" 형태로 출력됩니다. 반면, 객체를 직접 인터프리터에 입력하거나 repr()
함수를 사용하면 __repr__
메서드가 호출되어 "Example(값)" 형태로 출력됩니다.
결론적으로, __repr__
은 객체의 정확한 기술적 표현을 제공하는 데 중점을 두고, __str__
은 객체를 사용자가 이해하기 쉬운 형태로 표현하는 데 초점을 맞춥니다.