본문 바로가기
Algorithm/알고리즘 공부노트

파이썬 클래스와 self의 의미

by devraphy 2021. 11. 6.

1. Class 개념

클래스를 생성한다는 것은 새로운 데이터 타입을 만든다는 의미다.

위의 스크린샷을 살펴보자.

4라는 값을 test 라는 변수에 담았다.

4와 test의 type을 출력해보면 int 클래스 라는 것을 확인할 수 있다. 

즉, int 클래스의 객체이고 int 자료형을 사용한다는 의미다. 

 

그렇다면 간단하게 class를 만들어서 객체를 생성하여 해당 객체의 type을 출력해보자. 

위의 스크린샷에서 확인할 수 있듯이, 클래스는 새로운 자료형을 나타낸다.

즉, 클래스를 만드는 것은 새로운 자료형을 생성하는 것이다.


2. Self 개념

파이썬에서 클래스를 만들고, 클래스 내부에 메소드를 선언할 때에는 반드시 self라는 변수가 첫번째로 들어가야 한다.

이는 다음과 같이 이해할 수 있다. 

 

person 이라는 클래스를 만들고, 해당 클래스를 내부에 set_info 라는 메소드를 정의한다. 

class Person:
   def set_info(self, name, age):
      self.name = name
      self.age = age

여기서 self의 역할이 어떻게 되는지 살펴보자. 

 

Person 클래스를 이용해서 객체를 만든다.

mike = Person()

 

mike 라는 객체를 만들었고, set_info() 메소드를 사용하여 해당 객체의 기본정보를 입력한다. 

mike.set_info("Mike", 20)

 

이제 self의 역할에 대해서 이해할 수 있다. 

 

만약 self.name과 self.age가 없다면,

set_info()에 전달되는 매개변수는 set_info() 메소드를 사용하기 위한 매개변수에 불과하다.

 

해당 매개변수가 해당 객체의 정보라는 것을 표시하기 위해서는 매개변수의 값을 객체에 바인딩 또는 매핑을 시켜줘야 한다.

 

이 과정을 위해 사용하는 것이 self라는 개념이다. 

self.name 과 self.age를 사용하므로써, mike라는 객체가 name과 age라는 매개변수의 값을 소유할 수 있게 되는 것이다.  


3. Self는 객체 그 자체다.

위에서 self의 개념에 대해서 알아보았다.

그렇다면 정확하게 self란 무엇인지 더욱 깊게 파고들어가보자.

 

다음과 같이 클래스를 만들어준다.

class Foo:
  def func1():
    print("function 1")

  def func2(self):
    print("function 2")

 

foo라는 클래스를 이용해 각 메소드를 호출해보면 다음과 같은 결과를 확인할 수 있다.

각 메소드를 호출할 때, 모두 매개변수 없이 메소드를 호출하였다.

하지만 func2()는 제대로 작동하는 반면, func1()은 매개변수를 받을 자리가 없는데 매개변수 1개가 전달되었다는 에러가 발생한다. 

여기서 self의 기능을 확인해볼 수 있다. 

 

 

Foo 클래스의 메소드를 약간 수정해주자. 

class Foo:
  def func1():
    print("function 1")

  def func2(self):
    print("function 2")
    print("self =", id(self))

위의 스크린샷에서 확인할 수 있듯이, self의 id값(= 메모리 주소값)과 foo의 id값이 동일한 것을 확인할 수 있다. 

이 말은, 객체 이름(foo)에 바인딩 되어있는 메모리 주소값을 self를 통해 받아온다는 의미다. 

이 과정을 통해 동일한 클래스를 사용하여 생성한 여러 객체를 구분할 수 있게 되는 것이다. 

 

즉, 객체를 생성할 때마다 새로운 메모리 주소값이 바인딩되고,

객체명(foo)에 바인딩 되어있는 메모리 주소값을 self를 통해 읽어오는 것이다. 

 

* 정확히 얘기하자면 객체가 저장되어 있는 메모리 영역의 시작 주소값이 바인딩 된다.

 

위에서 foo 객체를 통해 func1()을 사용할 때, 매개변수가 없음에도 매개변수 1개가 전달되었다는 에러 메세지를 확인할 수 있었다. 

이는 눈에 보이지는 않지만, 객체의 메모리 주소값이 넘어간다는 것을 의미한다. 

 

a) self를 사용하는 이유

앞서 설명했듯이, 동일한 클래스로 생성된 여러개의 객체를 구분하기 위해서다. 

각각의 객체마다 갖고있는 정보가 다르기때문에, 각 객체마다 고유한 메모리 영역을 보유하는 것이다.

 

 

 

 

댓글