[python][TIL] self의 의미

변지현·2021년 1월 9일
0

python

목록 보기
1/2

python과 class

 파이썬을 주로 스크립트를 작성하는데 사용했었다. 하지만 Django를 사용하게 되면서 python에서 class를 다룰 일이 많아졌는데, 필요한 부분을 그때그때 찾아서 공부하였기 때문에 몇몇 헷갈리는 부분이 있었다. 그 중 가장 애매했던 부분이 self라는 키워드였다.

this와 비슷한데 또 다른거 같기도 하고..

 self라는 키워드를 처음 접하고 검색하며 공부해봤을 때 알게된 것은 본인의 인스턴스를 가리키는 변수라는 것이다. 자바의 this와 같다고 생각했다. 쓰이는 방법은 확실히 같은것 같다. 하지만 뭔가 이상했다. 메소드의 인자로 self가 쓰이는 것이다.
예를들어

class Foo:
        
    def print_value(self):
    	print("print_value")

foo = Foo("new")
foo.print_value()

이런식으로 말이다. 찾아보니, 파이썬에서 클래스 내의 메소드에는 무조건
첫 인자로 self를 갖는다고 한다. 뭐 그렇게 만들었다면 그런거지 하면서 "오케이"하며 받아들이고 넘어가려는데 클래스 내에 있으면서도 self를 갖지 않는 경우를 발견하였다.(...!)

class Foo:

    def print_value1():
    	print("print_value1")
        
    def print_value1(self):
    	print("print_value2")

이렇게 클래스를 작성하는 경우 클래스 작성 단계에서 에러가 발생하진 않는다. 하지만 메소드를 호출해보면 print_value1를 호출할 때 에러가 발생한다.

>>> foo = Foo()
>>> foo.print_value1()
Traceback (most recent call last):
 File "<pyshell#31>", line 1, in <module>
   foo.print_value1()
TypeError: print_value1() takes 0 positional arguments but 1 was given
>>> foo.print_value2()
print_value2
>>> 

 재밌는 점은 인스턴스가 아닌 클래스 수준에서 호출을 하면 에러가 발생하지 않는다는 것이다.

>>> Foo.print_value1()
print_value1
>>>

 이 말은 객체를 생성하지 않고도 메소드를 호출할 수 있다는 것, 즉 self를 인자로 갖지 않으면 객체를 만들지 않고도 호출할 수 있는 "정적 메소드"라는 것이다." 자바와 다르게 정적 메소드를 함수를 선언할 때 지정자로 구분을 하는 것이 아니라 self를 인자로 갖는지로 구분을 하는 방식이어서 포인트를 찾기 어려웠던 것 같다. 또 하나의 차이점이 있는데 자바에서는 인스턴스에서도 정적 메소드를 호출할 수 있다. 하지만 배울 때 정적 메소드는 클래스 수준에서 호출하는 것이 바람직하다고 배웠다.(코드에서 더 직관적으로 정적 메소드를 구분하기 위해) 내 생각에 파이썬에서는 그에 대한 제약을 더 강화한 것 같다.

 결론 : 파이썬에서는 self라는 키워드를 통해 자신의 인스턴스에 접근할 수 있으며 self가 메소드의 매개변수로 사용되냐의 유무는 해당 메소드가 정적 메소드인지 일반 메소드인지 구분하는데 사용된다.

profile
23살 개발자 변지점프의 더 나은 사람 되기 프로젝트

0개의 댓글

관련 채용 정보