본문 바로가기

카테고리 없음

객체지향프로그래밍은 왜 필요한 것인가 ?

객체지향 프로그램이라는 것은 프로그램을 할 때, 객체들을 모아모아 개발하는 것. 

이왕 코드를 짜는거 객체들을 가지고 잘 정리해서 효율성을 높여준다. 

코드를 복잡하게 안짜니 쉽게 관리할 수 있는 장점이 있어서 꼭 필요하다. 

 

파이썬에서 유명한 Django프레임워크, 유니티(Unity), 언리얼엔진(Unreal Engine)과 같은 게임인진들도 객체지향 프로그래밍을 통해 구축되어있다. 

 

용어들이 몇 개 나오는데, 정리

- 클래스(class) - 객체지향의 핵심이고, 한 객체가 어떤 역할을 하는지 설계도를 담고 있는 친구다. 하나의 클래스에는 변수(속성)와 메소드(클래스 내의 함수)들이 모여있다.

 

- 객체(Object) - 클래스의 인스턴스라고 표현하고, 실제 메모리상에 할당된 만들어진 클래스. 

 

- 인스턴스 - 인스턴스는 클래스를 기반으로 실제로 생성된 객체를 의미함.

(객체와 인스턴스는 다른 말이며, 객체가 좀 더 범위가 넓은 말이다.)

 

- 속성(Attribute) - 객체 안에 있는 변수.

 

- 메소드(Method) - 객체 안에 있는 함수.

 

 

class를 정의할 때는, class 클래스이름: 이런식으로 정의한다. 

그리고 바로 밑에 def __init__(): init함수가 보통 나온다. 이 init함수(메소드)는 객체가 생성될 때, 자동으로 호출된다. 

객체의 초기 상태를 설정하는데 사용되고 이 안에 보통 self를 넣어주는데, 얘는 해당 객체 자체를 가리키는 파라미터다. 

 

 

 

#1 은행계좌를 클래스로 구현해보기.

class BankAccount:
    def __init__(self, owner, balance = 0):
        self.owner = owner #다른데서 갖다 쓸 때는 self.owner로
        self.balance = balance
    
    def deposit(self, amount):
        self.balance += amount
        print(f"{amount}가 {self.owner}님 계좌에 입금되었습니다.") #amount는 같은 함수상에 있어서 self없이 사용가능
    def get_money(self, amount):
        if self.balance >=amount:
            print("{}님의 계좌에서 {}가 출금되었습니다.".format(self.owner, amount))
            self.balance -= amount
        else:
            print("잔액이 부족합니다.")

init 다음 두 번째 함수에서 amount는 self.amount로 안불러도 되는데, 그건 해당함수 내부에 있기 때문에 그렇다. 

현재 owner는 deposit함수에서 부르려면 self.owner로 불러야한다.

 

 

#이후에 해당 클래스를 사용할 때는 .을 통해서 클래스 안의 함수(메소드)를 사용할 수 있다. 
my_account = BankAccount('Innopark', balance=1000000000)
#my_account가 인스턴스임

my_account.deposit(500000)

my_account.balance

my_account.get_money(200000)

my_account.balance

 

 

 

 

 

 

 

 

#이커머스 페이지에서 쇼핑하는거 구현해보기

먼저 Product라는 클래스를 정의하자. 이 클래스 안에는 product의 이름, 가격을 넣겠다.

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

 

그리고 쇼핑카트라는 class도 정의하겠다. 

이 클래스 안에는 product를 추가하고, 총 구매가격을 조회할 수 있는 두 가지 함수도 구현해 넣겠다.

 

 

 

class ShoppingCart:
    def __init__(self, customer):
        self.customer = customer
        self.products = [] 
#4번 한 줄 만으로, ShoppingCart 클래스 사용할 때마다 쓸 수 있는 products라는 리스트가 생김.
        
        
    
    def add_product(self, product):
        self.products.append(product) #위에서 만든 리스트에 append사용해서 product넣어줌
    
    def total_price(self):
        return sum(product.price for product in self.products)  #products안에 있는 모든 product 조회

 

마지막 return문에서는 리스트 컴프리핸션이 쓰였다. self.products라는 리스트 안에 있는 모든 요소들의 price를 가져와서 합쳐준다. 

cart = ShoppingCart("제시카")
cart.add_product(Product("PythonBook", 20000))
cart.add_product(Product("NoteBook", 3000000)) #클래스의 인스턴스를 다른 클래스에 넣어버리는.... 확장성...

cart.total_price()

결과값으로 3020000이 출력된다.