170 likes | 364 Views
제10장 추상 자료형 (abstraction data type). 소 개 추상화 일부 속성만으로 작업/객체들을 필요한 정도만 묘사하는 방법 필수적인 속성만 표현(나머지는 숨기거나 삭제) 유사성만 표현 관련된 사항을 묶어 하나로 표현 procedure - algorithm abstraction 연산추상화 제공 (수행과정 묘사 , ‘How’ 보다 ‘What’ 에 중점) 목적 추상화는 기계에서 일이 수행되는 구체적이고 상세한 것을 모르고도 컴퓨터의 수행작업을 쉽게 이해하도록 함. 추상 자료형.
E N D
제10장추상 자료형(abstraction data type) • 소 개 • 추상화 • 일부 속성만으로 작업/객체들을 필요한 정도만 묘사하는 방법 • 필수적인 속성만 표현(나머지는 숨기거나 삭제) • 유사성만 표현 관련된 사항을 묶어 하나로 표현 • procedure - algorithm abstraction • 연산추상화 제공(수행과정 묘사, ‘How’ 보다 ‘What’에 중점) • 목적 • 추상화는 기계에서 일이 수행되는 구체적이고 상세한 것을 모르고도 컴퓨터의 수행작업을 쉽게 이해하도록 함
추상 자료형 • 자료형 = 객체들의 집합 + 객체들에 작용하는 연산집합(실체화, 구축, 소멸, 분리 연산) • 자료 추상화(Data Abstraction) • (자료형 표현 + 연산들) : 캡슐화 • 캡슐화(encapsulation) • 부적당한 사용을 배제하기 위한 보호막 ∴ 창문(windows) 제공 캡슐화된 정보 사용 • 구성 • 공개부(public part) 또는 가시부(visible part) • 전용부(private part) 방출(export)과 도입(import) • Modula, Euclid module • Ada package • Simula 자료 추상화 개념으로 class,최초 도입함 • CLU cluster, ALPHARD form
추상 자료형 • 다음 2가지 조건을 만족하는 자료형 • 자료를 연산과 함께 선언 (자료추상화 : data abstraction) • 정보 은닉 개념 도입 (자료캡슐화 : dataencapsulation) • 구현 종류 : class, cluster, flavor, form, modula, package, structure ... • 언어 설계의 요구조건인 modifiability, reusability, safety(보안), readability … 만족 • 추상화 제공시 고려 사항 • 자료 추상화 구문 형태는? • 영역 규칙과 생성된 객체의 생존기간은 ? • 초기화 또는 최종 마무리할 코드 세그먼트 허용 여부 • 추상 자료형을 선언하여 여러 개의 실체화 생성 여부 • 추상 자료형 정의에 매개 변수화 사용 여부 • 실체화들 사이에 자료 공유 사용 여부
Queue 구조 (structure 개념 사용) structure queue = operations ADDQ, DELETEQ, ISEMPTYQ representation ... end rep procedure ADDQ(...) . . . end ADDQ procedure DELETEQ(...) . . . end DELETEQ procedure ISEMPTYQ(...) . . . end ISEMPTYQ procedure NEXT(...) // 지역함수, 내부에서만 . . . end NEXT begin initialization code end end queue <queue 구조> • 구성 1) 연산 이름 2) 자료형 표현 3) 연산 구현 4) 초기화 • operations - 방출된 연산 : ADDQ, DELETEQ, ISEMPTYQ - 방출되지 않은 연산 : NEXT • representation … end rep - 큐의 표현 정의 <queue 형 변수 선언> var x:queue 추상 자료형
완성된 Queue 구조 structure queue = operations ADDQ,DELETEQ, ISEMPTYQ; representation integer array q(0:99); integer front, rear; end rep procedure NEXT(I:integer); i := (i + 1) mod 100 end NEXT; procedure ADDQ(p:queue, item:integer); NEXT(rear) if front = rear then QUEUFULL else q(rear) := item endif end ADDQ; procedure DELETEQ(q:queue) returns item:integer; if ISEMFTYQ(q) then QUEUEEMPTY else NEXT(front) item := q(front) end if end DELETEQ; procedure ISEMPTYQ(q:queue) returns flag:boolean; flag := front = rear end ISEMPTYQ; begin front := rear := 1 end; end queue 추상 자료형
추상 자료형 • Ada의 자료 추상화 • Ada의 단위 프로그램 종류 • subprogram(procedure, function) • package 모듈 프로그램이면서 자료추상화 지원 • Task 모듈 프로그램이면서 병행성 지원 • Package • 구성 1) 명세부 ① 가시부– 자료(연산 이름과 자료형 이름) 방출 또는 도입 with : 다른 package로 자료 방출, use : 도입된 이름의 한정자 생략하여 사용 ② 전용부 - 자료 방출 불허용, 자료형의 구체적인 표현 정의 2) 몸체부 - 연산(부프로그램) 구현 • 특징 : 명세부, 몸체부의 변수 : own 변수 개념으로 가시부의 부 프로그램 호출 시 변수의 이전 값이 남아 있음 (정적변수 특성)
이진 트리 package 명세부, 몸체부 < package BSTREES 몸체부> <package BSTREES 명세 선언> package body BSTREES is function HAS(I:ITEM,P:BSTREEPTR) return BOOLEAN is Q:BSTREEPTR; begin Q := P; loop if Q = null then return FALSE; elsif I < Q.DATA then Q := Q.LEFTCHILD; elsif I > Q.DATA then Q := Q.RIGHTCHILD; else return TRUE; end if; end loop; end HAS; procedure INSERT(I:ITEM, in out:BSTREEPTR); --프로시저 INSERT의 기술 function EQUAL(P, Q:BSTREEPTR) return BOOLEAN; if P = null and Q = null then return TRUE; elsif P = null or Q = null then return FALSE; elsif P.DATA = Q.DATA then if EQUAL (P.LEFTCHILD, Q.LEFTCHILD) then return EQUAL (P.RIGHTCHILD, Q.RIGHTCHILD); else return FALSE; end if; else return FALSE; end if; end BSTREES; package BSTREES is type BSTREEPTR is private; function HAS(I:ITEM, P:BSTREEPTR) return BOOLEAN; procedure INSERT(ILITEM, in out P:BSTREEPTR ); function EQUAL(P, Q:BSTREEPTR) return BOOLEAN; private type BSTREEPTR; type BSTREE is record DATE:ITEM; LEFTCHILD:BSTREESPTR; RIGHTCHILD:BSTREEPTR; end record; type BSTREEPTR is access BSTREE; end; 추상 자료형
<BSTREES 패키지 호출> declare use BSTREES; P,Q : BSTREEPTR; begin p := new BSTREE('A', null, null) INSERT('B', P); INSERT('Z', P); INSERT('H', P); end; 추상 자료형
추상 자료형 • 포괄 패키지 추상 자료형 (표 10.5 generic stack package) generic SIZE:INTEGER; type ELEM is private; package STACKS is type STACK is limited private; procedure PUSH(S:in out STACK; E:in ELEM); procedure POP(S:in out STACK; E:out ELEM); OVERFLOW, UNDERFLOW : exception; private type STACK is record SPACE:array(1 .. SIZE) of ELEM; INDEX:INTEGER range 0 .. SIZE := 0; end record; end; package body STACKS is procedure PUSH(S:in out STACK; E:in ELEM) is begin if S.INDEX = SIZE then raise OVERFLOW; endif; S.INDEX := S.INDEX + 1; S.SPACE(S.INDEX) := E; end PUSH; procedure POP(S:in out STACK; E:out ELEM) is begin if S.INDEX = 0 then raise UNDERFLOW; endif; E := S.SPACE(S.INDEX); S.INDEX:= S.INDEX - 1; end POP; end STACKS; • 포괄 패키지(STACK 구현) - 스택 크기와 원소형 매개변수화 - 매개변수 추상 자료형 • 연산 PUSH( ), POP( ) • 예외조건 OVERFLOW, UNDERFLOW • 실체화 (크기가 100인 정수형 스택 package 생성) package INTSTACK is new STACKS(SIZE =>100, ELEM=>INTEGER); • 생성된 package사용 declare use INTSTACK; X, Y:STACK; ... begin PUSH(X, 175); PUSH(Y, 82); POP(X, I); POP(Y, J); end;
추상 자료형 • C++의 자료 추상화 • 객체지향 프로그래밍 지원 • 자료 추상화 지원 : 클래스(class)제공 cf)Ada : 패키지를 사용하여 캡슐화하고 추상화 지원 • 클래스 개념 • 클래스의 실체 (instances) • 객체의 선언으로 생성 • 실체화 시킨 선언문의 영역에서 벗어날 때 소멸(스택 변수로 한정) • 데이터 멤버 : 클래스에서 정의된 자료 • 멤버함수 : 클래스에서 정의된 함수 • 한 클래스의 모든 실체(객체)들은 하나의 멤버 함수 집합 공유하며, 각자 자신의 클래스 데이터 멤버의 집합 소유 • 참고 클래스는 힙 변수적 데이터 멤버 소유 가능 (new, delete 지원)
추상 자료형 • 멤버 함수 (member function) • 함수의 header(함수명 정의)와 body(프로그램 routine 문장들)로 구성 • 클래스 내에서 인라인(inline)됨 • 생성자 (constructor) • 객체를 생성할 때 필요한 매개 변수의 제공과 초기화 기능 • 소멸자 (destructor) • 클래스 이름 앞에 ‘~’ 기호를 붙여서 사용 • 클래스 실체 소멸시 묵시적으로 호출 • 할당된 힙 기억 장소 해제
추상 자료형 • 매개변수 자료 추상화 #include <iostream.h> template <class Type> class stack { private: Type *stack_ptr; int max_len; int top_ptr; public: stack( ) { stack_ptr = new Type[100]; // 생성자 max_len = 99; top_ptr = -1; } stack (int size) { // 생성자이면서 틀 매개변수 stack_ptr = new Type[size]; max_len = size-1; top = -1; } ~stack( ) { delete stack_ptr; } void push (Type number) { if (top_ptr == max_len) cout << “Error in push-stack is full\n”; else stack_ptr[++top_ptr]=number; } void pop( ) { if (top_ptr == -1) cout << “Error in pop-stack is empty\n”; else top_ptr--; } Type top( ) { return (stack_ptr[top_ptr]); } int empty() { return (top_ptr == -1); } } • C++에서의 자료 추상화 #include <iostream.h> class stack { private: int * stack_ptr; int max_len; int top_ptr; public: stack( ) { // 생성자 stack_ptr = new int [100]; max_len = 99; top_ptr = -1; } ~stack( ) { delete [ ] stack_ptr; }; void push (int number) { if (top_ptr == max_len) cout << “Error in push-stack is full\n”; else stack_ptr[++top_pt] = number; } void pop( ) { if (top_ptr == -1) cout << “Error in pop-stack is empty\n”; else top_ptr--; } int top( ) { return (stack_ptr[top_ptr]); } int empty( ) { return (top_ptr == -1); } }
추상 자료형 • 수학적 추상화 명세(algebraic specification) • 자료형에 대한 일반적 형태의 정의는, • 속성(attribute)을 갖는 서로 구별되는 여러 클래스들로 구성 • 클래스1 : 정의하고자 하는 새로운 자료형의 객체 표현을 위한 속성들로 구성됨 • 클래스2 : 기 정의된 연산을 이용하여 새로운 자료형에 필요한 연산을 구현 • 클래스n : 정의하고자하는 자료형의 또 다른 특징들 기술 • 예)스택 구현 시, • 클래스1 : 스택 자료형을 배열로 표현 • 클래스2 : 스택 연산 구현(push, pop 등) • 클래스n : 스택 연산과 관련된 특성 기술(last-in first-out 등) • 자료 추상화 지원 언어에서 이를 사용하는 특징(이유?) • 자료 추상화 기법이 강 자료형(strongly typing)을 지원함 • 객체들에 적용되는 연산들의 타당성 검증하는 보증자 역할 • 안전한 호출 보장과 비밀 보장 지원(hiding)
추상 자료형 • 자료형의 수학적 추상화 명세 • 자료형의 이상적인(수학적인) 추상화 기술 기법 • 현존 언어에는 미 제공, 구현보다 설계에 유용 • 새로운 언어 개발에 적용 • 수학적 명세 (algebraic specification) - Guttag • 자료형의 일반적 형태를 정의하는 것을 지원함 • 구문 명세 - 자료형 이름, 연산, 연산의 매개 변수형 열거 • 의미 명세 - 연산 특성을 자료 표현과 독립적으로 대수 방정식을 이용하여 기술 • 제한 명세 - 연산 적용 전후의 조건들을 기술 • 그럼으로서, 프로그램 간결성(판독성 증가, 언어 사용 용이) 지원 • 수학적 명세 사용 언어의 구성 (5개의 기본 함수) • 함수적 구성(function composition) • 동등 관계 • 논리 상수(true, false) • 무한 개의 자유 변수 ∴ 기본 요소를 이용한 새로운 자료형 정의를 가능케 하여 언어를 확장시킴
<표 10.8 자료형 스택의 수학적 추상화 명세> structure stack; (구문명세 ) newstack( ) → stack push(stack, item) → stack pop(stack) → stack top(stack) → item isnew(stack) → boolean declare stk:stack, i:item; (의미명세) pop(push(stk, i)) = stk top(push(stk, i)) = i isnew(newstack( )) = true isnew(push(stk, i) = false restrictions (제한명세) pop(newstack( )) = error top(newstack( )) = error • 자료형 이름 • 연산 • 연산의 매개변수형 • 연산의 특성 (자료 표현과 독립적) • 연산의 조건 추상 자료형
ifthenelse(true, q, r) = q ifthenelse(false, q, r) = r if p then q else r Infix 형태로 이름 지어 사용 추상 자료형 structure queue; newq( ) → queue addq(queue, item) → queue deleteq(queue) → queue frontq(queue) → item isnewq(queue) → boolean declare q, r:queue, i:item; isnewq(newq) = true isnewq(add(q, i)) = false deleteq(newq) = newq deleteq(addq(q, i)) = if isnewq(q) then newq else addq(deleteq(q) , i) frontq(addq(q, i) = if isnewq(q) then i else fromtq(q) restrictions frontq(newq) = error <표 10.9 자료형 queue의 수학적 추상화 명세> <함수 ifthenelse( ) 정의>
Programming Languages- The end of Chapter 10 -To Be Continue ...