11. Abstract Data Types and Encapsulation Constructs
11.1. Abstraction에 대한 개념
- Abstraction <=> detail, representational, concrete
- Abstraction을 통해 프로그래밍의 복잡성을 해결할 수 있음.
- Process Abstraction vs Data Abstraction
1) Process Abstraction(Imperative 언어들, 거의 모든 언어긴 하지)
Fortran 이전의 Plankalkul이란 언어때부터 즉, 매우 오래 전부터 Process Abstraction은 존재했었음. (≡함수)
=> Subprogram(function)의 형태로 한 곳에 쭉 나열하는게 아니라 함수로 만들어서 기능별로 작성해두는 방식.
2) Data Abstraction(O.O.P에서 나온 개념)
변수, 함수들을 하나의 덩어리로 만들어서 하나의 데이터 타입으로 쓰는 방식.
11.2. Data Abstraction이란?
- Abstraction Data Type(ADT)(=class) = 하나의 Data Type(변수), 그에 대한 연산을 정의한 SubProgram(=메소드)을 하나의 덩어리로 만든 것.
1. Encapsulation
2. Information Hiding
- Process Abstraction의 문제였던 Side Effect...(자기 변수 이외의 변수를 건드림)
1. 전역변수를 건들기
2. Call-by-reference
-> coupling 문제(서로 얽히는 것.) 발생함.
∴ 객체 지향 개념이 생겨났음.
1. Encapsulation을 통해 데이터가 하나의 덩어리가 되어서 그것을 바꿀 수 있는 것은 클래스 안의 메소드 뿐!
2. Information Hiding을 통해 데이터의 접근을 제한(private, public 등)함!
아하~!
11.2.2. user-defined abstract type
- class에 선언되어 있는 필드나 메소드를 사용할 수 있음.
- 'protocol'(=API, Interface) 역할임. => 호출자와 피호출자 간의 Interface
- client에서 class에 직접 접근할 수는 없고 제공받는 메소드, 필드만을 사용 가능함. => Reliability 증가
11.3.Design Issues for Abstract Data Types
- prototype(=specification)=> Interface class와 같은 것으로, 직접 모든게 구현되어 있지 않은 부분. <=> Implementaion
- 객체는 보이는 부분과 안 보이는 부분으로 나누어져 있다.
1. Iterator(반복자), 2. Accessor(접근 제한자), 3. Constructor, 4. Destructor
11.4. 예시 언어들
- SIMULA67 -> Smalltalk80 -> ...(O.O.P 언어들)
1. C++(C+O.O개념/기능)
- 접근 제한자 : private, protected, public
- constructor : 멤버 타입명(ex) Stack stk ), destructor : delete(delete stk)
- .h : Specification vs .cpp : Implementation
2.Objective-C
- Interface <=> Implementation
(prototype <=> definition)
3. Java
class(일반 클래스)
Interface class(Implementation)
Abstract class(구현이 덜 된 class)
C++하고 다른 점은 독립된 class가 없다.(모든 class는 누군가로부터 상속을 받는다. Object class(root class)로부터 상속을 받아 내려온다.)
- 프로그래머가 deallocate 할 일이 없음. 가비지 콜렉터가 있으므로~ => dangling pointer 문제, 가비지 문제 걱정X