코드를 짤 때 어떤 방식으로 코딩을 하는지에는 두 가지 패러다임이 있다.
프로그래밍을 시작하기 앞서 절차적 프로그래밍(Procedural Progamming, PP)과
객체지향 프로그래밍(Object Oriented Programming, OOP)에 대해 가볍게 알아보자.
절차적 프로그래밍(Procedural Programming)
흔히 절차 지향으로 알고 있는 프로그래밍 방법이다.
하지만 애초에 프로그래밍은 코드 연산을 절차적으로 수행한다는 의미인데
절차 지향적인 방법으로 프로그래밍을 한다는 것은 말에 어폐가 있다.
그렇다면 절차적 프로그래밍은 무슨 의미인가?
간단한 예시 코드로 두 방법의 차이를 느껴보자.
사용언어 : Python3
"""
장바구니 기능 구현
시나리오
1. 고객이 사과를 장바구니에 추가
2. 고객이 바나나를 장바구니에 추가
3. 고객이 블루베리를 장바구니에 추가
4. 고객이 주문을 완료함
조건) 클래스를 사용하지 않을 것, 주문 완료 시 고객 이름과 총 가격을 출력
"""
cart = []
customer = 'kim'
total_price = 0
apple = 300
banana = 680
blueberry = 1910
cart.append(apple)
cart.append(banana)
cart.append(blueberry)
print(cart)
for i in range(len(cart)):
total_price += cart[i]
print(f'{customer}님 최종 금액은 {total_price}원 입니다.')
total_price = 0
cart.clear()
시나리오의 흐름대로 코드가 작성되었다.
코드 내용처럼 정해진 문법에 따라 차례대로 코드를 기술하는 방법이다.
절차적으로 작성된 프로그램은 컴퓨터와 처리구조가 유사하여 빠른 처리 속도를 가지고 있다.
컴파일러 방식의 C는 절차적 프로그래밍의 대표적 언어이다.
그럼 객체지향이라는 개념이 왜 생겨났는가?
객체 지향 프로그래밍(Object Oriented Programming)
객체 지향 프로그래밍은 말 그대로 어떠한 명령으로 구성된 객체를 중심으로 프로그래밍을 하는 방법이다.
위와 같은 문제를 이번엔 객체 지향 방식으로 작성해 보자.
사용언어 : Python3
"""
장바구니 기능 구현
시나리오
1. 고객이 사과를 장바구니에 추가
2. 고객이 바나나를 장바구니에 추가
3. 고객이 블루베리를 장바구니에 추가
4. 고객이 주문을 완료함
조건) 클래스를 사용할 것, 주문을 완료시 고객 이름과 총 가격을 출력
"""
class Cart:
def __init__(self, user):
self.user = user
self.total_price = 0
self.cart_list = []
def add_item(self, item):
self.cart_list.append(item)
self.total_price += item.price
def checkout(self):
print(f'{self.user}님, 총 금액 {self.total_price}원 주문 완료했습니다.')
self.cart_list.clear()
self.total_price = 0
class Item:
def __init__(self, name, price):
self.name = name
self.price = price
cart = Cart('kim')
cart.add_item(Item('사과', 300))
cart.checkout()
cart라는 Cart 클래스의 인스턴스(객체, object)를 선언하고
이전에 절차적으로 작성했던 코드를 메소드로 정의하여
cart를 중심으로 메소드들이 실행된다.
당연하게도 같은 input을 주었을 때 output은 절차적으로 작성한 방법과 동일하다.
코드를 구현할 때 절차적 방법보다 상대적으로 오랜 시간이 걸리긴 하지만
클래스를 한번 정의해 놓으면 코드의 효율성이 매우 높아지고 개발 및 유지보수에 용이하다.
JAVA, Python, C++ 등은 객체지향의 대표적 언어이다.
객체지향 언어는 대표적인 특징을 몇 가지 가지고 있는데 간단하게 알아두자.
- 캡슐화(Encapsulation)
데이터 속성과 데이터를 처리하는 메소드들을 하나로 묶는 것 - 정보 은닉(Information Hiding)
캡슐화에서 가장 중요한 개념으로, 다른 객체에게 자신의 정보를 숨기고
자신의 연산만을 통해 접근하는 것 - 추상화(Abstraction)
객체의 속성 중 특정 기능에 중점을 두고 요약하고 모델화 하는 것 - 다형성(Polymorphism)
메시지에 의해 객체가 연산을 수행할 경우 한 메시지에 대해 각 객체가 가지고 있는
고유한 방법으로 응답할 수 있는 능력 - 상속(Inheritance)
부모 클래스의 모든 속성을 자식 클래스가 물려받는 것
두 방법의 가장 큰 차이는 클래스의 사용 여부이다.
절차적이던, 객체 지향이던 어떤 방법이 우수하다, 좋다, 나쁘다 할 필요가 없다.
각자의 특색대로 필요한 부분에 사용하면 된다.
또한, 절차적 방식과 객체 지향 방식은 서로 반대되는 개념이 아니며
모든 언어는 기본적으로 절차적이라는 사실을 잊지 않아야 한다.
'Programming > [Data structure & Algorithm]' 카테고리의 다른 글
[Python] 알고리즘의 시간 복잡도 (0) | 2021.08.08 |
---|