객체지향 프로그램이라는 것은 프로그램을 할 때, 객체들을 모아모아 개발하는 것.
이왕 코드를 짜는거 객체들을 가지고 잘 정리해서 효율성을 높여준다.
코드를 복잡하게 안짜니 쉽게 관리할 수 있는 장점이 있어서 꼭 필요하다.
파이썬에서 유명한 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이 출력된다.