본문 바로가기
파이썬/파이썬의 디자인 패턴 공부

01 디자인 패턴 개요: 객체지향 프로그래밍

by David.Ho 2023. 12. 6.
728x90
반응형
알아볼 내용
- 객체지향 프로그래밍의 이해
- 객체지향적 디자인 패턴의 원리
- 디자인 패턴의 종류와 맥락에 대한 이해
- 동적 프로그래밍 언어 패턴
- 생성과 구조, 행위 패턴

 

[객체지향 프로그래밍]

디자인 패턴을 설명하려면 그전에 객제지향 프로그래밍(OOP)의 기본 원리와 특히 파이썬의 객체지향 패러다임을 알아야 한다.

[기본적인 객체지향 설명]
ex.
Car 객체에는
속성: 연료잔량, isSedan, speed, steering wheel, coordinates 등
함수: accelerate() - 속도 조절, takeLeft() - 좌측 변경 등

 

파이썬은 객체지향 언어이다. '파이썬의 모든 것은 객체'라는 말이 있듯이 파이썬의 클래스 인스턴스변수개별적인 메모리 공간에 저장된다. 클래스 인스턴스의 객체는 앱의 목적에 따라 다른 객체와 상호작용한다. 그래서 객체지향 프로그래밍을 이해하기 위해선 우선 객체와 클래스 메소드의 개념을 정확히 이해해야 한다.

 


객체

객체(object)는 다음과 같은 특성이 있다.

- 프로그램 내의 개체(Entity)를 나타낸다.
- 개체는 다른 개체와 상호작용하며 목적을 달성한다. ex) Person과 Car는 개체다. Person은 Car를 타고 원하는 위치로 이동한다.


클래스

개발자는 클래스(class)를 사용하여 현실의 개체를 표현한다.

- 클래스는 속성과 행동을 포함하는 객체를 정의한다.
  (속성의 데이터의 요소이고, 함수는 행동의 영역으로 특정 작업을 수행한다.)

- 클래스에는 객체의 초시 상태를 설정하는 생성자가 있다. (__init__())
- 클래스는 일종의 템플릿으로 쉽게 재사용할 수 있다. 

ex) Person class는 name과 age의 속성이 있고 직장으로 출근하는 gotoOffice() 함수가 있다.


메소드

객체지향 프로그래밍에서 메소드(Method)의 역할은 다음과 같다.

- 객체의 행위를 나타낸다.
- 속성을 조작하고 작업을 수행한다.

class Person(object):
	# 생성자
	def __init__(self, name, age):
    	self.name = name
        self.age = age
    # 함수
    def get_person(self):
    	return "<Person (%s, %s>" % (self.name, self.age)
# p는 Person형 객체
p = Person("John", 32)
print("Type of Object:", type(p), "Memory Address:", id(p))

# 실행결과
>> Type of Object: <class '__main__.Person'> Memory Address: 4329015224

 


[객체지향 프로그래밍의 주요 기능]


캡슐화

- 객체의 기능과 상태 정보를 외부로부터 은닉한다.

- 클라이언트는 객체의 내부 구조 및 상태를 직접 수정할 수 없고 대신 수정을 요청한다.
(요청의 종류에 따라 객체는 get과 set, post 등과 같은 특수 함수를 사용해 내부 상태를 변경한다.)

- 파이썬에는 public과 private, protected(c++, java) 같은 캡슐화에 필요한 접근 제어 키워드가 없기 때문에 캡슐화를 지원하지 않는다. 함수나 변수 앞에 _를 붙여 접근을 제어할 수 있다.

 


다형성

- 다형성에는 두 가지 의미가 있다.

    (1) 객체는 전달 인자에 따라 다른 메소드를 호촐한다.

    (2) 동일한 인터페이스를 여러 형식의 객체들이 공유한다.

- 파이썬은 다형성을 지원하는 언어이다. ex) +연산자는 두 정수를 더하거나 문자열을 합칠 때 모두 사용할 수 있다.

a = "John"
b = (1, 2, 3)
c = [3, 4, 6, 8, 9]
print(a[1], b[0], c[2])

상속

- 상속이란 클래스의 기능이 부모 클래스로부터 파생되는 것을 일컫는다.

- 부모 클래스에 정의된 함수를 재사용할 수 있고, 소프트웨어의 기본 구현을 확장시킬 수 있다.

- 상속은 여러 클래스 객체의 상호작용을 기반으로 계층을 형성한다. python은 java와는 다르게 다중 상속을 지원한다.

 

A 클래스 == 부모

B 클래스 == 상속받는 클래스

class A:
	def a1(self):
    	print("a1")
        
class B(A):
	def b1(self):
    	print("b1")
        
b = B()
b.a1()

 


추상화

-클라이언트가 클래스 객체를 생성하고 인터페이스에 정의된 함수를 호출할 수 있는 인터페이스를 제공한다.

-클라이언트는 클래스의 복잡한 내부 구현에 대한 이해없이 간편하게 인터페이스를 사용할 수 있다.

class Adder:
	def __init__(self):
    	self.sum = 0
    def add(self, value):
    	self.sum += value
        

acc = Adder()
for i in range(99):
	acc.add(i)


print(acc.sum) # 아...그래서 딥러닝 할 때 그 변수로 가중치를 빼올 수 있었구나ㄷㄷ

컴포지션

- 객체나 클래스를 더 복잡한 자료 구조나 모듈로 묶는 행위이다.

- 컴포지션을 통해 특정 객체는 다른 모듈의 함수를 호출할 수 있다. 즉 상속 없이 외부 기능을 사용할 수 있다.

class A(object):
	def a1(self):
    	print("a1")
        
class B(object):
	def b(self):
    	print("b")
        A().a1()
        
objectB = B()
objectB.b()
728x90
반응형

댓글