Python class

샤워실의 바보·2024년 2월 29일
0

Python

목록 보기
2/3
post-thumbnail

파이썬에서 클래스를 사용하는 것은 객체 지향 프로그래밍(OOP)의 핵심입니다. 클래스는 데이터와 그 데이터를 다루는 메소드를 함께 묶어 새로운 타입을 정의합니다. 이를 통해 코드를 더욱 체계적으로 구성하고 재사용할 수 있습니다. 클래스와 관련된 몇 가지 기본 개념을 단계별로 살펴보고, 이해를 돕기 위해 간단한 예제를 제시하겠습니다.

1단계: 클래스 정의하기

클래스를 정의하려면 class 키워드를 사용합니다. 클래스 이름은 관례적으로 대문자로 시작합니다.

class Dog:
    pass

이 코드는 아무 기능도 하지 않는 가장 간단한 클래스를 정의합니다.

2단계: 초기화 메소드 __init__

클래스의 인스턴스(객체)가 생성될 때 초기 상태를 설정하기 위해 __init__ 메소드를 사용합니다. 이 메소드는 "생성자"로 알려져 있습니다.

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

여기서 self는 객체 자신을 참조하는 변수입니다. nameage는 객체 생성 시 전달되는 파라미터입니다.

3단계: 메소드 추가하기

클래스에는 데이터를 다루는 함수인 메소드를 추가할 수 있습니다.

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

    def bark(self):
        print(f"{self.name} says woof!")

bark 메소드는 강아지가 짖는 행동을 시뮬레이션합니다.

4단계: 인스턴스 생성 및 사용하기

클래스를 정의한 후에는 해당 클래스의 인스턴스를 생성하여 사용할 수 있습니다.

my_dog = Dog("Buddy", 5)
print(my_dog.name)  # Buddy 출력
print(my_dog.age)   # 5 출력
my_dog.bark()       # Buddy says woof! 출력

5단계: 상속

클래스는 다른 클래스로부터 속성과 메소드를 상속받을 수 있습니다. 이를 통해 코드 재사용성을 높일 수 있습니다.

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 출력

요약

  • 클래스(Class): 객체를 생성하기 위한 템플릿입니다.
  • 인스턴스(Instance): 특정 클래스 기반의 객체입니다.
  • 속성(Attribute): 클래스에 속한 변수로, 객체의 상태를 저장합니다.
  • 메소드(Method): 클래스에 속한 함수로, 객체의 행동을 정의합니다.
  • 상속(Inheritance): 한 클래스가 다른 클래스의 기능을 확장할 수 있게 합니다.

이러한 기본 사항을 이해하면 파이썬에서 객체 지향 프로그래밍의 기본을 잘 다룰 수 있게 됩니다. 초보자라면 처음에는 어려울 수 있지만, 다양한 예제와 함께 연습하면서 점차 익숙해질 수 있습니다.

1. self의 개념

self는 클래스 내부에서 인스턴스 자기 자신을 참조하기 위해 사용되는 변수입니다. 메서드를 호출할 때, 파이썬은 메서드의 첫 번째 파라미터로 객체 자신을 자동으로 전달합니다. 이 첫 번째 파라미터가 self입니다. self를 사용하여 클래스 내의 다른 메서드나 속성에 접근할 수 있습니다.

2. __init__ 메서드

__init__ 메서드는 클래스의 생성자 함수로, 객체가 생성될 때 자동으로 호출됩니다. 객체의 초기화를 담당하며, 필요한 초기 설정을 수행하고 객체의 초기 상태를 설정합니다.

class Car:
    def __init__(self, color, brand):
        self.color = color
        self.brand = brand

위 코드에서 Car 클래스는 색상(color)과 브랜드(brand) 두 개의 속성을 가집니다. 객체를 생성할 때 이 두 속성을 초기화합니다.

3. __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__ 메서드에서 반환한 문자열이 출력됩니다.

4. 내장 메서드 추가 예시

__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__ 메서드

  • 목적: 객체의 공식적인 문자열 표현을 제공합니다. 이 문자열은 가능한 한 그 객체를 정확하게 재생성할 수 있는 유효한 파이썬 표현식이어야 합니다.
  • 대상: 개발자입니다. 주로 디버깅과 로깅에서 유용하며, 개발자가 객체의 상태를 정확히 이해할 수 있도록 돕습니다.
  • 행동: Python 인터프리터에서 객체를 입력하면 기본적으로 __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__은 객체를 사용자가 이해하기 쉬운 형태로 표현하는 데 초점을 맞춥니다.

profile
공부하는 개발자

0개의 댓글