프로그래밍 언어/python

[python] 객체 지향 프로그래밍 1 - Object oriented python

이현찬 2022. 8. 8. 23:23
728x90

출처 : pixabay

객체 지향 프로그래밍은 왜 쓸까?

파이썬 수업을 처음 들을 때 파이썬의 창시자가 크리스마스에 할 일이 없어 만든 언어라는 것과 함께 듣는 내용이 "python은 객체 지향 언어다" 라는 말이다. 그런데 python을 사용하다보면 object나 class를 사용하지 않아도 필요한 코드를 작성하는데 큰 문제가 없다. 그런데 만약 $^{1)}$다른 사람들과 협업을 하거나 $^{2)}$혼자라도 다루기 어려울 정도로 복잡한 프로그램을 작성하게 된다면 Object-oriented programming이 필요하게 될 것이다.
object는 현실의 대상을 모델링해 class를 정의하고 한번 정의된 class를 재사용해 여러 개의 instance를 생성하기 때문에 코드 작정 중 실수를 줄이고 사람이 이해하기 쉬운 코드를 작성할 수 있는 프로그래밍 패러다임이다. python에서 class를 사용하게 되면 다음과 같은 장점들이 있다.

  • 데이터나 자료와 그것을 처리하는 방법들을 한 곳에 모아놓을 수 있음
  • 프로그램을 모듈화하기 편리해 유지 보수 관점에서 유리함
  • 프로그램의 기능들을 분리해 스파게티 코드를 방지할 수 있음

객체 지향 프로그래밍 용어

객체 지향 프로그래밍에 사용되는 용어들은 아래 표과 같이 정리할 수 있다. Class, object, instance 용어들이 헷갈릴 수 있다. 세 가지 용어를 잘 설명해 놓은 포스팅을 참고하자.

용어 설명
Class 객체(object)를 생성할 수 있는 틀
Methods 클래스의 일부인 함수
Attributes 클래스의 일부인 변수
Object Class로 정의해 구현할 대상 - 다소 개념적인 용어
Instance 변수(메모리)에 할당되어 구체화 된 실체
Inheritance 다른 클래스로부터 method와 attribute등을 받아오는 것
Composition 다른 클래스의 기능을 가져와 새로운 객체를 만드는 것

Class 구현

지금부터 파이썬에서 클래스의 요소들을 구현하는 코드를 정리한다.

Class 선언 - 기본

  • line 1 클래스는 class class_name:을 시작으로 선언하게 되고 클래스 이름의 첫 글자만 대문자로 적는 것이 convention이다.
  • line 2 __init__(self, arg):는 예약어로 클래스가 선언될 때 호출되는 함수다. 여기서 self는 선언된 class 자기 자신을 나타내는 변수를 넣는 자리로 class 내에서 method를 선언 할 때 항상 넣어주어야 한다. self로 넣는 것이 convention이지만 원하는 이름을 넣어도 상관 없다. 보통 init method에서 초기화 할 때 받을 attribute를 선언한다.
  • line 5 ~6 b1b2는 Book object가 구현된 instance이다. 각각의 instance에는 title이라는 attribute가 있는데 이에 접근하기 위해서는 b1.title, b2.title과 같이 instance_name.attribute_name으로 접근할 수 있다.

Class 선언 - 거의 모든 것

  • line3 class variable은 method 밖에 정의된 변수로 instance가 생성될 때 전달되고, instance name 뿐만 아니라 class name으로도 접근 가능하다
    • Book.order로 class variable에 접근 가능하다는 뜻
    • __init__ 메소드의 line18을 보면 인스턴스가 하나 생성될 때 마다 order가 하나씩 증가되는데 여기서 계산된 결과가 다음 instance에까지 영향을 준다. line35~37의 결과를 보면 확인 가능하다.
  • line6 static method@staticmethod라는 decorator를 메소드 앞에 선언해 정의할 수 있다. static method는 클래스 외부에서 접근해 사용할 수 있는 함수를 class 내부 정보를 활용해 사용하고자 할 때 사용할 수 있다.
    • (line44)에서 보는 것 과 같이 외부에서는 그냥 함수라고 생각해도 된다.
  • line10 class method@classmethod라는 decorator를 메소드 앞에 선언해 정의할 수 있다. class method는 class variable를 다루기 위해 사용하고, 함수의 첫 인자로 들어가는 cls는 instance가 아니라 class 자신을 칭한다.
    • line33을 실행하면 class variable인 order가 0으로 바뀌고 이후에 생성된 b3에 반영된 것을 볼 수 있다.
  • line21 hasattr함수는 instance가 어떤 attribute를 가지고 있는지 확인하는 함수다.