제수기 > Python > class 설계

Eunbi Jo·2025년 1월 18일
0

제수기

목록 보기
72/90
제수기 - 제발 수업내용을 기억해라 / 단순수업정리 시리즈

class 설계

객체지향프로그래밍 OOP

  • 현실세계의 모든 사건은 객체(object)와 객체사이의 상호작용인 것에 주목한다.
  • 객체간의 상호작용을 구현하기 위해 의인화 적용된다.
  • 객체는 스스로 책임을 가지고 행동을 수행할 수 있다.
  • 🦖객체는 적절한 책임을 가질수 있도록 클래스 단위로 잘 분리해 작성해야 한다.
  • 단일책임원칙 SRP (Single Responsibility Principle) : 하나의 객체는 하나의 책임만 진다.
  • (SOLID 객체지향 개발원칙을 참고)

객체간의 상호작용

  • 객체와 객체는 메세지를 주고받는다.
  • 🦖객체는 아는 것(속성)과 할수 있는 것(메소드)으로 구성된다.
  • 객체는 자기 할수 있는 것을 메소드로써 외부에 노출한다.
  • 송신자객체는 수신자객체에 매개인자를 통해 메소드를 호출함으로써 메시지를 전송한다.
  • 수신자객체는 일련의 책임을 수행후 리턴값으로 송신자객체에 응답한다.

계층형 아키텍쳐 Layered Architecture

  • entity class : 특정 주제를 표현하는 핵심데이터를 가진 클래스.
    - 사원관리앱 emp클래스, 쇼핑몰앱에서는 product, member클래스
  • controller class (표현계층) : 외부요청을 직접적으로 처리하는 클래스. (콘솔앱에서는 view클래스가 담당)
  • view class (표현계층 : ui담당) : 사용자가 보게 될 화면, 입력폼, 조회결과등을 담당하는 클래스
  • service class(응용계층) : 업무로직을 담당하는 클래스. 사용자요청과 저장소사이에서 브릿지역할한다. (트랜잭션 처리 담당)
  • repository class(영속계층) : 외부저장소(외부파일, db)와 연결하는 클래스

product

product.pyclass Productclass 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로 상품을 제거할 수도 있다.

car_oop

Driving Application

  1. 요구사항 명세 (클라이언트)
  • 운전프로그램을 만들어 주세요.
  • 운전자는 시동걸기/끄기, 악셀 또는 브레이크를 밟을 수 있습니다.
  • 자동차는 엔진시작/끝, 가속/감속을 할 수 있습니다.
  • 자동차는 처음에 대기상태 있어야 합니다. (시동이 꺼진 상태)
  • 자동차는 운전자에 의해 시동이 걸리고, 이미 시동이 걸려있다면, 또 시동을 걸수는 없습니다.
  • 운전자가 악셀을 밟으면, 자동차는 10km/h씩 가속할 수 있습니다.
  • 최대속도는 200km/h 입니다.
  • 운전자가 브레이크를 밟으면, 자동차는 10km/h씩 감속할 수 있습니다.
  • 운전자가 시동을 끄면, 자동차는 더이상 움직일 수 없습니다. (시동이 꺼진 상태)
  • 자동차가 달리는 동안에는 시동을 끌수 없습니다.
  1. 객체 도출
  • 운전자
  • 자동차
  • 프로그램메뉴 (사용자 보게될 메뉴, 입력폼, 결과출력 담당할 UI객체)
  1. 객체간의 상호작용
    어떤 객체가 무엇을 알고, 무엇을 할수 있는가?
        프로그램메뉴          운전자             자동차
----------------------------------------------------------------
know     운전자              자동차             엔진작동여부
                                               현재속도
do      메뉴 제공            시동걸기            엔진시작
        메뉴 선택            시동끄기            엔진종료
                            악셀 밟기            가속
                           브레이크 밟기          감속

                ---------->           -------->
                시동을 걸어라            엔진을 시작하라
                    True                   True
                엑셀 밟아라              엔진을 가속하라
                    100                    100
                브레이크를 밟아라          엔진을 감속하라
                     90                     90
                 시동을 꺼라             엔진을 종료하라
                    False                  False
                <----------           <---------

🍜 직접해보기
1. Car class를 만들고, 엔진은 시작했을 때, 엔진을 종료했을 때, 가속했을 때, 종료했을 때의 값을 넣어준다.

  1. Driver class를 만들고, import car from Car. 엔진 시작, 종료, 가속, 감속 시 driver에게 줄 return을 정한다.

  2. Menu class를 만들고 import driver from Driver. menu_str를 만들고, 메뉴 선택 시 어떤 내용을 리턴할지 정한다.

  3. main.py를 만들고, import menu from Menu.
    if __name__ == '__main__'를 선언한다.

0개의 댓글