티스토리 뷰

7.7 객체지향적으로 생각하기(Object-Oriented Thinking)

 

- 프로그래밍의 절차지향적(procedural) 패러다임은 함수를 설계하는데에 초점을 둔다.

- 객체 지향적(object-oriented) 패러다임은 데이터메소드 둘 다 하나의 객체로 결합하는데 있다.

- 객체지향적(object-oriented) 패러다임을 이용하는 소프트웨어는 객체(objects)객체의 동작(operation)에 중점을 둔다.

- 이번 챕터에서는 절차지향적 프로그래밍과 객체지향적 프로그래밍차이점을 확인 할 수 있다.

- 4장에서 배운 BMI 프로그램 코드를 이용하여 두 패러다임의 차이점을 확인해보자.

 

*절차 지향적으로 만든 BMI 프로그램(BMI.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 파운드로 몸무게 입력
weight = eval(input("Enter weight in pounds: "))
 
# 신장을 인치로 입력
height = eval(input("Enter height in inches: "))
 
KILOGRAMS_PER_POUND = 0.45359237
METERS_PER_INCH = 0.0254
 
#BMI 계산
 
weightInKilograms = weight * KILOGRAMS_PER_POUND
heightInMeters = height * METERS_PER_INCH
bmi = weightInKilograms / (heightInMeters * heightInMeters)
 
#결과 출력
 
print("BMI is"format(bmi,".2f"))
if bmi < 18.5:
    print("Underweight")
elif bmi < 25 :
    print("Normal")
elif bmi < 30 :
    print("Overweight")
else :
    print("Obese")
 
cs

 

- BMI 프로그램은 이용자의 비만도를 알려주는 프로그램이다.

- 하지만 이 코드는 다른 프로그램에 재사용이 불가능하다.

- 이 코드를 재사용 가능하게 만들기 위해선 아래와 같이 BMI 계산 함수를 독립적인(standalone) 함수로 정의하여야 한다.

 

def getBMI(weight, height):

 

- 이렇게 정의하면 아까보다는 좀 더 효율적인 함수가 되지만 아직 한계는 존재한다.

- 여러분이 몸무게와 신장을 사람의 이름생년월일연관시켜야 한다고 가정해 보자.

- 이름과 생년월일을 따로 변수를 만들어 값을 저장하는 방법도 있지만, 이는 깔끔하게 연관짓지 못한다.

- 가장 이상적인 방법은 하나의 객체를 만들어 이 안에 집어넣는 것이 바람직하다.

 

* BMI 프로그램 추상화(UML 다이어그램)

 

- BMI 클래스를 만들어 이 클래스를 이용하는 프로그램을 만들어 보자.

 

*BMI 클라이언트 (UseBMIClass.py)

1
2
3
4
5
6
7
8
9
10
from BMI import BMI
 
def main():
    bmi1 = BMI("John Doe",18,145,70)
    print("The BMI for", bmi1.getName(),"is",bmi1.getBMI(), bmi1.getStatus())
 
    bmi2 = BMI("Peter King"5021570)
    print("The BMI for", bmi2.getName(),"is",bmi2.getBMI(), bmi2.getStatus())
 
main()
cs

 

bmi1John Doe의 객체, bmi2Peter King의 객체이다.

- 각 자신의 객체 안에 위 자신의 정보들이 저장되어 있다.

 

 

*BMI 클래스 구현(BMI.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class BMI:
    def __init__(self, name, age, weight, height):
        self.__name = name
        self.__age = age
        self.__weight = weight
        self.__height = height
 
    def getBMI(self):
        KILOGRAMS_PER_POUND = 0.45359237
        METERS_PER_INCH = 0.0254
        
        weightInKilograms = self.__weight * KILOGRAMS_PER_POUND
        heightInMeters = self.__height * METERS_PER_INCH
 
        bmi = weightInKilograms / (heightInMeters * heightInMeters)
 
        return round(bmi,2)
 
    def getStatus(self):
 
        bmi = self.getBMI()
        
        if bmi < 18.5:
            return "Underweight"
        elif bmi < 25 :
            return "Normal"
        elif bmi < 30 :
            return "Overweight"
        else :
            return "Obese"
 
    def getName(self):
        return self.__name
 
    def getAge(self):
        return self.__age
 
    def getWeight(self):
        return self.__weight
 
    def getHeight(self):
        return self.__height
cs

 

- 이 예제는 객체 지향적(object-oriented) 패러다임은 절차 지향적(procedural) 패러다임보다 많은 장점을 보여주는 예제이다.

- 객체 지향 패러다임절차 지향적 패러다임데이터(data)와 동작(operation)을 통합한 객체가미한 패러다임이다.

 

- 절차 지향적 프로그래밍(procedural programming)데이터(data)동작(operations)분리하여 데이터를 메소드에 전달해야한다.

- 객체 지향적 프로그래밍은(object-oriented programming) 데이터와 동작은 하나의 객체 안에 연관지어 놓는다.

- 객체 지향적 접근 방법으로 절차 지향적 프로그래밍의 태생적인 많은 문제들을 해결 할 수 있다.

- 객체 지향적 프로그래밍은 현실 세계를 미러링하여 만든 프로그램 제작 으로 모든 특성과 동작들은 서로 연관되어 있다. 

- 객체를 사용하는 것은 소프트웨어의 재사용성을 높이고 개발을 쉽게 해주며, 유지보수도 쉽게 만들어 준다.

- 파이썬 프로그래밍은 객체의 관점에서 생각하는 것을 내포한다. 파이썬 프로그램서로 상호작용하는 객체들의 모임이라고 보면 된다.  

 

참고 문헌 : Introduction to Programming Using Python / Y.DANIEL LIANG



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.


교재 영어 원서를 직접 번역하여 정리한 게시물이므로 일부 오타, 의역이 존재할 수 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다. 

댓글