본문 바로가기
관리자

Programming-[Backend]/Python

객체지향 프로그래밍 : 파이썬 생성자, Decorator 예제

728x90
반응형

 

이번 글은 Python을 통한 객체지향 프로그래밍의 기본 개념을 설명한다.

Javascript로 객체지향 프로그래밍의 기본 개념을 파악하고 싶다면, 이 글을 읽은 후 다음 글들을 참조하면 된다.

 

-Javascript / 기초 / 객체지향 (Object-oriented)

-Javascript / 기초 / Inheritance, Object - oriented (상속, 객체지향)

 


 

 

1. 기본개념

 

객체 : 속성과 행동으로 이루어진, 세상에 있는 모든 존재를 나타낸다.

ex) 객체 : 자동차 w/ (속성 : 자동차의 색깔, 행동 : 앞으로 나감)

 

객체지향프로그래밍(Object Oriented Programming, OOP) : 객체들간의 소통으로 프로그래밍을 바라보는 것

ex) 게임에서는 캐릭터 객체, 총 객체, 장비 객체 등이 있을 수 있다.

캐릭터는 속성으로 체력, 성별 등이 있을 수 있고 행동으로는 총을 든다, 달린다, 앉는다 등이 있을 수 있다.

 

객체지향 프로그래밍은 객체를 만드는 틀로써 class를 사용한다. class 안에 attribute와 method를 정의한다.

예시문은 '파이썬으로 쉽게 풀어쓴 자료구조-최영규, 천인국 지음' 서적 참조

attribute로 color, speed를 정의하였고 method로 speedUP을 정의하였다.

객체지향 프로그래밍이 class 내부에 attribute와 method가 있는 것과 다르게,

attribute은 class 내부에 있더라도 method는 함수의 형태로 class 바깥에 위치하여 함수로 표현되는 프로그래밍 방법을 절차 지향 프로그래밍이라고 한다. 대표적인 프로그램 언어로는 C언어가 있으며, C언어에서는 데이터를 함수를 중심으로 순서대로 처리한다.

 

다시 말해 데이터(attribute)와 함수(method)가 묶인 객체라는 개념이 있고, 객체가 프로그래밍에서 주체로 행동한다면 객체지향프로그래밍, 객체 개념이 없고 함수가 코드 내에서 주체로 동작한다면 절차지향 프로그래밍이라고 보면 된다.

 

 

 


 

2. 객체 생성하기

class 내부의 __init__, self. 등은 뒷부분에서 다룬다. 아래 사진에서 class와 car1, car2만 일단 보자.

 

 

'변수 = class이름(attribute)' 로 객체를 생성할 수 있다. 이렇게 함으로써 Car()라는 Class가 호출되어 car1, car2 라는 객체를 만들어준 것이다. VS code의 안내창을 보면, 객체에 attribute가 color와 speed가 있으니 입력을 하라고 나옴을 알 수 있다.

 

여기서 car1, car2등의 변수를 Instance라고도 부르는데, 객체(Object)와 약간 다르다.

객체는 소프트웨어 세계에 구현할 대상을 뜻하며, Instance는 메모리에 할당된 객체의 실체를 나타내는 것이다.

 

-> 객체는 소프트웨어에서 활용할 대상을 정의해놓은 것이고, 인스턴스는 객체를 구현한 실현체이다. 1개의 객체를 기반으로 여러 개의 인스턴스를 만들어서 프로그램에서 동작하도록 할 수 있다. 예를 들어 Car1()은 @12ksa 메모리 주소를 갖는 인스턴스이고, Car2()는 @#13kr1 메모리 주소를 갖는 인스턴스로 생성된다.

 

 


 

 

3. 인스턴스 생성하기

 

 3-1. __init__ method

위의 사진과 같이 __init__ method를 사용하여 class 안에 method를 정의한다.

Under bar 2개가 앞뒤로 들어간 이런 method를 magic method 혹은 special method라고 한다.(=특수메소드)

double underbar 가 있으므로 줄여서 Dunder(던더) method 라고도 한다.

 

Dunder method는 특정 상황에서 자동으로 호출되는 특징이 있다.

특히, __init__은 instance가 생성될 때 자동으로 호출된다!(생성자)

 

__init__이 아니라 다른 method를 활용하면 아래와 같이 car1 이라는 instance를 만들어 준 다음에,

car1에 method를 따로 활용하여 attribute를 지정해줘야 한다.(Setter)

 

__Init__이 아닌 다른 method(MakeCar) 적용 시, Instance 생성 후 method로 attribute 부여

 

하지만 아래와 같이 __init__ method를 활용하면 car1이라는 instance를 생성함과 동시에 attribute를 설정해줄 수 있다.

 

__init__ method 적용 시

 

 

 3-2. __str__ method

__str__ method는 print 함수를 호출할 때 자동으로 호출된다.

__str__ method를 쓰지 않는 경우(A)와 쓰는 경우(B)로 비교해보면,

 

A. Instance를 바로 출력하는 경우

car1 Instance를 출력(print)
결과 : Instance의 값 자체가 나옴(메모리 저장 주소)

 

B. Dunder str method 적용 후 Instance를 출력하는 경우

 

Dunder str method를 적용하고 car1 Instance 출력
Dunder str의 return값 출력

 


 

4. Class 변수

 Class내의 각 Instance가 갖는 값들이 아니라, Instance의 값들을 통합하여 Class에서 한 개의 값으로 나타낼 수 있는 것이 Class 변수이다. 예를 들면, 아래와 같이 총 생성된 Instance의 개수를 표현하는 count 변수를 만들 수 있다.

 

*instance들의 갯수인 '3'

 


 

 

5. Decorator

 

Decorator는 다른 함수에 특정 기능을 추가해주는 함수를 의미한다.

 

아래 예시에서 볼 수 있듯이, 어떤 method를 정의할 때(예시에서는 func1), 미리 정해진 다른 함수(예시에서는 Deco)의 기능을 바로 추가해주는 것이라고 보면된다.

여러 개의 method를 생성할 때마다(ex. func1, func2...) 계속해서 특정 기능을 추가할려면 code가 길어지고 가독성이 떨어지므로, 각 method가 공통적으로 사용하는 부분은 Decorator 형식으로 묶어서 사용하는게 좋다.

 

Decorator는 method를 정의할 때 위에 "@" 표시를 해줌으로써 사용이 가능하다.

출력 결과

728x90
반응형