자료구조를 학습하다보면, ADT라는 단어를 자주 접할 수 있다. ADT가 과연 무엇일까? 무엇이길래 여러 자료구조에서 쓰이는걸까? 한번 알아보자.
ADT(Abstract Data Type)란?
한마디로는 자료구조를 추상화한 것으로, 사람이 자료를 다루는 관점에서 자료구조를 표현한 것이다.
- 자료구조의 특징, 속성, operations들을 나타내는 것
- 어떻게 구현하는지에 대해서는 다루지 않는다.
이렇게만 설명하면 너무 추상적인데, 구체적으로는 다음의 내용들을 명세한다.
- 저장된 데이터
- 데이터에 대한 작업들(Operation)
- 작업 중 발생 가능한 에러 상황들
그리고 이러한 ADT에 구현이 들어가는 순간 Data structure가 된다.
Java 또는 OOP를 아는 사람이라면 아래의 내용을 보면 더욱 이해하기 쉬울 것이다.
ADT = Interface
Data Structure = Class
그러면, 이제 예시를 살펴보자.
예시 - Stack
Stack은 FILO(First In, Last Out)의 특성을 가지고 있고, 필요한 연산으로 다음을 떠올릴 수 있다.
- void StackInit(Stack *pstack);
- 스택의 초기화를 진행한다.
- 스택 생성 후 제일 먼저 호출되어야 하는 함수이다.
- int SIsEmpty(Stack *pstack);
- 스택이 빈 경우 TRUE를, 그렇지 않은 경우 FALSE를 반환한다.
- void SPush(Stack *pstack, Data data);
- 스택에 데이터를 저장한다. 매개변수 data로 전달된 값을 전달한다.
- Data SPop(Stack *pstack);
- 마지막에 저장된 요소를 삭제하고, 삭제된 데이터를 반환한다.
- 본 함수의 호출을 위해서는 데이터가 하나 이상 존재함이 보장되어야 한다.
- Data SPeek(Stack *pstack);
- 마지막에 저장된 요소를 반환하되 삭제하지 않는다.
- 본 함수의 호출을 위해서는 데이터가 하나 이상 존재함이 보장되어야 한다.
여기까지의 설명은 ADT라고 할 수 있다.
그런데, Stack을 구현할 때 Array로 할 것인지, Linked List를 이용할 것인지부터 시작해 직접 결과물을 만드는 작업이 가미되면 자료구조가 되는 것이다!
실무에서의 사용
그러면 만약 실무에서는 ADT와 Data Structure가 어떻게 구분되어 사용될 수 있을까? ADT를 사용하면 다음과 같은 장점이 있다.
- 효율적인 업무 분담
- 객체지향 프로그래밍
- 모듈화
이후 자료구조화를 하고 적절하게 사용하면서 모두 협업에 있어 효율이 향상됨을 알 수 있을 것이다.
사실 ADT는 용어가 낯설 수는 있어도, 이해하기 어렵지 않은 간단한 개념이고, ADT의 정의가 무엇인가보다는 자료구조를 떠올릴 때 ADT를 정리하고 이를 바탕으로 작업이 이루어질 필요가 있겠다.