오늘 파이썬에 대해 알아볼 내용은 클래스이다. C#과 자바에서 이야기하는 그 클래스가 맞고, 파이썬도 클래스를 지원한다.
클래스를 정의할 때는 위 그림과 같이 class라는 키워드를 이용한다. 이렇게 생성된 클래스는 4번 라인의 코드처럼 객체로 지정하면서 실체화된다.
다른 프로그램 언어에서도 그러하듯이, 파이썬의 클래스도 멤버 변수와 메소드를 가진다.
이전 예제에서 pass 부분을 지우고, iVar라는 변수 하나를 선언해보자. 이렇게 선언된 iVar는 clsExample 클래스의 멤버 변수가 된다. 그리고 정의된 멤버 변수는 클래스 외부에서 생성된 객체를 통해 참조할 수 있다.
클래스에서 멤버 변수는 실체화된 객체의 속성을 정의하고 기억하는 용도로 많이 사용된다.
예를 들어, 위 그림과 같은 붕어빵 기계와 붕어빵을 생각해보자. 붕어빵을 만들어내는 기계 (클래스) 자체는 음식으로써 아무런 역할을 하지 못한다. 하지만, 기계를 통해 붕어빵 (객체)을 만들어냈을 때, 만들어진 붕어빵이 음식으로써의 역할을 비로소 할 수 있게 된다. 그래서, 클래스와 객체를 설명할 때 예전부터 붕어빵 기계와 붕어빵을 예로 많이 사용하였다.
같은 기계에서 만들어진 붕어빵이라고 해서, 모두 같은 붕어빵이라고 할 수는 없다. 붕어빵 틀에 부어진 반죽의 양이 달라질 수 있고, 들어간 앙꼬의 종류나 양이 달라질 수 있다. 그리고, 얼마의 열이 얼마나 가해졌는지에 따라서도 붕어빵의 특성은 얼마든지 달라질 수 있다. 이것을 클래스와 객체의 개념으로 생각해본다면, 같은 클래스의 객체라 하더라도 모두 같을 수는 없다는 의미이다. 그리고, 같은 기계에서 만들어진 붕어빵들이 모두 같을 수 없는 여러 이유들이 일종의 멤버 변수와 매칭될 수 있다.
붕어빵 틀에 반죽을 부어주거나, 앙꼬를 넣어주는 등의 행동을 해야지만 제대로된 붕어빵을 만들 수 있다. 클래스에서도 이러한 행위를 정의할 수 있고, 이것을 Method라고 부른다.
클래스의 메소드를 정의하고 있는 4번과 5번 라인의 코드를 보면, def 이라는 키워드로 시작해서 매개변수를 가지고 있는 모양새까지, 펑션을 정의하는 것과 일치하는 것을 알 수 있다. 그리고, 이렇게 정의된 메소드는 클래스의 멤버 변수를 참조하는 것과 같은 방식으로, 객체와 함께 호출할 수 있다. 하지만, 예제 프로그램에서 setData 메소드는 분명 2개의 매개변수를 가지고 있지만, 실제 메소드를 호출하는 9번 라인에서는 하나의 데이터만 전달하고 있고, 프로그램은 에러 없이 정상적으로 완료되었다.
파이썬에서 클래스를 사용할 때는 self라는 키워드를 아주 많이 사용한다. 그리고, self는 파이썬만이 가지고 있는 독특한 특징이기도 하다. 우리가 알고 있는 펑션에 대한 관점으로 메소드를 호출한다면, 위 그림과 같이 클래스 이름과 메소드 이름으로 메소드를 호출하고, self 매개변수 위치에 객체를 전달해야 한다. 다시 말해, self는 객체라는 의미이다.
이 내용을 바탕으로 예제 프로그램의 5번 라인을 보면, 메소드를 호출할 때 전달되는 데이터 (var)를 exam01 객체의 멤버 변수 (iVar)에 할당하라는 의미가 된다.
그런데, 지금까지 이야기한 방법은 한 가지 문제가 있다. 위 그림에서 보면, clsExample 클래스의 객체로 exam01과 exam02를 생성하였고, 그 중 하나의 객체에만 putData 메소드 호출을 통해 멤버 리스트를 변경하였다. 하지만, 각각의 객체를 통해 참조한 멤버 리스트가 모두 변경되었음을 확인할 수 있다.
마치 같은 클래스의 객체들이 데이터를 공유하는 것과 같은 현상이 나타나는 이유는 지금까지 설명한 멤버 변수는 클래스의 멤버 변수이기 때문이다.
클래스의 멤버 변수는 위 그림의 설명처럼 마치 스태틱 변수와 같은 속성을 갖는다. 그래서, 흔히 알고 있는 멤버 변수와는 약간 다른 특성을 보이는 것이 바로 이 이유 때문이다. 그럼 일반적인 멤버 변수는 어떻게 생성하는지.... 에 대해서는 다음 글에서 알아보도록 하자. ㅎㅎ
'Programming > Python' 카테고리의 다른 글
Python: Class03 (0) | 2021.01.26 |
---|---|
Python: Class02 (0) | 2021.01.25 |
Python: Try & Exception (0) | 2021.01.22 |
Python: Function (5) (0) | 2021.01.20 |
Python: Function (4) (0) | 2021.01.19 |