객체 지향 프로그래밍은 실제 세계의 모습을 프로그램 코드에 그대로 반영하기 위하여 만들어졌습니다. 과거에 시뮬레이션 프로그램을 구현하기 위해 현실 세계의 것들을 프로그래밍 언어로 표현할 필요가 있었고, 이를 위하여 객체지향 프로그래밍 패러다임이 등장하게 됩니다.

객체지향 프로그래밍 패러다임에서는 현실 세계의 물건들을 객체(object)로 표현하고, 객체를 만들기 위한 틀을 클래스(class)로 정의합니다. 기능과 특성의 모음을 변수와 메소드로서 클래스(class)라는 캡슐에 넣고, 클래스를 실체화(instance)하면 객체(object)를 만들 수 있는 것입니다.

사실 객체지향은 프로그래밍 입문자들이 종종 힘들어하는 장벽 중 하나입니다. '클래스가 어려워요'라는 생각은, 실제로 프로그래밍 언어의 요소로서 어려운 게 아니라 객체지향 프로그래밍 패러다임에 대한 이해가 부족하기 때문이므로 패러다임 자체에 대한 학습을 조금 더 하는 것이 좋습니다.

Python의 객체지향

Python은 객체지향을 지원하는 멀티 패러다임 언어입니다. 아래는 Python 클래스의 가장 간단한 예입니다.

아무런 기능도 갖고 있지 않고, 객체지향으로 따지면 정말 '틀'만을 가지고 있는 클래스입니다. 그러나 객체를 생성하는 기능은 가지고 있습니다.

FishBread()의 결과값을 돌려받은 fish_breadfish_bread_2가 객체입니다. 붕어빵을 의미하는 'FishBread'라는 틀(클래스)을 이용해 붕어빵 객체 두 개가 생성되었네요.

생성자와 소멸자, 필드와 메소드

생성자는 객체가 생성될 때 호출되는 메소드이며, 소멸자는 객체가 삭제될 때 호출되는 메소드입니다. 그리고 클래스 필드모든 객체가 공유하는 필드이고, 인스턴스 필드각각의 객체가 별도로 가지는 필드입니다. 생성자와 소멸자, 클래스 필드와 인스턴스 필드, 메소드를 모두 가지고 있는 클래스를 정의해 보겠습니다.

생성자는 __init__ 메소드로 정의(7번 라인)하고, 소멸자는 __del__ 메소드로 정의(17번 라인)합니다. 각각 객체가 생성(27, 28번 라인)되고, 삭제(43번 라인)될 때 호출됩니다. 인스턴스 필드는 self.[variable]처럼 접근(8, 9번 라인)하고, 클래스 필드는 [Class].[variable]처럼 접근(13번 라인)합니다.

한가지 특별한 점은 self 변수인데, 이는 객체 자신을 나타내며 Java의 this와 같습니다. Java와는 다르게 메소드에 self를 명시한다는 점이 조금 특별합니다. 객체에서 메소드 호출 시 자동으로 해당 객체가 self에 채워지며, 이는 Class level로 메소드를 호출하며 객체를 넘겨줄 수도 있다는 것(40번 라인)입니다.

어렵지만, 객체지향이라는 패러다임에 익숙해지길 바라는 수밖에 없습니다.

Python의 모든 요소는 객체

Python의 모든 요소(int, str, bytes, list, tuple과 같은 데이터 타입, 함수 등)는 객체입니다. 따라서 저마다의 인스턴스 필드와 메소드들이 존재합니다.


'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 언더스코어와 magic method  (0) 2018.07.01
[Python] 클래스의 상속  (0) 2018.06.30
[Python] 빌트인 함수  (0) 2018.06.28
[Python] 값으로서의 함수와 lambda  (0) 2018.06.27
[Python] docstring  (0) 2018.06.26

+ Recent posts