Seul Lee

Mathpresso 서버 개발자

Navigation
 » Home
 » Github
 » XML Feed

Object Oriented Programming with Python, 01

05 Mar 2017 » python, concept

Object Oriented Programming, 객체 지향 프로그래밍, 줄여서 OOP

OOP는 말 그대로 객체 중심으로 프로그래밍을 설계하고 구현하는 것을 말한다. 실제 세상의 객체를 추상화하여 컴퓨터 논리 구조로 바꾼다고 얘기하는데, 단지 생산성 측면에서 향상을 위해 탄생한 것이라고 보는 것이 맞는 것 같다. 구현과 유지보수를 단순하게 만들어주고, 절차적 방법론 보다 직관적으로 코드를 짤 수 있게 해주는 역할을 한다.

Python이 멀티 패러다임 언어인 만큼 객체지향 또한 지원하는데 Python에 녹아있는 객체지향적 특징 몇가지를 살펴보고자 한다.


1. Class 기본 구조


Python에서 class는 class라는 키워드로 정의하여 사용할 수 있다.

class Person: # python2.2 이상에서는 Person(object): object는 Python 최상위 클래스
    def __init__(self, name):
        self.name = name
    
    def __str__(self):
        return self.name

p1 = Person("lee")
p2 = Person("yeo")

print(p1)
print(p2)
결과값:
lee # print(p1.__str__()) 와 결과가 같음
yeo # print(p2.__str__()) 와 결과가 같음


1.1 self

Python 클래스의 모든 인스턴스 메소드에는 __init__(self, name), __str__(self)처럼 self가 메소드의 첫번째 매개 변수로 항상 지정되어야한다.

self의 역할은 메소드에 인스턴스의 참조점을 넘겨주는 것이다. 예를 들어 p1.__str__()과 p1.__str__(p1)의 결과는 같다. 전자 self가 정의되어있기때문에 묵시적으로 p1를 __str__에 인자값으로 넘겨주기때문이고 후자의 경우 명시적으로 인스턴스 값을 넘겨준다.

Person.__str__(p1) # p1.__str__()와 결과 같음
Person.__str__(p2) # p2.__str__()와 결과 같음
# 클래스로 명시적으로 인스턴스를 넘겨서 호출 가능 


1.2 init(self)

__init__은 Java의 생성자와 같은 역할을 한다. 객체 생성시 할당하고 싶은 인스턴스 멤버들을 매개변수로 설정할 수 있다. default값이 __init__(self)이므로 생성시 초기화하고 싶은 인스턴스 멤버가 없을 경우 정의해주지 않아도 동일하게 동작한다.

만약 생성시에 초기화하고 싶은 인스턴스 멤버 변수가 있을 경우 __init__(self, name, ….) 등으로 설정하여 생성할 때 값을 항상 받도록 지정할 수 있다.

1.3 Special Method(Magic Method)

Python에는 __init__, __str__처럼 더블 언더 스코어(_)가 앞뒤로 붙는 함수가 존재한다. 이걸 Special Method 혹은 Magic Method라고 한다. 기본적으로 class를 생성할 때 모두 상속되며 재정의(overriding)하여 사용할 수 있습니다.

__new__
__init__
__del__
__repr__
__str__
__format__
__getattr__
__setattr__
__delattr__

등 수십개의 Special Method가 존재한다.