본문 바로가기

TIL

[TIL] #17. self에 대하여

self 의 의미

Python에서 함수의 인자로 self 를 지정해놓는 경우를 볼 수 있다. 도대체 이 self 는 어떤 것을 의미하는 것일까? 결론을 먼저 말하면 self 는 객체의 인스턴스 그 자체를 의미한다. 이것을 이해하기 위해서는 먼저 Class에 대해 이해를 해야한다.


클래스는 변수와 함수를 묶어서 새로운 객체(타입)으로 만드는 것이다. 이렇게 만든 클래스를 사용하기 위해서는 인스턴스를 생성해야한다. 인스턴스는 클래스에 정의된 속성을 가지는 객체, 흔히 비유하는 붕어빵틀(클래스)로 찍어낸 붕어빵(인스턴스)이다. 인스턴스를 생성하는 방법은 클래스명() 으로 생성할 수 있다.


클래스 내부에 정의된 함수는 메서드(method)라고 하는데 이 때 메서드의 첫번째 인자는 반드시 self 여야 한다. 사실 반드시 self 여야한다는 말은 틀리다. self 를 첫번째 인자로 받지 않아도 되지만 그럴 경우 함수를 호출할 때 문제가 될 수 있다.


Python에서 *메서드의 self 인자에 대한 값은 Python이 자동으로 전달해준다. * 만약에 self 인자없이 정의한 메서드를 호출하면 어떻게 될까?

class Hello:
    def func1(self):
        print("Hello")
    def func2():
          print("World")

Hello 클래스의 인스턴스를 생성하여 함수를 호출해보면

hello = Hello()
hello.func1()
>> Hello

self 를 인자로 가지고 있는 함수는 정상 실행되지만

hello.func2()
>>Traceback (most recent call last):
  File "main.py", line 10, in <module>
    hello.func2()
TypeError: func2() takes 0 positional arguments but 1 was given

self 인자가 없는 함수는 TypeError를 리턴한다. 에러메세지를 보면 ' ' func2() 는 인자값을 받지 않는 메서드인데 한 개의 인자를 받았다.' 라고 나온다. func2() 를 호출할 때 우리는 전달한 인자가 없는데 왜 한 개의 인자를 받았다고하는 것일까? 그 이유는 Python에서는 첫번째 인자로 항상 인스턴스가 전달되기 때문이다.


하지만, 메서드를 호출할 때, Hello.func2() 처럼 클래스명으로 호출하면 정상적으로 실행된다. 인스턴스로 호출하는 것과 클래스로 호출하는 것은 결과적으로 아무 차이는 없다. 단지 사용자의 선택이다. 보통은 인스턴스.메서드() 로 호출한다.

self 는 인스턴스 자체

결국 self 는 인스턴스 그 자체를 말하며 객체 자기 자신을 참조하는 매개변수인 것이다. Python에서 메서드를 사용할 때 보통 인스턴스로 만든 후 사용하는게 일반적이므로 메서드를 정의할 때 self 를 첫번째 인자값으로 주는 것이 좋을 것 같다.

References

  • [magnoliarfsit님의 velog](

'TIL' 카테고리의 다른 글

[TIL] #16. ORM  (0) 2021.04.08
[Project] Westagram #1  (0) 2021.04.07
[TIL] #15. Django-Introduction  (0) 2021.03.30
[TIL] #14. Framework vs Library  (0) 2021.03.28
[TIL] #13. __init__.py  (0) 2021.03.23