클래스 내부에 정의된 함수인 메서드의 첫번째 인자는 self 를 넣는 기초 예제가 많습니다.
self는 예전에 포스팅에서 잠깐 다룬적 있지만, 자세히 다루지 않았기에 이번 포스팅에서 조금 자세히 self 만 다뤄보려고 합니다.
보통 클래스 안에 메서드를 작성하고 그 안에 첫 번째 인자는 self 를 작성하도록 배웁니다.
self 가 첫번째 인자로 들어가 있지 않은 메서드는 (아래 사진에 나오는) 에러가 발생합니다.
위 코드에서 메서드를 호출한 결과를 보면 화면에 정상적으로 'second, function 2'가 출력됩니다.
function02 메서드의 첫 번째 인자는 self지만 호출할 때는 아무것도 전달하지 않는 이유는 첫 번째 인자인 self에 대한 값은 파이썬이 자동으로 넘겨주기 때문입니다.
그렇다면 function01 메서드처럼 메서드를 정의할 때부터 아무 인자도 없는 경우에는 어떻게 될까요? 다음과 같이 인스턴스를 통해 func1()을 호출해보면 오류가 발생합니다. 오류 메시지를 살펴보면 “function01()은 인자가 없지만 하나를 받았다”라는 것을 볼 수 있습니다. 이는 앞서 설명한 것처럼 파이썬 메서드의 첫 번째 인자로 항상 인스턴스가 전달되기 때문에 발생하는 문제입니다.
위 예제와 설명은 첫 번째로 참고한 블로그의 예시와 설명을 인용했습니다.
이 부분에 덧붙이자면, 파이썬에서는 모든 게 객체입니다. 클래스가 있으면 이걸 인스턴스화합니다. 인스턴스가 실행되면 내부적으로 인스턴스가 호출해서 처리하는 메서드를 실행합니다. 이 때 첫 번째 매개변수에 그 인스턴스의 레퍼런스를 자동으로 세팅해서 인스턴스가 실행되도록 만듭니다.
즉,
1) (사용자 정의) 클래스로 인스턴스 만듬
sam = Sample()
2) 인스턴스 메서드 실행
sam.function02()
3) 클래스 안에서 설정된 self 라는 변수는 인스턴스의 레퍼런스를 갖게 되고 이는 자동으로 세팅되므로 해당 위치의 레퍼런스를 찾아가서 메서드를 참조
"3)"이 진짜인지 아래 예시 코드를 곱씹어보자.
Foo 라는 클래스로 만든 f 라는 인스턴스의 레퍼런스와 func2 안의 self 변수에 대한 레퍼런스를 찍으니깐 동일하게 나온다!
즉, self 는 클래스로 만든 인스턴스의 레퍼런스를 동일하게 갖는다. 그러므로, 인스턴스 메서드는 인스턴스의 레퍼런스를 가지고 있어야 참조를 할 수 있으니 self 를 인자로 넣지 않은 func1 은 아래와 같은 에러가 발생한다.
TypeError: func1() takes 0 positional arguments but 1 was given
자, 그러면 self 는 인스턴스 메서드에 접근하기 위해 인스턴스의 레퍼런스를 갖고 있는 매개변수이다. 자동으로 세팅해서 인스턴스가 실행되도록 만들기 때문에 __init__ 메서드에서 첫 번째 매개변수에 self 를 부여한다.
자, 그러면 self 는 무엇인가?
클래스로 인스턴스를 만들었을 때, 그 인스턴스의 레퍼런스를 갖고 있는 매개변수이다.
이유는 객체 자기 자신을 참조하기 위해서이다.
그러니, "self.속성이름" 이라고 써있는건 모두 인스턴스의 속성이며 "메서드이름(self)" 라고 써있는건 인스턴스 메서드이다.
인스턴스 어쩌구 하는건, 인스턴스화가 되어있기 때문이며 거기에 접근하기 위해선 인스턴스 자체의 레퍼런스가 필요한데 이를 self 라고 표현한다. (인스턴스 메서드 말고 static method, class method 라고 하는 정적메서드가 있는데 얘네는 인스턴스 메서드랑 다르다! 객체(인스턴스)로 접근하지 않는다는 의미인데 나중에 따로 포스팅할 예정!)
아하! 그러면 self 어쩌구 하는건 전부 클래스 자체에 접근하기 위해서 아닌 클래스로 만든 "인스턴스"에 접근할 수 있는 속성이나 메서드구나! 이거를 클래스 내에서 정의할 때 self 라는 이름으로 약속해서 사용하기로 되어있구나!
정도로 생각할 수 있으면 self에 대해선 기본적인 정리는 될듯하다!
참고한 블로그! (읽어보시면 도움 많이됩니다!)
dojang.io/mod/page/view.php?id=2373
'Python_programming' 카테고리의 다른 글
[Python] 함수(function)와 메서드(method)의 차이점 (0) | 2021.05.16 |
---|---|
'callable object' 에 대한 고찰 (0) | 2021.05.14 |
'정보 은닉'에 대한 고찰 (0) | 2021.05.09 |
Python 생성자(__new__)에 대한 고찰 (0) | 2021.04.22 |
Python 고정 위치 인자, 가변 위치 인자, 고정 키워드 인자, 가변 키워드 인자 에 대한 고찰 (0) | 2021.04.19 |