파이썬 클래스 | 파이썬 독학 7-1

클래스는 초보자들이 가장 이해하기 어려운 주제 중에 하나입니다.

파이썬 클래스는 객체지향프로그래밍(Object Oriented Programming)에서 멤버의 속성과 메소드를 묶어놓은 하나의 단위입니다.

여기까지만 이야기해도 벌써 어렵게 느껴집니다.

객체지향프로그래밍은 대학에서도 여러 학기에 걸쳐서 강의하는 주제입니다. 진지하게 공부하려면 자바와 함께 배우는게 좋습니다.

다행히 100% 객체지향 프로그래밍을 지향하는 자바와 달리 파이썬은 굳이 클래스를 사용하지 않아도 충분히 원하는 기능을 구현할 수 있습니다.

그런데 왜 클래스를 배워야 하느냐를 생각해보면 파이썬의 외부라이브러리들 중에는 tkinter GUI 같이 클래스를 사용하는 모듈도 많습니다.

그러므로 클래스에 대한 기본적인 사용법을 알고 있다면 파이썬을 더 잘 활용할 수 있습니다.

여기서는 파이썬 클래스의 코드 사용법을 중심으로 보겠습니다.

파이썬 클래스
파이썬 클래스

파이썬 클래스 개념

클래스는 여러가지 비유를 통해 설명하고는 합니다. 빵틀이나, 공장에 비유할 수도 있고 동물의 종으로 비교하기도 합니다.

사실 이 세상에 존재하는 모든 사물중에 우리가 객체(Object) 라고 부를 수 있는 모든 것은 클래스(class)로 만들 수 있습니다.

모든 것으로 클래스를 만들 수 있다? 그래서 이해하기 어렵습니다. 우리는 파이썬에서 컴퓨터 코딩을 배우려고 하는데 왜 갑자기 난데없이 객체, 사물에 대한 이상한 이야기를 하는 것이냐는 생각이 들 수 있습니다.

국내의 유명한 자바 교재 중에는 클래스를 설명하는데만 100페이지를 할애하는 책도 있습니다. 짧은 문장으로 줄이기 어렵다는 말이지요.

어쨋든 클래스는 현대 프로그래밍 시스템의 핵심을 이루고 있습니다.

객체지향(OOP) 이전 시대에는 C언어 처럼 함수와 절차를 중심으로 프로그래밍 했었습니다. 재사용이 가능한 코드는 함수였습니다.

함수는 특정 기능을 수행하는 코드 블록입니다. 즉 기능만 담당합니다. 문제는 함수에서 사용하는 데이터가 분리되어 있기 때문에 확장성에 한계가 있습니다.

객체지향언어의 개발자들은 프로그램에 클래스라는 복잡한 개념을 도입하여 함수에 데이터를 연결시키고 코드의 확장성을 넓혔습니다.

클래스의 함수를 메소드라고 하고 데이터(변수)를 속성 혹은 멤버변수라고 합니다.

기술적으로 요약하면 이 정도입니다. OOP에 대해서는 자바나 C++로 별도의 강의를 들어보시기를 추천합니다. 무료 강의들 중에 좋은 강의가 많습니다.

파이썬에서 사용하는 OOP개념도 자바와 비슷합니다.

그렇다면 예제를 통해 클래스를 알아보겠습니다.

class Employee:
    def __init__(self):
        self.id = None
        self.name = None
        self.age = None
        self.salary = None

    def showInfo(self):
        print('ID:', self.id)
        print('Name:', self.name)
        print('Age:', self.age)
        print('Salary:$', self.salary)

john = Employee()
john.id = '1001'
john.name = 'John Johnson'
john.age = 33
john.salary = 50000

john.showInfo()
ID: 1001
Name: John Johnson
Age: 33
Salary:$ 50000

Employee 직원 클래스를 만들어 보겠습니다. 클래스는 쿠키를 구울 때 모양을 내기위한 틀 같은 것이라고 보면 됩니다. 같은 쿠키를 찍어낼 것이니까 클래스는 하나입니다.

여기서 보면 직원이라는 틀에서 직원 ID와 이름, 나이, 연봉의 정보가 들어갑니다. 직원이라면 누구나 이 정보가 있을 것 입니다. 여러명의 직원을 만들 수 있겠죠?

생성자 def __init__(self)

클래스 안에 있는 def __init__(self)는 인스턴스가 생성될 때 실행되는 함수입니다. 초기화, 생성자라고도 합니다.

여기서 self. 가 붙어있는 변수들은 멤버의 변수로써 인스턴스 각자에게 할당합니다. 인스턴스가 2개 있다면 같은 종류의 멤버변수도 각각 가집니다.

self 라는 키워드가 def __init__ ( ) 안에도 들어가 있는데요. self 가 명시하는 것은 인스턴스의 이름입니다. 위의 코드에서 john 이라는 인스턴스를 만들었는데, def __init__(john) 이 실행되는 것입니다.

그러면 john.id, john.name, … 으로 같죠?

이렇게 클래스 정보를 바탕으로 만든 직원을 인스턴스(instance)라고 합니다.

클래스를 사용해 보면 가상세계를 어떻게 창조할 수 있는지 아이디어를 얻을 수 있습니다. 회사라는 가상세계를 컴퓨터에 만들기 위해서 필요한 것은 Employee (직원)을 찍어내는 클래스입니다.

계속해서 사람에 대한 클래스를 만들어 보겠습니다.

class Person:
    pass

jake = Person()
marry = Person()

jake.name = 'Jake'
marry.name = 'Marry'

jake.age = 31
marry.age = 23

print(jake.__dict__)
print(marry.__dict__)
{'name': 'Jake', 'age': 31}
{'name': 'Marry', 'age': 23}

Person 이라는 클래스를 만들고 jake와 marry 라는 인스턴스를 만들었습니다. pass 는 아무 내용이 없을 때 사용합니다.

파이썬 클래스는 이런 것도 가능합니다. 동적타이핑이기 때문에 클래스에 실시간으로 속성을 추가할 수 있습니다.

인스턴스의 __dict__ 로 확인해보면 인스턴스의 속성(멤버변수)이 딕셔너리 형태로 저장되어 있음을 알 수 있습니다. 딕셔너리로 객체에 대한 정보를 매핑을 해놓는 것도 동적타이핑의 특징이라고 할 수 있습니다.

Person class

위 이미지를 보면 클래스는 하나의 설계도이고 이 설계도를 사용해서 인스턴스인 mike 와 jane를 생성합니다. Person 이라는 틀이 있고 이 안에서 개별적인 인스턴스가 만들어져 나옵니다.

인스턴스도 객체라는 말과 함께 사용하는데요. 같은 대상을 달리 부르는 용어가 많으니 혼동하지 않도록 주의합니다.

self 의 설명을 위해 예제 하나를 더 보겠습니다.

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

    def show(self):
        print(self.name, self.age)

mike = Person("Mike", 15)

mike.show()
Person.show(mike)
Mike 15
Mike 15

Person 이라는 클래스에 show 라는 함수가 있습니다. mike 인스턴스에서 .show 의 형식으로 호출할 수 있는데요. 이는 Person.show(mike) 라는 것과 같습니다. 메소드에 self 가 들어가는 것은 인스턴스의 위치에서 클래스의 메소드를 실행하라는 뜻입니다.

왜 클래스가 하나의 틀이고 인스턴스는 그 틀을 가지고 만드는지 설명이 됩니다.

요약

아직 클래스 개념이나 문법에 익숙하지 않아도 걱정할 필요는 업습니다.

파이썬이 아무리 쉬운 언어라도 객체지향프로그래밍의 개념은 깊고 내용은 방대하기 때문에 어느날 갑자기 수업을 들었다고 동영상을 봤다고 잘 이해되지 않을 수 있습니다.

또 자바나 C#처럼 객체를 사용하지 않아도 여전히 파이썬으로 프로그래밍할 수 있습니다.

객체지향을 잘알고 싶으면 꾸준히 프로그래밍을 연습하시기를 바랍니다.

연습을 꾸준히 하다보면 어려웠던 클래스도 어느날 저절로 체득되는 날이 올 것 입니다.

외부참조문서

파이썬 코딩 3-1 | 클래스 | 생성자(Constructor)

Leave a Comment