티스토리 뷰

7.6 클래스 추상화와 캡슐화(Class Abstraction and Encapsulation)

 

- 클래스 추상화(abstraction)은 클래스 사용(use)구현(implementation)분리하는 개념이다.

- 클래스의 구현(implementation)사용자로 부터 숨기는 것을 의미하며, 클래스 캡슐화(class encapsulation)라고도 알려져 있다.

- 이전 챕터 6에서는 함수 추상화(function abstaction)를 배우고 이를 단계적 개선법으로 사용하였다.

- 이와 비슷하게, 클래스 추상화(class abstraction)는 클래스의 사용과 구현을 분리하는 것을 의미한다.

 

- 이전에 배운바와 같이, 클래스를 사용하는 유저(user)클래스가 어떻게 구현되어 있는지 알 필요가 없다.

- 구현의 상세한 정보를 유저로 부터 숨기고 캡슐화하는 것을 클래스 캡슐화(class encapsulation)이라고 한다.

- 본질적으로, 캡슐화(encapsulation)는 데이터와 메소드를 하나의 단일 객체로 조합하고, 데이터 필드와 메소드의 구현을 사용자(user)로 부터 숨기는 것이다. 

- 예를 들어, 이용자는 Circle 객체(이전 포스트의 Circle.py)를 만들어 넓이를 어떻게 구하는지 모르더라도 메소드를 이용해 원의 넓이를 구할 수 있다.

- 그래서, 클래스를 추상 데이터 타입(abstract data type, ADT) 이라고 부르기도 한다.

 

* 클래스 추상화 개념( 약속(contract)에 대한 이전 포스트를 볼려면 ●클릭●)

- 많은 실제 생활을 예로 이용해 추상화(abstraction)의 개념을 설명할 수 있다.

- 예를 들어, 컴퓨터를 조립한다고 가정하면 컴퓨터를 조립하기 위해 CPU, 메로리, 메인보드 등 많은 부품(components)이 필요하다.

- 이 각각의 부품(components)들이 변수(properties)메소드(methods)들로 이루어진 각각의 객체(objects)라고 보면 된다.

- 우리는 부품을 어떻게 사용하는지, 어떻게 서로 연결하는 지만 알면 되지, 내부적으로 어떻게 구동되는지, 또 어떻게 구현되어 있는지는 알 필요가 없다.

- 이러한 구현 정보들은 캡슐화 되어 있고, 사용자로 부터 숨겨져 있다. 하지만 굳이 컴퓨터 부품들이 어떻게 구현되어 있는지 알지 못하더라도 우린 컴퓨터를 조립할 수 있다.

 

 

- 다른 예로, 대출(loan) 받는 것을 생각해보자.

- 각 각의 대출(loan)은 각각 Loan 클래스의 객체라고 보면 된다.

- 이자율(interest rate), 대출 금액(loan amount), 대출 기간(loan period)데이터 변수(data properties)이고, 매달 지불 금액(monthly payment)과  지불 금액(total payment)을 계산하는 것메소드이다.

- 위와 같은 변수와 메소드들을 가지고 클래스를 인스턴트화하여 loan 객체를 만들어낸다.

- 그 뒤, 우리는 메소드를 이용하여 총 지불 금액과 매달 지불 금액을 찾을 수 있다.

 

* loan 프로그램 UML

 

- 위 UML 클래스 다이어그램에 적혀있는 약속(contract)들을 보고 대출 프로그램을 작성해보자.

 

* 대출 프로그램(TestLoanClass.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
from Loan import Loan
 
def main():
    # 연 이자율 입력
    annualInterestRate = eval(input("Enter yearly interest rate, for example, 7.25: "))
 
    #대출 년 수 입력
    numberOfYears = eval(input("Enter number of years as an integar: "))
 
    #대출 총 금액
    loanAmount = eval(input("Enter loan amount, for example, 120000.95: "))
 
    #대출자 이름 입력
    borrower = input("Enter a borrower's name : ")
 
    # Loan 객체 생성
    loan = Loan(annualInterestRate, numberOfYears, loanAmount, borrower)
 
    # 대출 기일, 월 지불 액, 총 지불 액 출력
    print("The loan is for", loan.getBorrower())
    print("The monthly payment is"format(loan.getMonthlyPayment(), ".2f"))
    print("The total payment is"format(loan.getTotalPayment(), ".2f"))
 
main()
cs

 

*Loan 클래스(Loan.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
class Loan:
    def __init__(self,annualInterestRate = 2.5, numberOfYears = 1, loanAmount = 1000, borrower = " "):
        self.__annualInterestRate = annualInterestRate
        self.__numberOfYears = numberOfYears
        self.__loanAmount = loanAmount
        self.__borrower = borrower
    
    def getAnnualInterestRate(self):
        return self.__annualInterestRate
 
    def getNumberOfYears(self):
        return self.__numberOfYears
 
    def getLoanAmount(self):
        return self.__loanAmount
 
    def getBorrower(self):
        return self.__borrower
 
    def setAnnualInterestRate(self, annualInterestRate):
        self.__annualInterestRate = annualInterestRate
 
    def setNumberOfYears(self, numberOfYears):
        self.__numberOfYears = numberOfYears
 
    def getMonthlyPayment(self):
        monthlyInterestRate = self.__annualInterestRate / 1200
        monthlyPayment = self.__loanAmount * monthlyInterestRate / (- (/ (+ monthlyInterestRate) ** (self.__numberOfYears * 12)))
        return monthlyPayment
 
    def getTotalPayment(self):
        totalPayment = self.getMonthlyPayment() * self.__numberOfYears * 12
        return totalPayment
cs

 

- 클래스 개발자 입장에선, 다양한 고객의 사용에 맞춰서 클래스를 디자인한다.

- 즉 프로그램의 사용성을 높이기 위해선 사용자 위주의 다양한 메소드들로 클래스를 만들어야 한다.

 

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



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


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

댓글