Python/Python 정리

[Python] self 이해

우준세 2021. 7. 29. 18:50
728x90
반응형

 

이번 포스팅은 python을 사용하며 클래스에서 self의 이해를 깊게 하기 위해 정리한 것입니다.


self

- self는 class를 포스팅할 때 썼지만 처음에는 클래스에 정의된 함수인 메서드의 첫 번째 인자는 self 다!라고 외우고 지나갔습니다. 하지만 사용하면 할수록 self는 계속 나오는데 이해는 안 되고 하여 정리하고자 합니다. 

 

- 결론을 얘기하자면 self는 클래스의 인스턴스 그 자체를 말합니다. 즉, 객체 자기 자신을 참조하는 매개변수입니다.

 

예시를 들어 알아보겠습니다.

 

- self를 전달하지 않는 메서드

class Food:
    def eatPizza():
        print('yam')
        
good = Food()
good.eatPizza()

 

- 결과 

 

 

에러는 eatPizza 메서드에 arguments를 전달했지만 받는게 없어서 문제가 발생했습니다. 

 

- eatPizza에 self 매개변수를 전달

 

class Food:
    def eatPizza(self):
        print('yam')
        
good = Food()
good.eatPizza()

 

 

- 결과 

 

문제 없이 잘 수행된 것을 볼 수 있고

알 수 있는 것은 클래스의 메서드에 self를 첫 번째 인자로 받도록 해주어야 하는 것입니다. 

또한 우리가 매개변수에 self를 쓰지 않아도 파이썬에서 자동으로 self를 전달한 것을 볼 수 있습니다. 


그러면 self는 어디에 있을까요?

self의 위치 

- 앞서 포스팅 했던 객체의 주소를 알려주는 id() 함수를 이용하여 위치를 알아보겠습니다.

 

class Food:
    def eatPizza(self):
        print('self id : ',id(self))
        print('yam')

good = Food()
good.eatPizza()
print('good id : ', id(good))

 

- 결과

 

 

결과를 확인해보니 인스턴스 good의 주소와 self의 주소가 같은 것을 볼 수 있습니다.

여기서 알 수 있는 점은 good과 self가 같다는 점입니다! 

 

- 인스턴스 없이 클래스 함수 호출될 경우

 

class Food:
    def eatPizza(self):
        print('self id : ',id(self))
        print('yam')
 
Food.eatPizza()

 

- 결과

 

 

good이라는 인스턴스가 없이 클래스의 함수를 호출했더니 에러가 발생했습니다! 

이 에러는 앞서 self 없이 호출하여 에러가 발생한 것과 같습니다. self를 전달하지 않아 발생하는 에러입니다!

 

즉, 클래스는 인스턴스를 만들지 않아도(good = Food()를 통해 good 변수에 Food 객체를 담지 않아도) 호출은 할 수 있지만 self를 전달하지 않아 에러가 발생하는 결과를 얻었습니다.

 

어떻게 해결해야 할까요?

 

- self는 인스턴스라고 했습니다. 그러므로 인스터스를 전달해주면 됩니다. 

 

class Food:
    def eatPizza(self):
        print('self id : ',id(self))
        print('yam')

good = Food()
print('good id : ',id(good))
Food.eatPizza(good)

 

- 결과

 

 

결과는 위에서 good을 만들어 good.eatPizza()를 실행한 것과 같지만 Food.eatPizza()와는 조금 다릅니다.

 

 

 

여기서 전달되는 인스턴스는 Food 객체를 통해 만든 인스턴스가 아니어도 결과를 얻을 수 있습니다!

 

class Food:
    def eatPizza(self):
        print('self id : ',id(self))
        print('yam')

class test :
    print('test')

test = test()
    
good = Food()
good.eatPizza()
print('good id : ', id(good))

Food.eatPizza(test)

 

- 결과

 

 

self에 대해 이해를 잘 하지못했었는데 정리를 통해

어느 정도 이해를 할 수 있게 되었습니다.

 

틀린 부분이나 질문이 있으시면 댓글로 남겨주세요!

 

감사합니다 :)

 

 

 

728x90
반응형