제수기 - 제발 수업내용을 기억해라 / 단순수업정리 시리즈
객체지향프로그래밍 OOP
- 현실세계의 모든 사건은 객체(object)와 객체사이의 상호작용인 것에 주목한다.
- 객체간의 상호작용을 구현하기 위해 의인화 적용된다.
- 객체는 스스로 책임을 가지고 행동을 수행할 수 있다.
- 🦖객체는 적절한 책임을 가질수 있도록 클래스 단위로 잘 분리해 작성해야 한다.
단일책임원칙 SRP (Single Responsibility Principle)
: 하나의 객체는 하나의 책임만 진다.- (SOLID 객체지향 개발원칙을 참고)
객체간의 상호작용
- 객체와 객체는 메세지를 주고받는다.
- 🦖객체는 아는 것(속성)과 할수 있는 것(메소드)으로 구성된다.
- 객체는 자기 할수 있는 것을 메소드로써 외부에 노출한다.
- 송신자객체는 수신자객체에 매개인자를 통해 메소드를 호출함으로써 메시지를 전송한다.
- 수신자객체는 일련의 책임을 수행후 리턴값으로 송신자객체에 응답한다.
entity class
: 특정 주제를 표현하는 핵심데이터를 가진 클래스.controller class
(표현계층) : 외부요청을 직접적으로 처리하는 클래스. (콘솔앱에서는 view
클래스가 담당)view class
(표현계층 : ui담당) : 사용자가 보게 될 화면, 입력폼, 조회결과등을 담당하는 클래스service class
(응용계층) : 업무로직을 담당하는 클래스. 사용자요청과 저장소사이에서 브릿지역할한다. (트랜잭션 처리 담당)repository class
(영속계층) : 외부저장소(외부파일, db)와 연결하는 클래스product.py
에 class Product
와 class WishList
를 만들고,
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
def __repr__(self):
#escaping 문법적 기능이 아닌 문자 그대로 사용하려는 경우 \n, {{}} 등
return f'Product{{name={self.name}, price={self.price}}}'
class WishList:
def __init__(self):
self.__products= []
def add_product(self, product):
self.__products.append(product)
def remove_product(self, product):
self.__products.remove(product)
def print_products(self):
print('현재 위시리스트')
for product in self.__products:
print(product)
print(f'상품명 : {product.name} 가격 : {product.price}원')
# 객체가 문자열로 표현돼야 할 때 자동으로 호출되는 메소드
def __repr__(self):
return f'WishList{{ products={self.__products} }}'
같은 경로에 main.py
를 만들고,
from product import Product, WishList
를 넣어서 product.py
의 class를 import 해온다.
add
를 사용해서 wishlist 객체에 책임을 부여할 수도 있고, remove
로 상품을 제거할 수도 있다.Driving Application
- 요구사항 명세 (클라이언트)
- 운전프로그램을 만들어 주세요.
- 운전자는 시동걸기/끄기, 악셀 또는 브레이크를 밟을 수 있습니다.
- 자동차는 엔진시작/끝, 가속/감속을 할 수 있습니다.
- 자동차는 처음에 대기상태 있어야 합니다. (시동이 꺼진 상태)
- 자동차는 운전자에 의해 시동이 걸리고, 이미 시동이 걸려있다면, 또 시동을 걸수는 없습니다.
- 운전자가 악셀을 밟으면, 자동차는 10km/h씩 가속할 수 있습니다.
- 최대속도는 200km/h 입니다.
- 운전자가 브레이크를 밟으면, 자동차는 10km/h씩 감속할 수 있습니다.
- 운전자가 시동을 끄면, 자동차는 더이상 움직일 수 없습니다. (시동이 꺼진 상태)
- 자동차가 달리는 동안에는 시동을 끌수 없습니다.
- 객체 도출
- 운전자
- 자동차
- 프로그램메뉴 (사용자 보게될 메뉴, 입력폼, 결과출력 담당할 UI객체)
프로그램메뉴 운전자 자동차
----------------------------------------------------------------
know 운전자 자동차 엔진작동여부
현재속도
do 메뉴 제공 시동걸기 엔진시작
메뉴 선택 시동끄기 엔진종료
악셀 밟기 가속
브레이크 밟기 감속
----------> -------->
시동을 걸어라 엔진을 시작하라
True True
엑셀 밟아라 엔진을 가속하라
100 100
브레이크를 밟아라 엔진을 감속하라
90 90
시동을 꺼라 엔진을 종료하라
False False
<---------- <---------
🍜 직접해보기
1. Car class
를 만들고, 엔진은 시작했을 때, 엔진을 종료했을 때, 가속했을 때, 종료했을 때의 값을 넣어준다.
Driver class
를 만들고, import car from Car. 엔진 시작, 종료, 가속, 감속 시 driver에게 줄 return을 정한다.
Menu class
를 만들고 import driver from Driver. menu_str를 만들고, 메뉴 선택 시 어떤 내용을 리턴할지 정한다.
main.py를 만들고, import menu from Menu.
if __name__ == '__main__'
를 선언한다.