클래스와 자료형

파이썬은 소위 객체 지향 프로그래밍을 지원하는 언어이다. 이 강좌에서는 객체 지행 프로그래밍의 정체를 논하지 않는다. 다만, 객체 지향 프로그래밍의 핵심 요소인 클래스(class)와 인스턴스(instance)를 어떻게 정의하고 활용하는지 예제 두 개를 이용하여 보여준다.

앞으로 클래스와 인스턴스를 수 없이 보고 사용할 것이다. 사실, 지금까지도 많은 클래스와 인스턴스를 살펴 보았다.

클래스의 활용

클래스는 크게 세 가지 방식으로 사용된다.

  1. 자료형 및 관련 메서드 정의: 여기에서 주로 사용되는 방식이며, 앞서 언급한 클래스들이 여기에 해당한다.
  2. 서로 관련된 기능을 갖는 변수와 함수들의 모둠, 일종의 도구 상자
  3. 동일한 기능을 갖는 객체를 쉽고 다양한 방식으로 생성할 수 있도록 도와주는 기계틀 역할을 수행하는 도구: 게임 프로그래밍 등에서 게임 캐릭터, 배경, 도구 등을 쉽게 생성할 때 기본적으로 사용되는 방식이며, 여기서는 다루지 않는다.

A. 자료형과 메서드 정의 예제: 집합 클래스 구현하기

집합 자료형인 set이 없다고 가정하고 직접 집합 자료형을 MySet 클래스를 이용하여 정의해보자.

매직 메서드

이닛(__init__()), 레퍼(__repr__()) 메서드처럼 두 개의 밑줄(underscores)로 감싸인 메서드를 매직 메서드(magic methods)라 부르며, 모든 파이썬 클래스에 동일한 이름으로 포함되어 있다. 기타 많은 매직 메서드가 존재하며 명시적으로 선언되지 않은 매직 메서드는 모든 클래스에서 동일하게 사용되는 기본 함수가 자동으로 지정된다. (대부분은 아무 것도 하지 않는 함수로 지정됨.)

클래스와 인스턴스

1, 2, 3을 원소로 갖는 MySet을 다음처럼 리스트를 이용하여 생성한다.

사실 거의 임의의 이터러블 자료형을 이용하여 MySet 객체를 만들 수 있다. 아래 코드는 집합을 이용한다.

여기서 변수 s에 할당된 값을 MySet 클래스의 객체 또는 인스턴스라 부르며, 이 경우에는 특별히 MySet 자료형이라 부를 수 있다. set 클래스의 인스턴스를 집합 자료형이라 부르는 것과 동일하다.

__init__() 함수의 역할

MySet 클래스의 객체를 선언하면 파이썬 내부에서 __init__() 메서드가 호출된다.

기타 메서드 활용

이제 MySet 자료형인 s에 원소를 추가/삭제하는 방법과 결과를 확인해보자.

B. 도구 상자 모둠 예제: 클릭수 세기

웹페이지의 방문자 수를 확인하는 앱을 구현하고자 할 때 아래 도구들이 필요하다.

언급한 변수 한 개와 네 개의 도구를 포함한 일종의 도구상자를 아래 CountingClicker 클래스로 구현한다.

아래 코드를 실행하면 CountingClass의 인스턴스를 하나 생성하면 앞서 언급한 변수 한 개와 네 개의 도구를 포함한 하나의 도구상자를 얻게 되며, 도구상자의 이름은 clicker이다.

clicker 도구상자에 포함된 도구, 즉 특정 메서드를 이용하려면 아래와 같이 실행한다.

clicker.메서드이름(인자,....)

먼저 클릭수가 0으로 초기화되어 있음을 확인하자. 이유는 아무도 클릭하지 않았기 때문이다. 실제로 clicker 도구상자를 생성할 때 호출되는 __init__ 메서드의 인자가 지정되지 않아서 count 매개변수의 키워드 인자로 기본값인 0이 사용되어, self.count 변수에 할당되었다.

인스턴스 변수

이제 클릭을 두 번 했다가 가정하자. 즉, click 메서드를 두 번 호출되어야 한다.

그러면 클릭수가 2가 되어 있어야 한다.

이제 클릭수를 초기화하자.

그러면 클릭수가 다시 0이 되어야 한다.

클릭수를 지정하면서 CountingClicker의 인스턴스를 생성할 수 있다.

클릭수가 50으로 설정되었음을 확인할 수 있다.

지금까지 CountingClicker의 인스턴스는 두 번 생성되었음을 아래 결과가 보여준다.

클래스 상속

부모 클래스로부터 모든 기능을 물려받을 수 있는 자식 클래스를 상속을 이용하여 선언할 수 있다.

예를 들어, 클릭수를 초기화할 수 없는 자식 클래스 NoResetClicker를 아래와 같이 선언한다. 클릭수 초기화 기능을 없애기 위해서는 reset 메서드를 재정의(overriding)해야 한다.

이제 NoResetClicker의 인스턴스를 생성한 후 클릭수 초기화가 이루어지지 않을 확인할 수 있다.

리셋이 작동하지 않습니다.

자식 클래스의 인스턴스가 만들어져도 부모 클래스의 인스턴스 카운트가 올라간다.

객체 생성횟수를 초기화하면 _total_count의 값이 0으로 된다.