Python으로 클래스를 생성할 때 자주 보이는 self에 대해 알아보겠습니다.
간단히 바로 요약하자면
self란 클래스의 인스턴스를 나타내는 변수입니다.
무슨 말인지는 천천히 예를 들면서 설명하겠습니다.
self는 class내 method들의 첫번째 인자로 전달됩니다.
다른 언어들은 이 과정을 프로그래머 모르게 알아서 처리하기도 하지만 Python은 이를 명시적으로 프로그래머가 해줘야 합니다.
하지만 self를 전달하지 않은 메소드를 만들어도 상관 없습니다.
class Person:
def sayHello():
print('Hi')
다만 이렇게 만든 메소드를 호출하면 문제가 됩니다.
class Person:
def sayHello():
print('Hi')
man = Person()
man.sayHello()
#TypeError: sayHello() takes 0 positional arguments but 1 was given
에러의 뜻은 sayHello 메소드에 argument를 전달했는데 받는 처리를 안해서 문제랍니다.
그럼 self를 sayHello 메소드에 넣어보겠습니다.
class Person:
def sayHello(self):
print('Hi')
man = Person()
man.sayHello()
문제 없이 잘 수행됨을 알 수 있습니다.
여기서 알 수 있는 사실은 클래스의 메소드들은 self를 첫번째 인자로 받도록 해주어야합니다.
Python이 자동으로 self를 전달하기 때문입니다.
그렇다면 self는 어디에 위치해 있을까요?
객체의 메모리주소를 알아내는 id()함수를 사용해 어디에 있는지 알아보겟습니다.
class Person:
def sayHello(self):
print(id(self)) #3130384
print('Hi')
man = Person()
man.sayHello()
id(self)를 출력하면 self가 메모리 3130384번지에 저장되어 있다고 합니다.
그러면 인스턴스 man은 어디에 저장되어 있을까요? 한번 확인해보겠습니다.
class Person:
def sayHello(self):
print(id(self)) #3130384
print('Hi')
man = Person()
man.sayHello()
print(id(man))
#3130384
#Hi
#3130384
* id()를 통해 나오는 주소값은 프로그램을 실행시킬 때마다 다릅니다.
결과를 확인하면 인스턴스 man의 주소와 self의 주소가 같습니다.
여기서 알 수 있는 점은 위에서 언급한바와 같이
man이나 self나 사실 같은 것입니다.
그러면 man이라는 인스턴스가 없이 클래스의 함수가 호출될 때는 어떨까요?
클래스는 인스턴스를 만들지 않아도(man = Person()을 통해 man 변수에 Person 객체를 담지 않아도) 네임스페이스를 따로 갖고 있기 때문에 Person.sayHello()처럼 호출할 수 있습니다.
한번 해보겠습니다.
class Person:
def sayHello(self):
print(id(self))
print('Hi')
Person.sayHello()
#TypeError: sayHello() missing 1 required positional argument: 'self'
호출이 되기는 되는데 self를 전달하지 않아서 에러랍니다. 위에서 본 에러와 같습니다.
그러면 무엇을 전달해야할까요? self는 인스턴스라고 했기 때문에 인스턴스를 전달하면 되니다.
따라서, 인스턴스를 하나 만들어서 Person.sayHello()에 전달해보겠습니다.
class Person:
def sayHello(self):
print(id(self))
print('Hi')
man = Person()
Person.sayHello(man)
print(id(man))
#6276112
#Hi
#6276112
Person.sayHello()를 통해 sayHello 메소드가 호출되기는 하나 인스턴스를 통해 호출한 것이 아니라
클래스를 통한 호출이라 Person.sayHello()는 인스턴스를 통한 호출 man.sayHello()과는 조금 다릅니다
내부에 참조할 self가 없어서 인스턴스를 하나 인자로 전달해야합니다.
하지만 Person.sayHello() 역시 메소드를 정상적으로 호출할 수 있는 것은 마찬가지이기 때문에
인자로 인스턴스를 잘 전달하면 문제없이 수행됨을 알 수 있습니다.
참고로 여기서 전달되는 인스턴스는 꼭 Person 객체를 통해 만든 인스턴스가 아니어도 됩니다!
class Person:
def sayHello(self):
print(id(self)) #3130384
print('Hi')
class Robot:
life = 1000
bot = Robot()
man = Person()
Person.sayHello(bot)
print(id(man))
#잘만 됨
같이 읽어보면 좋은 글
2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.
2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄
'파이썬 > 기초문법' 카테고리의 다른 글
Python ==과 is의 차이 (0) | 2020.02.12 |
---|---|
Relative imports in Python 3 (0) | 2020.02.02 |
Multiprocessing vs. Threading in Python: What Every Data Scientist Needs to Know (0) | 2020.01.30 |
Python NumPy 배열 기초 (0) | 2020.01.24 |
Python 날짜 다루기 datetime, dateutil, timedelta (0) | 2020.01.24 |
댓글