[자료구조] 추상 자료형
추상화와 추상 자료형
크고 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내어 주어진 문제를 해결하기 위한 것
불필요한 부분(차이점)을 생략하고 객체의 속성 중 가장 중요한 것(유사성)에만 중점을 두어 개략화 하는 것(모델화)
추상화의 예
- 아날로그 시계
- printf(“*****…”); // 100개의 *
- for(i=0; i<100; i++) {printf(“*”);}
추상화를 통해 코드의 재 사용성, 가독성을 높이고, 생산성의 증가, 에러 감소, 유지 보수에 있어 많은 시간을 줄일 수 있음
추상화의 범주
자료 추상화 - 계산될 자료의 특성을 추상화하는 것
프로시져(제어 혹은 알고리즘) 추상화 - 실행 순서를 제어하는 특성을 추상화하는 것
추상화(abstraction)
추상화와 구체화 비교
추상화 - “무엇(what)인가?”를 논리적으로 정의 => 알고리즘 정의
구체화 - “어떻게(how)할 것인가?”를 실제적으로 표현 => 프로그램 구현
추상화의 목적
가독성, 재 사용성, 유지보수의 용이함
소프트웨어를 명세부와 구현부로 분리하는 정보 은닉을 지원
- 객체들의 구현은 외부의 요구에 영향을 적게 받음
- 보안성 - 구현의 세부 사항을 프로그램의 다른 부분이 변경할 수 없음
자료 추상화(data abstraction)
데이터의 물리적인 표현을 의식하지 않고 현실세계의 사물을 개념화, 단순화(추상화)한 것
자료형을 기술하기 위한 도구로 객체지향기법의 기본이 되는 개념
객체 정의 시 자료(형)과 기능적인(연산) 측면으로 분리 정의하여 데이터에 대한 조작을 효과적으로 수행할 수 있는 수단을 제공
자료 추상화의 관점에서 자료형을 정의하면 의미가 명확해지고 간결해짐
- 기본적 추상화 - 컴퓨터 내부 자료 표현을 추상화하는 것(int i;, x= 2.5;)
- 구조적 추상화 - 관련된 자료값의 집합을 추상화하는 것 (typedef struct_Person)
- 단위 추상화 - 프로그램 전체 정보에 대한 추상화로서 자료의 생성, 사용에 대한 정보를 모아두는 것 (class student)
프로시져 추상화(procedure abstraction)
제어 또는 알고리즘 추상화로 실행 순서를 제어하는 특성을 추상화한 것
- 기본적 추상화 - 기계 명령어들을 모아 추상구문으로 바꾸는 것
x := x + y(계산과 값의 저장을 추상화한 배정문) - 구조적 추상화 - 검사 값에 따른 명령어 그룹을 실행하는 것
switch - case, if, for, while - 단위 추상화 - 프로시져(특정 작업을 실행)의 집합을 추상화하는 것(프로그램들을 모아 하나의 단위 프로그램으로 만듬)
package, module
자료와 프로시져 추상화
추상화를 이용한 객체의 정의 예
자료
컴퓨터 내부에서 표현하고자 하는 자료구조로서, 프로그램의 처리 대상이 되는 것
- 시스템 정의 자료형, 사용자 정의 자료형, 처리할 자료의 집합
연산(자)
자료에 대해 수행할 연산자(함수의 명칭)의 집합으로서 어떤 일을 처리하는 과정(연산자에 의해 수행)을 의미함
- 더하기 연산 => “+”에 의해 수행
struct Person { // 구조체 정의(이름)
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
char address[100]; // 구조체 멤버 3
};
int main(){
struct Person p1; // 구조체 변수 선언
class Human{
String eyes="눈";
String ears="귀";
void useEyes(){
System.out.println(eyes+"으로 봄"); }
void useEars(){
System.out.println(ears+"로 소리를 들음"); }
}
추상 자료형(ADT:abstract data type)
자료 추상화를 통해 정의되는 자료형(내부 속성 + 연산)으로 자료 및 연산을 모두 하나의 단위로 묶어 자료형에 속하는 값들의 집합을 고려한 후 적용 가능한 연산들을 정의해가면서 추상화시켜 구현하는 것
- 새로운 자료형을 자료와 연산자의 특성을 논리적으로 추상화하여 정의한 자료형
데이터와 연산의 본질에 대한 명세만 정의(하나의 단위로 묶음)할 수 있음
- 사용자의 데이터의 종류, 사용자의 각 연산 기능을 정의
- 이때, 기존의 데이터 타입을 이용하여 확장할 수 있음
캡슐화(Encapsulation) 또는 정보은닉(Information Hiding)을 도모함
- 자세한 구현은 생각하지 않고 표면적인 기능만을 생각 사용자에게 어떤 특정한 일을 하기 위해서는 어떠한 일을 해야 하는지 알려줌
- 메소드가 무엇(what)을 하는지는 알 수 있지만 어떻게(how) 실행하는지 사용자는 알 수 없음
추상 자료형의 예
자연수의 ADT
ADT Natno
데이터
{ i | i∈integer, i≥0}
연산자 및 연산내용 // all x, y∈Natno
Natno zero() //0을 반환
Boolean isZero(Natno) //x가 0이면 true, 그렇지 않으면 false를 반환
Natno succ(x) //x+1를 반환
Natno add(x, y) //x+y를 반환
Natno subtract(x, y) //x<y이면 0, 그렇지 않으면 x-y를 반환
Boolean equal(x, y) //x=y이면 true, 그렇지 않으면 false를 반환
End Natno