파이썬 클래스를 처음 접하다보면, 추상적인 개념에 적잖이 당황할 수도 있습니다.
특히 class를 만들 때, class안에 함수를 정의할 때 self 라는 키워드를 많이 보셨을 겁니다.
이 self는 굉장히 중요한 역할을 하게 되는데, 무엇을 의미하는지 간단하게 알아보도록 하겠습니다.
self라는 키워드는 클래스가 만들어진 이후, 인스턴스로서 활용될 때 굉장히 중요한 역할을 합니다.
이때 class variable과 instance variable에 대해 알아야 할 필요가 있는데, 간단하게 말해서 self가 활용된다면 이는 곧 class 전역에 영향을 미치는 것이 아닌 인스턴스에만 국한되어 작동하게 됩니다.
예시 1) class_variable vs instance_variable
코드를 보면서 살펴보겠습니다.
class MyClass:
class_variable = "Hello"
def __init__(self, instance_variable):
self.instance_variable = instance_variable
obj1 = MyClass("world")
obj2 = MyClass("everyone")
print(obj1.class_variable) # Output: Hello
print(obj2.class_variable) # Output: Hello
print(obj1.instance_variable) # Output: world
print(obj2.instance_variable) # Output: everyone
위 처럼 MyClass라는 클래스를 정의해주고, obj1과 obj2를 MyClass를 이용해서 생성해주었습니다.
obj1과 obj2는 클래스가 아닌 '인스턴스'라고 불립니다.
그렇다면 MyClass내 생성자 __init__ 함수에서 instance_variable 인수를 받고 있습니다.
따라서 위 코드에서 obj1 = MyClass("world") 즉 "world"라는 인수를 주었습니다. 이건 obj1의 고유한 인스턴스 이름일 뿐, 같은 클래스로부터 생성된 인스턴스인 obj2에는 영향을 주지 않습니다.
따라서 obj1.instance_variable 속성을 찍어봤을 때, output이 "world"가 나오는 것을 확인할 수 있습니다.
반대로 같은 이유로 obj2.instance_variable 속성을 찍어 봤을 때, output이 "everyone"이 나오는 것을 확인할 수 있습니다.
자 그럼 class variable은 무엇일까요?
이 class variable은 모든 클래스 전역에 영향을 미치는 변수이기 때문에, 생성된 인스턴스도 공통으로 갖고 있는 변수가 되겠습니다.
따라서 obj1과 obj2 에 상관없이 class variable의 값을 "Hello"로 같은 것을 확인할 수 있습니다.
또한 가독성의 이유로 class_variable은 대부분의 경우 class 코드 내 가장 맨 윗부분에 작성되는 경우가 많습니다.
예시 2) class_variable vs instance_variable
또 다른 예시를 들어보겠습니다.
class Dog:
breed = "Unknown"
def __init__(self, name):
self.name = name
dog1 = Dog("Fido")
dog2 = Dog("Rover")
print(dog1.breed) # Output: Unknown
print(dog2.breed) # Output: Unknown
print(dog1.name) # Output: Fido
print(dog2.name) # Output: Rover
위 예시에서 breed는 class variable입니다.
따라서 dog1 인스턴스와 dog2 인스턴스 모두 같은 breed를 공유하고 있습니다.
하지만 breed가 클래스 변수로써 클래스 전역에 영향을 미친다고 하더라도, 이미 생성된 인스턴스의 class variable에 직접적으로 사후에 접근을 하여 값을 변경한다면, 변경된 값이 다른 인스턴스에 영향을 주진 않습니다.
예를 들어보겠습니다.
dog1.breed = "Golden Retriever"
print(dog1.breed) # Output: Golden Retriever
print(dog2.breed) # Output: Unknown
이렇게 dog1의 클래스 변수만 바뀐 것을 확인할 수 있습니다.
왜 self 키워드를 사용하는가? class variable만 사용해도 되지 않을까?
위 질문에 대한 답은 유연성에 있습니다.
파이썬을 이용해 자동차를 표현해본다고 생각해보죠.
자동차는 브랜드가 다르고, 스펙이 다릅니다. 또 가격도 다르겠죠
# Case 1: 클래스 변수만 사용할 때
class MyCar:
price = 2000
mpg = 10.0
size = 5
i30 = MyCar()
Eclass = MyCar()
bmw5 = MyCar()
# Case 2: 인스턴스 변수를 활용할 때
class MyCar2:
def __init__(self, price, mpg, size):
self.price = price
self.mpg = mpg
self.size = size
i30 = MyCar2(2000, 10.0, 5)
Eclass = MyCar2(6000, 7.0, 5)
bmw5 = MyCar2(5500, 8.0, 5)
따로 설명을 자세하게 기술하지 않더라도 어떤 이점이 있는지 확인할 수 있으리라 생각합니다.
이 외에도 self 키워드는 클래스를 정의할 때, 다양한 메서드에도 영향을 끼칩니다.
따라서 굉장히 중요하게 작동되는 것을 거듭 강조하면서, 조금이라도 이해가 되셨길 바랍니다.
'파이썬 > 클래스' 카테고리의 다른 글
[python] 파이썬 class의 __call__ 함수 (매직메소드) (0) | 2023.03.12 |
---|---|
[python] 클래스 메서드(class method)와 정적 메서드(static method) (0) | 2023.03.08 |
파이썬과 객체지향 (python and class) 3 - 생성자(__init__, initializer) (0) | 2023.01.02 |
파이썬과 객체지향 (python and class) 2 (0) | 2023.01.02 |
파이썬과 객체지향 (python and class) 1 (0) | 2023.01.02 |