/ PYTHON

(Python) 객체지향과 절차지향의 정의와 특징/실습

절차지향 언어

절차지향은 프로그램 단위를 함수 단위로 작성하는 언어이다. 로직의 순서는 위에서 아래로 순차적으로 처리되는 특징을 가지고 있다. 초반에 절차지향으로 코드를 짜기 전에는 코드가 길어지고 복잡해지는 단점이 존재하였다. 예를 들어 car의 종류와 디테일을 보여주는 로직이 있다고 해보자. car의 종류가 1~2개일때는 큰 문제가 없지만 실제로 car의 종류를 100개, 1000개를 작성하려면 듣기만 해도 굉장히 비효율적이라고 예상이 된다. 이때 절차지향으로 작성하게 되면 공통된 함수를 작성하면 되기 때문에 이전보다 훨씬 수월하게 관리할 수 있다

# 자동차의 정보를 출력해본다


"""
절차지향 미사용시,
코드의 중복이 많아지는 것을 느낄수 있다
"""

#차량 1번
car_company_1 = 'Ferrari'
car_detail_1 = [
    {'color':'Silver'},
    {'horsepower':300},
    {'price':6000},
]

#차량 2번
car_company_2 = 'Bmw'
car_detail_2 = [
    {'color':'Black'},
    {'horsepower':270},
    {'price':5000},
]

#차량 3번
car_company_3 = 'Audi'
car_detail_3 = [
    {'color':'White'},
    {'horsepower':500},
    {'price':8000},
]

print(f'{car_company_1}의 detail : {car_detail_1}')
print(f'{car_company_2}의 detail : {car_detail_2}')
print(f'{car_company_3}의 detail : {car_detail_3}')

print()
print()

"""
절차지향 사용시, 
코드의 중복이 개선되는 것을 느낄 수 있다

하지만 여전히 데이터를 관리하기 편하지 않다
"""

def car_infor(company, detail):
    return {'company': company, 'detail': detail}


def increase_price(car):
    ori_price = car['detail']['price']
    price = ori_price * 1.5
    return print(f"{car['company']}의 변동된 금액 {price}")

car_company_1 = car_infor(
        'Ferrai',
        {'color':'Silver','horsepower':300,'price':6000})
car_company_2 = car_infor(
        'Bmw',
        {'color':'Black','horsepower':270,'price':5000})

car_company_3 = car_infor(
        'Audi',
        {'color':'White','horsepower':500,'price':8000})

increase_price(car_company_1)
increase_price(car_company_2)
increase_price(car_company_3)



객체지향 언어

하지만 절차지향도 어느정도 한계가 있다. 데이터가 방대해지고 코드의 복잡도가 증가하면서 코드의 개선이 어려워졌고 코드의 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려웠다.
아래의 코드를 보면 car의 가격을 증가시키는 함수가 작성될때 car의 price에 dict형태로 키로 접근해야 하기 때문에 키가 없을 경우에 대한 예외처리도 필요하고 키의 중첩문제가 생길수도 있다. 데이터 중심으로 코드를 짜게 되면서 객체로써 관리가 되었다. 코드의 재사용과 중복방지, 유지보수가 쉬워졌다.

"""
객체지향 사용시,
구조를 설계후 재사용성이 증가하고, 코드의 반복이 최소화되었다. car에 대한 기능을 쉽게 
구현할 수 있다. 
__str__과 __repr__은 다음 부분에서 설명할 예정이다.
기본적으로 클래스의 인스턴스로 정의된 값(car1,car2,car3)은 출력될때 object형식으로 출력이 되기 때문에 object
안에 있는 값들을 보고 싶을때 str이나 repr을 쓴다고 생각하면 된다. 
"""

class Car():
    def __init__(self,company, details):
        self._company = company
        self._details = details
        
    def __str__(self):
        return f'str: {self._company} - {self._details}'
    
    def __repr__(self):
        return f'str: {self._company} - {self._details}'
    

car1 = Car('Ferrari',{'color':'Silver','horsepower':300,'price':6000})
car2 = Car('Bmw',{'color':'Black','horsepower':270,'price':5000})
car3 = Car('Audi',{'color': 'White', 'horsepower': 500, 'price': 8000})

print(car1)
print(car2)
print(car3) 



Q. 절차지향에 대해 설명해라

A. 절차지향언어는 프로그램 단위를 함수단위로 나누어 작성하는 언어이다. 로직의 실행이 위애서 아래로 순차적으로 처리되는 특징을 가지고 있다. 2).과거에는 코드를 짤때 코드가 길어지고 복잡해지는 단점이 존재했다. 절차지향으로 작성하게 되면 공통된 기능은 함수를 작성하면 되기 때문에 코드가 길어져도 이전보다 훨씬 수월하게 관리할 수 있었다. 시간이 지나면서 데이터가 방대해지고 코드의 복잡도가 증가하면서 코드의 개선이 어려워졌고 절차지향은 코드의 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려운 단점이 있다.


Q. 객체지향에 대해 설명해라

A. 개발하려는 것을 기능별로 묶어 하나의 객체를 만들고 그 객체들간의 상호작용을 통해 로직을 구성하는 언어이다 고객-자판기를 예를 들어보면 고객이 할 수 있는 기능(돈은 넣고/ 받고/ 제품을 받음)과 데이터(돈, 제품)들을 하나로 묶어 고객이라는 객체를 만들고 자판기에서 할 수 있는 기능(돈 받고/ 검사하고/ 잔돈주고/ 제품준다)과 데이터(돈, 제품)묶어 자판기라는 하나의 객체로 묶어서 서로 상호작용을 통해 로직을 구성하는 방식이다


Q. 객체지향의 장/단점을 설명해라

A.장점
코드의 재사용이 용이하다 - 남이 만든 클래스를 가져와서 사용할 수 있고 상속을 통해 확장해 사용할 수 있다

유지보수가 쉽다 - 절차지향 프로그래밍에서는 코드 수정시 일일이 찾아 수정해야하는 반면 객체 지향 프로그래 밍 에서는 수정해야 할 부분이 클래스 내부에 변수, 메서드로 있기 때문에 해당 부분만 수정하면 된다.

대현 프로젝트에 적합하다 - 클래스단위로 모듈화시켜 개발할 수 있기 때문에 대형 프로젝트와 같이 여러명/회사에서 개발이 필요할 때 업무 분담이 쉽다

A.단점
처리속도가 상대적으로 느리고 객체가 많으면 용량이 커질 수 있다. 설게할때 많은 시간과 노력이 필요하다