제9장 추상 데이터 타입 및 모듈 (Abstract Data Type & Module)
9.1 캡슐화 및 추상 데이터 타입
추상화(Abstraction) 추상화 개념은 프로그래밍에서 기본 제어 추상화(Control abstraction) 제어 구조(control structures) 프로시저(procedures) 데이터 추상화(Data abstraction) 데이터 타입(data types)
프로시져 사용 예제 typedef struct{ float re,im; } COMPLEX; COMPLEX add( COMPLEX x, y) { . . . } COMPLEX subtract( COMPLEX x, y) { . . . } COMPLEX multiply( COMPLEX x, y) { . . . } COMPLEX divide( COMPLEX x, y) { . . . } COMPLEX a, b, c; c = add(a,b);
프로시져 사용의 문제점 아무 프로시저(연산)이 COMPLEX 데이터 타입 사용 가능 인터페이스와 구현이 분리되어 있지 않다.
캡슐화(Encapsulation) 동기: 큰 프로그램은 두 가지 필요 해법 단지 프로시저로 분할하는 것이 아닌 프로그램 조직 방법 분리 컴파일이 가능한 단위 해법 통합 추상화 혹은 캡슐화 논리적으로 연관된 프로시저들과 데이터 타입의 그룹화
추상 데이터 타입 기본 아이디어 캡슐화 데이터(변수)와 관련 연산(프로시저)의 통합 Simula-67에서부터 시작됨 데이터 타입을 관련 연산들과 함께 정의 데이터 + 연산들 타입의 사용을 정의된 연산들로 제한한다.
추상 데이터 타입 Data Operations
추상 데이터 타입의 장점 수정 용이성 재사용가능성 보안성 구현에 독립적인 인터페이스 표준 인터페이스로 다른 프로그램에서도 재사용 보안성 구현의 세부사항을 프로그램 다른 부분에서 접근 금지
추상 데이터 타입의 예 Modula-2의 Module Ada의 Package Java와 C++의 Class
추상 데이터 타입의 수학적 의미 (S, Op) where S is a set of data Op is a set of operations.
프로그래밍 단위 절차형 언어 ADT를 갖는 언어 객체-지향 언어 프로시저 Modula-2의 Modules Ada의 Package 객체-지향 언어 클래스(Class)
모듈을 이용한 프로그래밍 Module StackManager function pop(s:stack) : integer; type stack; function pop(s:stack) : integer; procedure push(a: integer; s:stack); function newstack : stack; representation of stacks (type stack) . . . initialization (newstack) procedure bodies (pop, push) Module StackManager var s, t : stack; begin s := newstack; t := newstack; push(10,s); . . . end.
정보 은닉(Information Hiding) 구현의 세부 사항을 정의에서 분리 구현의 세부 사항은 프로그램 다른 부분에서접근 금지
모듈(Module) 역할 인터페이스(정의) 부분 구현 부분 데이터(변수)와 관련 연산(프로시저)들의 모음 공용(public) 부분으로 패키지 밖에서도 접근 가능 구현 부분 전용(private) 부분으로 구현의 상세 사항을 작성하고 ADT 밖에서 접근 불가
클래스를 타입 이름으로 In C++ Stack s, t; s.push(7); s.push(8); In Java s = new Stack( ); t = new Stack( ); class Stack { public: Stack(); void push(int a); int pop(); private representation of stacks . . . initialization (Stack) procedure bodies (pop, push)
비교 프로시저 ADT (Modules, Packages) 데이터 타입과 연산들이 별개로 정의된다. 구현 상세사항은 프로그램 전체를 통해서 접근 가능하다. ADT (Modules, Packages) 데이터 타입과 관련 연산들을 함께 정의 인터페이스 부분과 구현 부분 구현 부분은 숨겨지고 접근은 검사한다.
비교 클래스 상속(inheritance) 클래스 자체가 정의된 타입이다. 인터페이스와 구현 객체 데이터와 관련 연산들로 구현 부분은 숨겨지고 접근은 검사한다. 객체 클래스의 실체(instance) 상속(inheritance)
9.2 프로그램 설계
프로그램 설계 프로그램 설계 클래스와 모듈 정확한 객체 혹은 모듈을 발견해야 한다. 어떤 타입을 원하는지 결정하고 각 타입에 대해 관련 연산들을 제공한다. 클래스와 모듈 프로그램의 구조를 형성한다.
모듈 var s, t : stack; begin s := newstack; t := newstack; push(10,s); type stack; function pop(s:stack) : integer; procedure push(a: integer; s:stack); function newstack : stack; type stack = ^ rep rep = record elements: array[0..100] of integer; top : integer; end; (type stack) var s: stack; begin new(s); s^.top :=0; newstack :=s end; procedure bodies (pop, push) Module StackManager var s, t : stack; begin s := newstack; t := newstack; push(10,s); . . . end.
Ada의 패키지 Ada에서 제공하는 ADT Package 구성 Package 패키지 명세(Package specification) 인터페이스 패키지 몸체(Package Body) 명세된 것들에 대한 구현
Ada의 패키지 예제 package COMPLEX_TYPE is type COMPLEX is private; I: constant COMPLEX; function + (X, Y: COMPLEX) return COMPLEX; function - (X, Y: COMPLEX) return COMPLEX; function * (X, Y: COMPLEX) return COMPLEX; function / (X, Y: COMPLEX) return COMPLEX; function +(X:float; Y:COMPLEX) return COMPLEX; function - (X: COMPLEX) return COMPLEX;, function RE (X: COMPLEX) return float; function IM (X: COMPLEX) return float; private type COMPLEX is record re, im : float := 0.0; end record I : contant COMPLEX := (0.0, 1.0); end COMPLEX_TYPE;
Ada의 패키지 예제 package body COMPLEX_TYPE is function +(X,Y:COMPLEX) return COMPLEX is begin return(X.RE+Y.RE, X.IM+Y.IM); end; function RE(X:COMPLEX) return float is begin return X.RE; end; function +(X:float; Y:COMPLEX) return COMPLEX is return(X+Y.RE, Y.IM); ... others ... end COMPLEX_TYPE;
Ada의 패키지 사용 declare use COMPLEX_TYPE; X,Y: COMPLEX; Z: COMPLEX := 1.5 + 2.5*I; begin X := 2.5 + 3.5*I; Y := X + Z; Z := RE(Z) + IM(X)*I; if X = Y then X:= Y+Z; else X:= Y*Z; end if; end
9.3 매개변수를 갖는 추상 데이터 타입
매개변수를 갖는 추상 데이터 타입 동기 매개변수 다형성(Parametric Polymorphism) 함수 혹은 프로시저가 적용될 수 있는 데이터 타입의 확장 매개변수 다형성(Parametric Polymorphism) 타입을 매개변수로 받는 메커니즘 이용 Ada: Generic C++: Template
예제 template <class T> class Stack { T* v; T* p; int sz; public: Stack(int s) { v=p=new T[sz=s];} ~Stack( ) { delete[] v;} void push(T a) { p++ = a;} T pop( ) { return *--p;} Int size( ) { return p-v;} } Stack<char> sc(100); Stack<int> si(100); Stack<point> sp(100);