추상화와 추상 자료형

크고 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내어 주어진 문제를 해결하기 위한 것

불필요한 부분(차이점)을 생략하고 객체의 속성 중 가장 중요한 것(유사성)에만 중점을 두어 개략화 하는 것(모델화)

추상화의 예

  • 아날로그 시계
  • 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 | iinteger, i0}
연산자  연산내용 // 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