파이썬 클래스의 self 이해하기

파이썬 클래스의 self 이해하기

Python
파이썬 클래스의 self 이해하기
Author

gabriel yang

Published

October 3, 2024


파이썬에서 클래스는 객체 지향 프로그래밍(OOP)의 중심 개념 중 하나로, 프로그램을 더 구조화하고 유지보수하기 쉽게 만드는 도구입니다. 클래스는 객체를 생성하기 위한 템플릿 역할을 하며, 각 객체는 클래스의 인스턴스로 다양한 속성과 메서드를 가질 수 있습니다. 이번 글에서는 파이썬에서 객체를 생성하고 메서드를 호출하는 방법, self 키워드의 의미, 그리고 객체 간의 비교와 동등성을 다룹니다.

1. 객체 생성 및 메서드 호출

클래스는 객체(인스턴스)를 생성하기 위한 청사진입니다. 객체를 생성한 후에는 그 객체의 속성이나 메서드를 사용할 수 있습니다. 파이썬에서는 클래스를 정의한 후, 클래스 이름을 함수처럼 호출하여 객체를 생성할 수 있습니다.

클래스 정의와 객체 생성

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

    def greet(self):
        return f"Hello, my name is {self.name} and I am {self.age} years old."

# 객체(인스턴스) 생성
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

# 메서드 호출
print(person1.greet())  # 출력: Hello, my name is Alice and I am 30 years old.
print(person2.greet())  # 출력: Hello, my name is Bob and I am 25 years old.
Hello, my name is Alice and I am 30 years old.
Hello, my name is Bob and I am 25 years old.

위 코드에서는 Person이라는 클래스를 정의하고, person1person2라는 두 개의 객체를 생성했습니다. 이 두 객체는 각각 greet 메서드를 호출하여 자신만의 인사말을 출력합니다.

객체 생성 과정

  • Person("Alice", 30): 클래스 이름을 호출하여 객체를 생성합니다. 이때 __init__ 메서드가 호출되어 객체의 초기 상태를 설정합니다.
  • person1.greet(): 객체의 메서드를 호출합니다. 객체마다 메서드의 동작은 동일하지만, 객체의 상태에 따라 결과가 달라집니다.

2. self 키워드의 의미

self는 파이썬에서 클래스 메서드를 정의할 때 반드시 사용되는 매개변수로, 해당 메서드가 호출된 객체 자신을 참조하는 역할을 합니다. 이는 메서드가 특정 객체의 속성에 접근하거나 그 객체의 동작을 정의할 때 필요합니다.

self의 역할

class Car:
    def __init__(self, model, year):
        self.model = model  # 인스턴스 속성
        self.year = year    # 인스턴스 속성

    def description(self):
        return f"This car is a {self.year} {self.model}."

# 객체 생성 및 메서드 호출
car1 = Car("Toyota Corolla", 2020)
print(car1.description())  # 출력: This car is a 2020 Toyota Corolla.
This car is a 2020 Toyota Corolla.
  • self.model: self는 메서드가 호출된 객체를 가리킵니다. 예를 들어, car1.description()에서 selfcar1을 참조하므로, self.modelcar1.model을 의미합니다.
  • self는 명시적으로 전달되지 않음: 메서드를 호출할 때 self는 명시적으로 전달하지 않아도 파이썬이 자동으로 전달합니다. 예를 들어 car1.description()을 호출할 때, 실제로는 Car.description(car1)이 호출됩니다.

3. 객체 비교 및 동등성

객체 지향 프로그래밍에서 두 객체가 같은지, 또는 그 속성값이 동일한지를 비교하는 것은 중요한 작업입니다. 파이썬에서 객체 비교는 크게 두 가지 방식으로 나눌 수 있습니다: - 동일성(Identity): 두 객체가 메모리 상에서 같은 객체인지 비교. - 동등성(Equality): 두 객체의 값이나 상태가 같은지 비교.

동일성 비교: is 연산자

동일성 비교는 두 객체가 메모리에서 같은 객체를 참조하는지 확인할 때 사용됩니다.

person1 = Person("Alice", 30)
person2 = person1
person3 = Person("Alice", 30)

print(person1 is person2)  # 출력: True (같은 객체)
print(person1 is person3)  # 출력: False (다른 객체)
True
False
  • person1 is person2: True를 반환합니다. person2person1과 같은 객체를 참조하고 있습니다.
  • person1 is person3: False를 반환합니다. 비록 두 객체의 속성 값이 같더라도, 서로 다른 객체이기 때문에 메모리 상에서 다른 위치를 가리킵니다.

동등성 비교: == 연산자

동등성 비교는 두 객체의 값이 같은지 확인할 때 사용됩니다. 기본적으로 파이썬에서 객체의 동등성 비교는 __eq__ 메서드를 통해 이루어지며, 이를 오버라이딩하여 원하는 기준으로 객체의 동등성을 정의할 수 있습니다.

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

    def __eq__(self, other):
        return self.name == other.name and self.age == other.age

person1 = Person("Alice", 30)
person2 = Person("Alice", 30)

print(person1 == person2)  # 출력: True (동등성 비교)
True
  • __eq__ 메서드: 두 객체의 이름과 나이가 동일하면, 두 객체를 같다고 판단하도록 동등성 비교를 정의했습니다. 따라서 person1 == person2True를 반환합니다.
  • 객체 비교를 위한 사용자 정의: 기본적으로 == 연산자는 객체의 메모리 위치를 비교하지만, __eq__ 메서드를 오버라이딩하면 원하는 속성 기반으로 객체를 비교할 수 있습니다.

파이썬에서 클래스를 이용하여 객체를 생성하고, self를 통해 각 객체의 속성에 접근하는 방법을 이해하는 것은 객체 지향 프로그래밍의 기초입니다. self는 객체의 메서드가 그 객체의 상태를 참조할 수 있게 하며, 이를 통해 객체 간의 유연한 상호작용이 가능합니다. 또한, 객체 비교와 동등성 개념을 활용하면 객체 간의 값이나 상태를 정확하게 비교할 수 있습니다. 이러한 개념을 제대로 이해하면, 파이썬으로 더 복잡하고 유연한 객체 지향 프로그램을 작성할 수 있습니다.