자료형(Data Type)
컴퓨터에서 자료(데이터)란 0과 1의 나열입니다. 예를 들어 01001100110010110101110011011100
은 정수일 수도 있고 실수, 문자일수도 있습니다. 이 자료의 해석결과인 값은 자료가 어떤 형(Type)인지에 따라 달라집니다.
데이터를 어떻게 해석하면 되는 것인지 컴파일러(또는 인터프리터)에게 알려주는 속성이라고 할 수 있습니다. 이 자료형은 일반적으로 값(value)의 집합과 그 값과 관련된 연산들의 집합을 의미합니다. 집합 즉, 수학적인 모델입니다.
자료형은 다음과 같은 종류가 있습니다.
- 원시자료형 : 기본빌딩블록 (부울, 정수, 실수, 문자 등)
- 복합자료형 : 원시형 또는 또다른 복합자료형을 조합하여 만든 것 (struct, 배열, 문자열 등)
- 추상자료형 : 동작(관련연산)에 의해 정의되는 자료형 (큐, 리스트, 스택 등)
이들 중 추상자료형(Abstract Data Type, ADT)은 구체적인 데이터의 값보다는 자료형과 관련된 동작(연산)을 통해 정의됩니다. 예를 들어 리스트 자료형은 어떠한 값으로도 구성할 수 있겠지만 리스트만을 위한 삽입, 제거, isFull, isEmpty 와 같은 연산을 수행할 수 있어야 합니다.
일반적인 생각과 달리 자료형은 특정한 프로그래밍 언어와 독립적으로 정의되기 때문에 추상화가 되어 있다고 할 수 있습니다. 추상자료형은 결국 자료형의 한 종류이며 특징적으로 값보다는 관련된 동작(연산)으로 정의되는 자료형이라고할 수 있습니다.
자료구조(Data Structure)
자료형으로 정의한 값과 연산들의 집합을 특정한 프로그래밍 언어로 구현한 것을 자료구조(Data Structure) 라고 합니다.
이들 자료구조는 다음과 같이 4가지 형태를 띄고 있습니다.
- 선형 : 배열, 리스트
- 트리 : 이진, B 트리, 힙 등
- 해시기반 : 해시트리 등
- 그래프기반 : 무향, 유향, 결정 트리 등
참고로 많은 프로그래밍 언어는 공통적으로 사용되는 원시자료형을 구현하여 언어의 한 구성품으로 제공합니다. 예를 들면 C 언어에서 기본적으로 제공하는 정수자료의 구현인 char
는 값이 -128~127 사이의 정수이며 관련 연산자는 덧셈, 뺄셈, 곱셉, 나눗셈 등으로 구현하고 있습니다.
- 원시자료형(정수) : ( .. -4, -3, -2, -1, 0, 1, 2, .. ) 와 덧셈, 뺄셈, 곱셈, 나눗셈 등의 연산
- 자료구조(
char
) : 자료(데이터)를 010101 .. 의 2진수로 나타내며 일반적으로 2의 보수 체계로 평가한 값과 그에 따른 +,-,*,/ 와 같은 연산기호의 처리
즉, 이러한 관점에서 볼 때, 원시자료형을 프로그래밍 언어에 맞게 구현한 char
역시 자료구조의 예라고 할 수 있습니다.
추상자료형의 장점
추상자료형은 소프트웨어 엔지니어링의 일반적인 원리인 추상화를 구체화 한 것입니다. 따라서 추상자료형의 개념을 도입하게 되면 다음과 같은 특성을 갖게 됩니다.
- Abstraction. 낮은단계의 구체적인 것을 좀 더 간략하고, 높은차원의 아이디어로 생략하거나 숨기는 것을 말합니다
- Modularity. 시스템(체계)을 개별적으로 설계, 구현, 시험하고 재사용가능한 컴포넌트나 모듈로 분할하는 것을 말합니다.
- Encapsulation. 모듈의 주변에 벽을 세워 모듈이 내부의 동작에 대한 책임을 지고, 시스템의 다른 부분에서 발생한 버그가 통합시 데미지를 줄 수 없도록 하는것을 말합니다.
- Information hiding. 시스템의 다른 부분에서 모듈의 상세 구현내용을 볼 수 없도록 하는 것입니다. 이를 통해서 모듈의 구현이 추후 변경되더라도 시스탬의 나머지 부분을 변경할 필요가 없습니다.
- Separation of concerns. 하나의 기능(특징)을 여러개의 모듈에 퍼트리지 않고 하나의 모듈에서 책임을 지도록 만드는 것을 말합니다.
이에 따라 프로그램에서 자료구조를 어떻게 사용하는지와 자료구조를 어떻게 구현할 것인지의 문제를 분리함으로써 복잡한 문제를 좀 더 쉽게 해결 할 수 있도록 도와줍니다.
대표적인 추상자료형인 리스트를 구현하는 방법은 연결리스트를 이용하는 것과 배열을 이용하는 것 2가지가 있습니다. 하지만 우리는 리스트를 어떻게 구현을 하는지에 관계 없이 리스트라는 추상자료형을 사용하여 좀 더 복잡한 문제를 해결 할 수 있습니다. 예를 들어 리스트를 그래프 자료구조의 구현에 사용할 수 있습니다.
정리
우리가 프로그래밍을 학습하며 자료구조를 배울때는 결국 추상자료형을 함께 학습하고 이를 구현하는 연습을 하기 때문에 이 둘을 구분하지 않고 학습하게 될지 모르지만 실제로 프로그램을 작성할 때는 이 둘을 나누어 설계 및 구현에 적용하게 됩니다.
현재 compiler를 개발하는 몇몇 프로그래머를 제외하면 어떠한 프로그래머도 C언어의 char
자료구조가 내부적으로 어떻게 구현이 되었는지 관심을 갖지 않은채 이를 이용하여 프로그램을 작성할 수 있는 것은 이러한 추상자료형 개념을 따르기 때문입니다.
참고
'알고리즘 트레이닝 > 자료구조' 카테고리의 다른 글
Geometric Application of BSTs (0) | 2019.12.16 |
---|---|
덱(Deque, double-ended queue) (0) | 2018.12.16 |
원형큐 (0) | 2018.10.24 |
그래프 (0) | 2018.06.10 |
스택과 큐 (0) | 2018.06.06 |