클래스에 사용되는 "self"의 정체
다음과 같이 연산을 수행할 대상(4, 2)을 객체에 지정할 수 있게 만들어 보자.
>>> a.setdata(4, 2)
위의 문장이 수행되려면 다음과 같이 소스 코드를 작성해야 한다.
>>> class FourCal:
... def setdata(self, first, second):
... self.first = first
... self.second = second
...
>>>
이전에 만들었던 FourCal 클래스에서 pass라는 문장을 삭제하고 class 내부에 setdata라는 함수를 만들었다. 클래스 안에 구현된 함수는 다른말로 메서드(Method)라고 부른다. 앞으로 클래스 내의 함수는 항상 메서드라고 표현할테니 용어를 기억해 두도록 하자.
일반적인 함수를 만들 때 우리는 다음과 같이 작성한다.
def 함수명(매개변수):
수행할 문장
...
메서드도 클래스에 포함되어 있다는 점만 제외하면 일반함수와 다를 것이 없다.
setdata 메서드를 다시 보면 아래와 같다.
def setdata(self, first, second): # ① 메서드의 매개변수
self.first = first # ② 메서드의 수행문
self.second = second # ② 메서드의 수행문
① setdata 메서드의 매개변수
setdata 메서드는 매개변수로 self, first, second라는 3개의 입력값을 받는다. 그런데 일반적인 함수와는 달리 메서드의 첫 번째 매개변수 self는 특별한 의미를 가지고 있다.
self에 어떤 특별한 의미가 있는지 다음의 예를 보면서 자세히 살펴보자.
>>> a = FourCal()
>>> a.setdata(4, 2)
위에서 보는 것처럼 먼저 a라는 객체를 만들었다. 그리고 a라는 객체를 통해 setdata 메서드를 호출했다.
※ 객체를 통해 클래스의 메서드를 호출하려면a.setdata(4, 2)
와 같이 도트(.
) 연산자를 이용해야 한다.
그런데 뭔가 좀 이상하지 않은가?
setdata라는 메서드는 self, first, second라는 총 3개의 매개변수를 필요로 하는데 실제로는 a.setdata(4, 2) 처럼 4와 2라는 2개의 값만 전달한 것이다.
왜 그럴까?
그 이유는 a.setdata(4, 2)처럼 호출하면 setdata 메서드의 첫 번째 매개변수 self에는 setdata메서드를 호출한 객체 a가 자동으로 전달되기 때문이다.
다음 그림을 보면 객체와 호출 입력 값들이 메서드에 어떻게 전달되는지 쉽게 이해가 갈 것이다.

파이썬 클래스에서 가장 헷갈리는 부분이 바로 이 부분이다. setdata라는 메서드는 매개변수로 3개를 필요로 하는데 왜 a.setdata(4, 2)처럼 2개만 입력해도 실행이 되는가? 이 질문에 대한 답변을 여러분도 이제는 알았을 것이다.
파이썬 메서드의 첫번째 매개변수명은 관례적으로 self라는 이름을 사용한다. 호출 시 호출한 객체 자신이 전달되기 때문에 self("self"는 자기자신이라는 뜻을 가진 영어단어이다.)라는 이름을 사용하게 된 것이다. 물론 self말고 다른 이름을 사용해도 상관은 없다.
※ 메서드의 첫번째 매개변수를 self를 명시적으로 구현해야 하는 것은 파이썬만의 독특한 특징이다. 예를들어 자바같은 언어는 첫번째 매개변수인 self가 필요없다.
[메서드의 또 다른 호출 방법]
잘 사용하지는 않지만 다음과 같이 메서드를 호출하는 것도 가능하다.
>>> a = FourCal()
>>> FourCal.setdata(a, 4, 2)
위와 같이 "클래스명.메서드" 형태로 호출할 때는 객체 a를 입력 인수로 꼭 넣어 주어야 한다. 반면에 다음처럼 "객체.메서드" 형태로 호출할 때는 첫 번째 입력 인수(self)를 반드시 생략해야 한다.
>>> a = FourCal()
>>> a.setdata(4, 2)
출처:<https://wikidocs.net/28>