2 분 소요

우리는 이미 내장된 데이터 자료형인 int, float, double, long 등등을 알고 있다. 그리고 이러한 내장 데이터 자료형들을 이용해 산수와 같은 간단한 연산도 실행할 수 있다. 그런데, 이렇게 이미 정의된 데이터 자료형 말고도, 우리가 따로 데이터 자료형을 정의하여 특정 연산을 수행해야만 할 때도 있을 것이다. 이럴 경우, 우리가 따로 자료 구조를 만들고, 그에 따른 연산 기능도 추가할 수 있을 것이다. 이렇게 자료 구조를 만들기 위해 해당 자료구조에 대해 추상적으로 표현한 것을 추상 데이터 자료형 (Abstract data type, ADT)이라고 한다.

좀 더 자세히 말하면, 추상 데이터 자료형은 여러 값들과 연산들을 통해 객체가 어떻게 행동해야할지 정의하는 객체에 대한 자료형(type) 또는 클래스(class)라고 볼 수 있다. 추상 데이터 자료형은 어떤 연산이 수행되어야하는지만 알려줄 뿐, 그 연산을 어떻게 수행할 것인지, 연산 수행을 위해 어떤 알고리즘을 구현할 것인지에 대한 설명은 전혀 없다. 또한 데이터가 메모리에 어떻게 배열할 것인지에 대해서도 설명하지 않는다. 그냥 “해당 자료구조를 만들려면 이렇게 하세요”만 설명되어 있을 뿐이다. (마치 파이썬의 추상 클래스 (클래스, 객체 문서 참조)와도 비슷하다) 이렇게, 세부사항들은 숨긴 채 본질만을 보여주는 성질 때문에 “추상”이라는 이름이 붙게 되었다.

이러한 이유로 추상 데이터 자료형과 자료 구조는 엄밀히 말해 서로 다른 개념이다. 자료 구조는 추상 데이터 자료형을 구체화한 것이다. 일종의 기획자 - 개발자 관계라고 볼 수 있겠다. 기획자가 “이러이러한 기능을 하고 이러이러한 디자인을 갖는 홈페이지를 만들어주세요”라고 방향만 설정하면 개발자는 이를 실체로 구현하는 것과 같다. 개발자가 홈페이지를 구현하기 위해 어떤 방법과 기술을 사용하던 기획자 입장에서는 자기가 원하는 기능을 가진 홈페이지만 완성되면 상관없는 것과 같다.

이러한 이유로, 데이터 자료형을 이용하는 사람의 입장에서는 해당 자료형이 어떻게 수행되는지에 대해 알 필요가 없다. 단지 해당 자료형으로 어떤 일들을 할 수 있는지에 대해서만 알면 된다. (자동차 내부 구조를 몰라도 운전하는데엔 지장이 없는 것처럼. 이렇게 내부의 세부 사항은 숨기고, 데이터에 접근하거나 어떤 작업을 하기 위해 필요한 인터페이스만을 사용자에게 제공하는 특성을 캡슐화(encapsulation)라고 한다) 추상 데이터 자료형은 데이터와 그 데이터에 대한 연산들을 하나의 단위 안에 캡슐화하는 방법이라고 볼 수 있다.

추상 데이터 자료형의 특징으로는 다음이 있다.

  • 추상화(abstraction): 자료 구조를 사용하는 사람은 그 자료 구조가 어떻게 구현되고 실행되는지에 대해 알 필요가 없다.
  • 더 나은 개념화 (conceptualization) : 현실 세계를 개념화하는 좋은 방법을 제공한다.
  • 견고성 (robust) : 프로그램이 견고해지고, 에러를 잘 발견할 수 있는 능력이 생긴다.
  • 캡슐화 (encapsulation) : 데이터에 대한 내부적인 세부사항은 사용자로부터 숨기고, 사용자에게는 데이터와 상호작용할 수 있는 공개된 인터페이스(public interface)를 제공한다. 이로 인해 자료 구조를 더 쉽게 유지하고 변경할 수 있다.
  • 데이터 추상화 (data abstraction) : 자료구조가 어떻게 실행되는지에 대한 정보를 사용자로부터 숨기기에, 사용자는 그저 데이터에 대해 어떤 연산을 할 수 있는지만 알면 될 뿐, 그 연산들이 어떻게 수행되는지에 대해선 알 필요가 없다.
  • 자료 구조 독립성 (data structure independence) : 추상 데이터 자료형은 배열이나 linked list와 같은 다른 자료구조를 사용할 수 있다. 다른 자료구조를 사용해도 기능성에 영향을 받지 않는다.
  • 정보 은닉(information hiding) : 권한이 있는 사용자와 권한 있는 연산에 대해서만 데이터 접근을 허용함으로써 데이터를 온전하게 보호할 수 있다. 이를 통해 데이터의 오용과 에러 발생을 방지할 수 있다.
  • 모듈성 (modularity) : 추상 데이터 자료형은 다른 추상 데이터 자료형과 결합하여 더 거대하고 복잡한 자료구조를 형성할 수 있다. 이러한 특성은 프로그래밍에 있어 더 좋은 유연성과 모듈성을 제공한다.

자료구조는 크게 배열 기반의 연속(continuation) 방식과 포인터 기반의 연결(link) 방식으로 분류할 수 있다. 연속 구조에는 문자열, 리스트, 튜플, 딕셔너리 등이 있다.

다음 페이지에서부터는 스택, 큐 등의 여러 추상 데이터 자료형과 이를 구현하는 자료 구조에 대해 살펴보겠다.


Reference

[1] 지은이: 미아 스타인, 옮긴이: 최길우, “파이썬 자료구조와 알고리즘”, (2019, 한빛미디어)

[2]

Abstract Data Types - GeeksforGeeks

[3]

추상 자료형

This content is licensed under CC BY-NC 4.0

댓글남기기