본문 바로가기

책 정리/윤성우의 열혈 자료구조

Chapter 03. ADT

첫 번째 자료구조이다.

 

컴퓨터 공학에서의 추상 자료형(Abstract Data Type)

 

추상 자료형이란?

"구체적인 기능의 완성과정을 언급하지 않고, 순수하게 기능이 무엇인지를 나열한 것"

지갑을 기준으로 우리는 "카드를 넣고/빼고, 지폐를 넣고/빼고, 동전을 넣고/빼고" 이러한 기능을 가졌다고 볼 수 있다.

하지만 "지갑을 열고 동전 칸 지퍼를 열고 동전을 넣고 지퍼를 닫고 지갑을 닫는다"는 이런 일련의 과정들은 생략이 되어서 이야기를 했다.

이것처럼 추상자료형은 "구체적인 기능의 완성과정을 언급하지 않고, 순수하게 기능이 무엇인지를 나열한 것" 으로 볼 수 있다.

 

추상 자료형 = 자료형 = 기능

자료형은 기능적으로 설명할 수 있지만 데이터적 관점으로 설명하기엔 너무 애매하다.

자료형이라고 하면 그와 관련된 연산을 포함해서 하는 이야기 이다.

 

구조체를 정의한 것을 자료형으로 볼 수 있다. 그러나 그게 자료형의 정의가 완전히 끝난게 아니다.

그 구조체와 관련된 연산의 종류를 정의하는 것도 자료형 정의의 일부로 볼 수 있다.

구조체 자료형을 정의했다는 뜻은 구조체와 이 구조체와 관련된 모든 함수(연산)들을 구현하는 것이 포함이 된다.

(예를 들어 int형 자료형은 +, -, /, %, * =  연산이 가능하다. 하지만 이것도 정의된 연산들 이다.)

물론 그 이후에 이것을 기반으로 함수들이 추가적으로 정의가 되기도 한다.

 

예를들어 지갑이란 구조체를 정의하였을 경우 이 구조체를 대상으로 이뤄지는 연산은 대입연산을 제외하고

함수를 정의하여 이 두가지 기능을 정의하였다.

 

int TakeOutMoney(wallet* pw, int coinNum, int billNum)

-첫 번쨰 인자로 전달된 주소의 지갑에서 돈을 꺼낸다

-두 번째 인자로 꺼낼 동전의 수, 세 번째 인자로 꺼낼 지폐의 수를 전달한다.

-꺼내고자 하는 돈의 총액이 반환된다. 그리고 그만큼 돈은 차감된다.

 

int PutMoney(wallet* pw, int coinNum, int billNum)

- 첫 번째 인자로 전달된 주소의 지갑에 돈을 넣는다.

- 두 번째 인자로 넣을 동전의 수, 세 번째는 넣을 지폐의 수를 전달힌다.

- 넣은 만큼 동전과 지폐의 수가 증가한다.

 

이것이 자료형의 정의가 완성된 것이고 이것이 C언어를 기반으로 한 wallet의 ADT가 된다.

 

어느정도 ADT를 정의해야 하나?

한번에 완벽하게 정의 해야된다는 부담감을 벗어나고 조금씩 채워가면서 완성을 해간다고 생각을 해도된다.

 

위의 wallet 구조체 자료형이 완전히 정의가 되었다고 하면 사용자 입장에선 wallet 구조체의 멤버를 알 필요가 없다.

그냥 위의 함수를 호출함으로써 인자로 전달만 해주면 자동으로 결과가 나온다. 안에 내부적인 과정을 사용자입장에선 알 필요가 없다(파일구조체 처럼). 그러므로 ADT 정의에는 구조체 정의를 포함하지 않는다.

 

자료구조를 학습하는 방법

1. 리스트 자료구조의 ADT를 정의한다.

2. ADT를 근거로 리스트 자료구조를 활용하는 main 함수를 정의한다.

3. ADT를 근거로 리스트를 구현한다.

 

리스트 사용자에게 사용방법 이외의 불필요한 부분까지 알도록 부담을 주지 않기위해서 이와같이 공부를 하고 앞으로 모든 자료구조도 이와같이 공부를 할 것이다.