파이썬의 클래스(class)와 객체(object), 인스턴스(instance)에 대해 정리해보겠습니다.
클래스(class), 객체(object), 인스턴스(instance)를 구분해보자.
클래스(class)는 주로 어떤 틀에 비유됩니다. 즉, 똑같은 무엇을 계속 만들어 내는 것에 비유됩니다. 그 이유는 클래스는 객체(object)를 정의하고 만들기 위한 변수와 메서드의 집합이기 때문입니다.
저는 와플을 찍어내는 틀에 클래스를 비유해보겠습니다.
그러면 이런 틀에 의해서 만들어진 하나하나의 와플은 객체(object)로 비유할 수 있습니다.
클래스(class)에 의해 생성된 이런 객체(object)들은 서로 영향을 끼치지 않습니다.
틀을 이용해 두 개의 와플을 만들었다고 해봅시다. 클래스를 이용해 두 개의 객체를 만든 것과 같다고 볼 수 있습니다.
그러면 와플 하나를 먹어도 다른 와플은 그대로 있습니
다. 객체(object)는 서로 영향을 끼치지 않으니까요.
간단한 예시를 한번 만들어 보겠습니다.
먼저, car라는 클래스(class)를 정의하고, 간단하게 on이라는 메서드(method)를 정의해보겠습니다.
클래스(class)의 객체(object)가 소프트웨어에 실체화되면 이제 그것을 인스턴스(instance)라고 부릅니다.
아직 객체(object)와 인스턴스(instance)의 차이가 뭔지 헷갈릴 겁니다. (저도 늘 헷갈려 정리하고 있습니다ㅎㅎ..)
class car:
def on(self):
print("차량의 시동을 켭니다.")
ray = car()
ray.on()
[출력 결과]
차량의 시동을 켭니다.
그럼 위의 코드를 보고 한번 표현을 해볼까요?
1. ray는 객체(object) 입니다. ( ray는 객체(obejct) ! )
2. ray 객체(object)는 car 클래스(class)의 인스턴스(instance) 입니다. ( ray는 car의 인스턴스(instance) ! )
인스턴스(instance)라는 표현은 특정 객체가 어떤 클래스의 객체인지 관계를 중점으로 표현할 때 사용합니다.
이제 위의 1. 과 2. 의 표현의 차이를 한번 생각해 보시길 바랍니다.
메서드(method) 그리고 생성자(constructor)
이제 어느 정도 표현에 익숙해졌으니 클래스(class)와 함께 반드시 알아야 할 메서드(method)와 생성자(constructor)에 대해 알아보겠습니다.
메서드(method) 속성은 클래스 안에서 구현하는 함수를 말합니다.
메서드의 첫 번째 매개변수 이름은 클래스의 인스턴스 자신입니다. 따라서 관례적으로 self 라는 이름으로 사용합니다.
예시를 한번 만들어보겠습니다.
class example(): # example라는 이름의 클래스를 만듭니다.
def __init__(self):
self.ary = []
print('__init__()메서드를 통해 객체를 초기화 했습니다.')
# 메서드를 하나 정의합니다.
def ary_append(self, item): # 첫 번째 인수는 self 임을 확인!
self.ary.append(item)
ex1 = example()
print(ex1.ary)
ex1.ary_append(10)
print(ex1.ary)
[출력 결과]
__init__()메서드를 통해 객체를 초기화 했습니다.
[]
[10]
생성자(constructor)
위의 예시에서 앞의 car 클래스를 정의했을 때와는 다른 점이 보입니다. 바로 __init__ 메서드입니다.
메서드 이름이 __init__ 인 경우 이 메서드를 생성자(constructor)라고 합니다!
생성자는 객체가 생성되면 자동으로 호출돼 객체를 초기화합니다.
위 예시에서도 ex1 객체를 만들었을 때, __init__ 메서드, 즉 생성자에 의해 ary라는 객체 변수가 생성됐고 메서드가 자동으로 호출됐다는 증거로 print 문이 작동했습니다.
예시를 보겠습니다.
# Hello.__init__()메서드가 객체를 초기화합니다.
class Hello(): # Hello라는 이름의 클래스를 만듭니다.
def __init__(self,value): # 객체를 초기화하는 메서드
self.value = value
print('__init__()메서드를 통해 객체를 초기화 했습니다.')
print(f'인스턴스의 value 값은 {self.value}입니다.')
a = Hello(20)
[출력 결과]
__init__()메서드를 통해 객체를 초기화 했습니다.
인스턴스의 value 값은 20입니다.
Hello 클래스의 인스턴스 a는 생성되자마자 value 객체 변수가 생성된 것을 확인할 수 있고, 마찬가지로 print 문도 잘 작동합니다.
포스팅을 하면서 객체와 인스턴스의 표현에 주의하면서 글을 써봤습니다.
제가 객체라는 표현을 사용할 때와 인스턴스라는 표현을 사용할 때를 확인하시면 더 이해가 잘 될 것이라고 생각합니다!
읽어주셔서 감사합니다. ^^
참고자료
'파이썬 Python' 카테고리의 다른 글
matplotlib.pyplot 흑백 이미지 출력이 정상적으로 안되는 경우 (plt.imshow(), cmap) (2) | 2021.12.23 |
---|---|
[파이썬] sys.setrecursionlimit() (재귀 최대 깊이 설정) (1) | 2021.09.22 |
[파이썬] for - else 문 ,while - else 문 (반복문 - else) (0) | 2021.08.04 |
[파이썬] 클래스 상속, 메서드 오버라이딩 (예시를 통한 설명) (1) | 2021.06.22 |
[파이썬] 깊은 복사와 얕은 복사 개념, 예제 (0) | 2021.06.19 |