본문으로 바로가기

Python: Class02

category Programming/Python 2021. 1. 25. 21:11
반응형

지난 글에서 파이썬의 클래스와 멤버 변수, 그리고 메소드에 관한 내용을 살펴보았다. 그리고, 클래스의 멤버 변수가 스태틱 변수와 비슷한 성격을 가진다는 점도 알아보았다. 오늘은 이전 글에 이어서 객체의 멤버 변수와 생성자에 관한 내용을 살펴보려고 한다.

위 그림은 지난 글의 마지막 부분에 삽입된 그림으로, 클래스의 멤버 변수가 마치 스태틱 변수와 비슷한 성격을 가진다는 점을 보여주고 있다. 다시 말해, 우리가 흔히 알고 있는 멤버 변수와는 약간 다른 특성을 가지고 있다는 의미이다. 이런 현상은 위 그림에서 선언된 멤버 변수가 말 그대로 클래스의 멤버 변수이기 때문에 나타나는 현상이다.
그럼 우리에게 익숙한 멤버 변수는 파이썬에서 지원하지 않는가하면, 그건 또 그렇지 않다. 좀 더 정확히 표현해서, 지금까지 설명한 멤버 변수는 클래스의 멤버 변수이고, 객체의 멤버 변수를 정의하면 우리가 흔히 알고 있는 멤버 변수로 사용할 수 있다.

클래스 내부 메소드의 매개변수 중에서 self에 관한 내용을 지난 글에서 위 그림과 함께 설명하였다. 그 과정에서 self가 객체를 의미한다고 이야기 했듯이, 멤버 변수 앞에 self를 붙여주면 우리가 원하는 객체의 멤버 변수를 정의할 수 있다.

하지만, 무턱대고 멤버 변수 앞에 self를 붙여주면 위 그림과 같이 self라는 이름은 정의되지 않았다는 내용의 에러가 발생한다. 앞에서 이야기한 대로, self가 객체를 의미하는 키워드이긴 하지만, 매개변수로 정의하였을 때 객체를 의미한다는 것이지, 그냥 self 자체가 객체를 의미하는 것은 아니므로, 위 그림과 같은 에러가 발생한다.

지금의 이 내용을 바꿔서 생각하면, 객체의 멤버 변수는 메소드 안에서 정의가 가능하다고 이해할 수 있다. 그리고, 위 그림에서 볼 수 있듯이 객체끼리 데이터를 공유하지 않는 멤버 변수가 정의되었음을 확인할 수 있다.

정리하자면, 메소드 외부에서 선언하는 변수는 클래스의 멤버 변수로, 객체간 데이터 공유가 가능한 속성을 가지고 있고, 객체의 멤버 변수self 매개변수를 통해 메소드 안에서 정의할 수 있다.

어떤 멤버 변수라 하더라도, 지역 변수와 구분이 어렵기 때문에 메소드 안에서 변수의 이름만으로는 참조할 수 없다. 그래서, 위 그림과 같이 self 등의 키워드를 앞에 붙여서 사용하는데, self 자체가 객체를 의미하므로 클래스의 멤버 변수에 self를 붙여서 참조하는 것은 권장하지 않는 방법이다.

그런 이유로, 클래스의 멤버 변수를 메소드에서 참조할 때는 위 그림처럼 self 대신 클래스의 이름으로 참조한다.

다시 이야기를 원점으로 돌려서, 객체의 멤버 변수는 메소드를 통해 정의한다고 이야기하였다. 그것은 객체의 정의와 함께 멤버 변수를 정의하는 메소드를 호출해주어야 클래스 내부의 다른 메소드들을 사용할 수 있다는 의미이다. 아주 당연한 소리이긴 한데, 객체를 생성할 때마다 멤버 변수를 정의하는 메소드를 매번 같이 호출해주어야 한다는 것은 생각보다 귀찮을 일이 될 것이다. 클래스의 멤버 변수처럼, 객체를 생성하는 것과 동시에 멤버 변수가 정의되면 편할텐데 말이다.

이럴 때, 생성자 메소드를 클래스에 추가해주면 객체를 정의하는 동시에 멤버 변수도 함께 정의될 수 있다. 파이썬에서 클래스의 생성자 메소드는 위 그림과 같이 __init__ 이라는 이름을 공통적으로 사용한다. 그리고 생성자 메소드 안에 정의되는 변수는 모두 객체의 멤버 변수로 사용할 수 있다.

생성자 메소드는 다른 메소드와 달리 객체를 정의하는 과정에서 자동으로 호출되는 메소드이다. 그래서 생성자 메소드를 따로 호출해주는 일이 거의 없다. 그런 이유로, 생성자 메소드는 객체의 멤버 변수를 정의하는 역할과 동시에 객체가 정의될 때 처리되어야 하는 초기 셋팅과 같은 작업을 많이 담당한다.

 

 

반응형

'Programming > Python' 카테고리의 다른 글

Python: Class04  (0) 2021.01.27
Python: Class03  (0) 2021.01.26
Python: Class01  (0) 2021.01.24
Python: Try & Exception  (0) 2021.01.22
Python: Function (5)  (0) 2021.01.20