티스토리 뷰
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 / (1 - (1 / (1 + 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
※
본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.
교재 영어 원서를 직접 번역하여 정리한 게시물이므로 일부 오타, 의역이 존재할 수 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다.
※
'파이썬 > 이론' 카테고리의 다른 글
[파이썬]str 클래스, 문자열 생성, 문자열을 위한 함수, 인덱스 연산자, 슬라이싱 연산자 (0) | 2017.08.16 |
---|---|
[파이썬]객체지향적으로 생각하기 (0) | 2017.08.07 |
[파이썬]불변 객체와 가변 객체, 데이터 필드 숨기기(data hiding) (0) | 2017.08.04 |
[파이썬]클래스 사용하기, UML 클래스 다이어그램 (0) | 2017.08.03 |
[파이썬]생성자(Constructor), 객체 멤버 접근, self 매개 변수 (1) | 2017.08.01 |
- Total
- Today
- Yesterday
- 파이썬 연산자
- 자바스크립트 자료구조
- 백준 11501
- 파이썬
- 백준
- 백준 1874
- 파이썬 문자열
- 파이썬 for
- 자바스크립트 그래프
- css 박스
- 자바 에센셜 실습문제
- 백준 10451
- 파이썬 선택문
- 파이썬 while
- 파이썬 클래스
- 버츄어박스
- 파이썬 단계적 개선
- css 그리드
- 파이썬 터틀
- 파이썬 if문
- 파이썬 객체
- 파이썬 함수
- 자료구조
- 파이썬 예제
- css
- 명품 c++ 실습
- 자바
- 파이썬 리스트
- 웹
- 파이썬 진수 변환
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |