본문 바로가기
프로그래밍/Python

파이썬 문법 9 - 클래스(class) 만들기

by pentode 2018. 4. 9.

파이썬은 객체지향 프로그래밍(Object Oriented Programming)을 할 수 있는 클래스 (class)를 지원합니다.

 

 

지금까지 봐왔던 데이터를 정의하고, 함수를 이용해서 데이터를 변형하여 원하는 결과를 얻는 형태의 프로그래밍 방식을 절차지향 프로그래밍 이라고 합니다.

 

>>> data = [4,1,5,3,2]
>>> data = sorted(data)
>>> data
    [1, 2, 3, 4, 5]
>>>

 

객체 지향 프로그래밍은 먼저 객체를 정의합니다. 객체는 멤버 변수(데이터)와 멤버 메소드(자신의 상태(데이터)를 변경하는 함수) 로 구성되어 집니다. 이러한 객체들이 서로 상호작용하여 객체의 상태가 바뀌어 원하는 결과를 얻는 프로그램 방식이 객체지향 프로그래밍 입니다.

 

>>> data = [4,1,5,3,2]
>>> data.sort()
>>> data [1, 2, 3, 4, 5]
>>>

 

지금까지 클래스(class)객체(object)라는 단어를 사용했습니다. 한가지 더 추가하자면 인스턴스(instance) 라는 단어가 있습니다. 각각에 대해서 알아보겠습니다.

 

클래스(class)는 프로그램이 실행되었을 때 생성되는 객체가 어떤 멤버변수와 메소드를 가지는지 정의해둔 것을 말합니다. 파이썬 프로그램이 실행되면 클래스 정의는 메모리로 로드되어 그 정의에 기반한 객체를 생성할 수 있도록 준비가 됩니다.

 

인스턴스(instance)는 클래스 정의로부터 실제 객체를 생성한 것을 인스턴스라고 합니다.

 

지금까지 객체라는 단어를 여기저기에서 계속 사용해왔습니다. 객체는 개념적인 말로 실제 만질 수 있는 사물, 어떤 추상적인 개념, 클래스의 인스턴스 등 인식할 수 있는 모든 것을 통칭하는 말이라고 할 수 있습니다. 객체지향 프로그래밍에서 인스턴스와 객체라는 단어는 일반적으로 혼용해서 씁니다.

 

 

파이썬에서 클래스(class)를 정의하는 방법에 대해서 알아보겠습니다.

 

>>> class MyClass:
        name = "MyName"
        def print(self, str):
           print(self.name + " " + str)

>>> x = MyClass()
>>> x.print("Hello, Python")
    MyName Hello, Python
>>> x.name
    'MyName'
>>>

 

클래스의 선언은 class 로 시작해서 뒤에 클래스 이름을 적고 콜론(:)으로 행을 마칩니다. 그 뒤부터 클래스의 멤버와 메소드들은 들여쓰기 해서 적습니다. 클래스의 끝은 들여쓰기가 class와 같은 레벨이 나오는곳에서 끝납니다.

 

메소드는 일반적인 함수와 같은 형식으로 작성을 할 수 있는데, 한가지 차이점은 함수의 인자중에 첫번째는 반드시 self 이어야 합니다. 이 인자는 메서드를 호출할 때는 없는것처럼 사용됩니다. self의 의미는 클래스 자신을 가리키는 것입니다. 메소드 호출시 파이썬이 내부적으로 클래스 자체의 참조를 넘기게 됩니다.

 

클래스의 사용은 x = MyClass() 처럼 객체를 인스턴스화 하고(객체를 생성하고) 사용하면 됩니다.

 

사용은 x.print("Hello, Python") 에서 처럼 객체 변수에 마침표(.) 를 사용해서 멤버를 사용하게 됩니다.

 

MyClass의 두가지 멤버인 name 멤버변수와 print 메소드는 기본적으로 public 입니다. 이 의미는 외부에서 바로 접근하여 사용할 수 있다는 뜻 입니다. 완전히 공개되어 있다는 의미에서 public  이라고 합니다.

 

클래스를 생성할 때 필요한 값을 줄 수 있는 생성자로 __init__() 메소드가 제공 됩니다. 사용법을 보겠습니다.

 

>>> class MyClass:
        name = "MyName"
        def __init__(self, name):
            self.name = name
        def print(self, str):
            print(self.name + " " + str)

>>> x = MyClass("Hong Gil Dong")
>>> x.print("Hello, Python")
    Hong Gil Dong Hello, Python
>>>

 

__init__(self, name): 에서 처럼 생성자에도 항상 첫 번째 인자로 self 를 지정합니다. 두 번째 인자로 주어진 name은 멤버의 name 과 이름이 같지만, 멤버는 self.name 으로 구분을 할 수 있습니다.

 

클래스를 정의하고, 사용하는 기본적인 방법을 알아보았습니다.

반응형