메뉴릿 카테고리 최근 등록된 덧글 최근 등록된 트랙백 이전블로그 이글루링크
이글루 파인더
rss

skin by 이글루스
.

ADT - 추상데이터 타입

ADT

윤 상배

dreamyun@yahoo.co.kr


차례
1절. 소개
2절. 데이타 추상화
2.1절. 추상에 대해서
2.1.1절. 그림에서의 추상
2.1.2절. 프로그래밍 에서의 추상
2.2절. ADT(Abstracte Data Type) - 데이타의 추상 -
3절. 결론

1절. 소개

이글은 자료구조와 알리즘에 관련된 첫번째 글로서, 필자의 대학원과정중에 있는 자료구조 수업의 내용을 나름대로 정리하고 공부해서 올리는 글이다.

관련전공자라면 분명히 2-3학기 정도는 수강했을것으로 생각되므로 어찌 보면 뻔한내용일수도 있겠다. 이미 수강했다면 복습하는 마음으로 가볍게 읽으면 좋을듯 하다.

비록 개인적으로 공부하는 내용을 올리기는 하지만 많은 이글을 읽는 독자?분들이 너무 심심하지 않도록 이론과 더불어 실제 구현에 중점을 두고 글을 전개해 나갈 것이다.

자료구조/알고리즘 자체가 배워야할 내용이 상당히 많음으로 시간이 좀걸리긴 하겠지만 최종적으로는 데이타베이스 구조/구현 까지를 다루게 될것이다.

개인적인 목표는 자료구조/알고리즘의 이론및 구현을 충분히 다루고, 데이타베이스 구조/구현에 대한 기술을 익혀서 RDBMS 정도를 구현할수 있는 능력을 가지는 것이다.


2절. 데이타 추상화

이번장에서는 데이타 추상화에 대한 내용을 다룬다. 설명은 이글을 읽는 여러분이 C/C++ 에 익숙하다는 가정하에 쓰여지게 될것이다 - 주로 개념적인 설명임으로 코드를 이해할수 있을 정도만 되면 충분하다 -.


2.1절. 추상에 대해서

보통 영어로 abstract라고 하며, 한문으로는 抽象 이라고 표기된다. 그럼 추상이란 무엇인가에 대해서 뜻풀이를 해보도록 하자.

아무래도 우리는 한자문화권에 속해 있고, 추상역시 한자어 임으로 抽象 을 이용해서 기본적인 뜻을 알아보도록 하겠다. 抽 는 "빼다", "없애다" 의 뜻을 가지며, 象 은 "모양", "그림", "형태" 의 뜻을가진다. 즉 "모양이나 형태가 없는", "모양이나 형태를 뺀 혹은 감춘", 이란 뜻을 보여준다.

다시말해서 보이지 않는 것의 실체를 뜻한다. 보이지 않는데 실체가 있다니.. 무슨소리인가. ... 권력은 눈에 보이지 않지만 사회를 지배하고, 평화를 낳기도 하며 전쟁을 일으키기도한다. 숫자도 눈에 보이지 않지만 물리법칙을 통해 우주의 질서를 이루어낸다. 사랑역시 눈에 보이지 않지만 남여사이를 관장한다.

권력의 실체는 저뒤에 숨어 있으며, 우리는 그 권력의 결과를 몸소 체험하면서 살고 있다. 보이지 않는 저 뒤의 권력이 어떻게 작용하느냐에 따라서 사회, 국가 개인의 희비가 교차한다. 눈에 보이지 않음으로 별거 아니라고 생각하고 있지만 실은 눈에 보이는것보다 더 큰힘을 행사하는게 이런 추상적인 것들이다.

세계적인 철학자, 과학자, 정치가, 경제가 들은 이러한 보이지 않는 실체를 탐구해서 그 핵심에 거의 다다르고 있는 사람들이다. 이러한 추상화는 보이지 않는 실체와 그 결과를 구분시켜 준다. 그럼으로써 얻는 이익을 생각해 보자. 보통의 일반인들은 경제가 어떻게 구현되고 흘러가는지 알지 못해도 세상을 살아갈수 있다. 정치, 과학, 수학 이런것들 역시 마찬가지이다. 이런 고효율의 사회(국가)를 만들어 준다. 개인에게 다른것들이 어떻게 구현되는지 신경쓸필요 없이 자신의 전분분야에 집중할수 있게 만들어 주기 때문이다.

추상화가 이루어지지 않은 사회에서는 세상을 살아갈경우를 생각해보자, 원시 부족사회를 예를 들어보자면 하나의 가정은 살아남기 위해서, 수렵도 해야 하고, 사냥도 해야하고, 밭도 일구어야 하고, 집도 만들어야하고 가재도구도 손수 만들어야 하며, 아이들 교육도 직접 해야한다. 부족내에서 구하기 힘든 물건을 구하기 위해서 손수 물물교환을 해야하기도 한다. 회의에도 몸소참석해야 한다. 하나부터 열까지 모두 신경써줘야 한다. 그나마 간단한 부족사회라면 가능하겠지만, 조금만 규모가 커지면 이정도가지고는 힘들어진다. 지금 사회를 살고 있는 우리는 쌀이 어떻게 만들어져서 어떤경로를 거쳐서 쌀통까지 오는지 몰라도 된다. 이런건 농사꾼, 유통업자, 가공업자 등등의 사람들이 할일이다. 경제 수학 다른 것도 마찬가지다. 그럼으로 개인은 개인이 할일에 충실히하는 (물론 다른분야에도 약간의 관심을 가지고 접근하면 더 좋겠지만) 정도로도 복잡한 사회를 유지시켜 나갈수 있게 된다.

이런 추상화의 능력이야 말로 인간과 동물을 구분시켜주는 지적능력의 산물이라고 볼수 있다.


2.1.1절. 그림에서의 추상

미술로 보자면 구상화의 반대되는게 추상화인데, 구상화가 있는 그대로 사물을 화폭을 통해보여주는 반면 추상화는 화폭뒤에 화가의 의도와 의식을 "감추거나 일부분을 생략해서" 나타내고 있음을 알수 있다. 관객은 화폭에 그려진 이상한 선과 색의 변화를 가지고 화가가 전달하고자 하는 숨겨진 의도를 유추해 내야만 한다. 왜.. 화가는 구상화를 이용해서 구체적으로 자신의 의도를 관객에서 보여주지 않고, 무언가 빠진듯한 추상화를 이용해서 자신의 의도를 보여주려고 하는것일까.

그림 1. 추상화 1

그림 2. 추상화 2 - 몬드리안의 Broadway Boogie woogie

그림 3. 추상화 3 - 클림트의 The Kiss

구상화의 장점은 명확해서 이해하기가 쉽다는 점일 것이다. 반면 단점은 전하고자 하는 한가지(눈에보이는것)만 전달할수 있다는 것이다. 게다가 사람의 변화무쌍한 기분 선하고 악한 감정, 나약하고 무기력한듯 하지만 모든걸 초월하는 사랑.. 이런것들은 표현하기가 매우 애매하다.

반면 추상화는 처음에 이해하기는 어렵지만, 그야말로 다양하고 폭넓은 개인의 사상과 의도를 관객에게 보여줄수 있다. 화가가 능력이 좋다면 슬프기도 하면서 기쁘기도 한 마음의 상태를 화폭에 담아서 표현할수 있으며, 관객은 수준만 된다면 하나의 그림을 통해서 다양한 경험을 할수 있게 된다. 이러한 것은 화가가 자신의 의도를 화폭뒤에 숨기기(추상화) 때문에 가능해진다.


2.1.2절. 프로그래밍 에서의 추상

프로그래밍에서의 추상 역시 그림에서의 추상과 비슷한 의미를 가진다. 추상그림(추상화라고 하면 헷갈릴것 같아서 추상그림 이라고 표현함)에서 다양한 작가의 의도를 표현하기 위해서 화폭뒤에 작가의 실제의도를 숨겼는데, 프로그래밍에서의 추상화도 역시 이러한 목적으로 만들어진 개념이다.

그림에서 화가가 숨기고자 하는 것은 화가의 의도였다. 프로그래밍에서 숨기고자 하는것은 무엇일까 ? 구현 이다. 화가는 자신의 의도를 화폭뒤에 숨겼다. 프로그래밍에서는 구현을 class(Ada 라면 package) 뒤에 숨긴다.

물론 그림에서의 추상과 프로그래밍에서의 추상이 완전히 동일한건 아니다. 목적이 약간 다른데, 그림에서의 추상은(화폭뒤에 의식을 숨김) 은 관객에게 다양한 사고의 경험을 하게 하기 위한 것이고, 프로그래밍에서의 추상화는 class 개발자가 구현을 클래스 뒤에 (추상화)숨기게 됨으로 class 사용자(역시 개발자이지만)는 구현이 어떻게 되어있는지 신경쓰지 않고 class 의 기능을 이용하게 하도록 하기 위함이다.

추상은 OOP 의 핵심이며, 최근발표되는 언어들은 여러가지 형태로 추상을 지원한다. C 의 경우는 직접적으로 추상을 지원하지 않지만 추상을 지원하는것처럼 사용할수는 있다.


2.2절. ADT(Abstracte Data Type) - 데이타의 추상 -

이상 추상에 대해서 이런저런 잡다한 얘기를 늘어 놓은것은 추상 데이타 타입(ADT)에 대한 설명을 위해서였다.

추상 데이타 타입역시 프로그래밍에서의 추상과 마찬가지로 구현과 사용을 (구현을 숨김으로써)분리시키기 위해서 사용하는 개념이다. 이때 숨겨지는 구현이 자료구조를 위한 것이면 추상 데이타 타입이되 는 것이다.

간단한 예를 들어 보도록 하자. 만약 여러분이 stack 자료구조를 ADT 를 통해서 구현해야 한다고 했을때, 다음과 같이 class 를 통해서 ADT 를 정의 할수 있을 것이다.

예제 : stack_adt.cc

#include <iostream.h>
#define MAX_ELE_NUM 256

using namespace std;

// Stack Class
class Stack
{
private:
int element_num;
int mystack[MAX_ELE_NUM];
public:
Stack();
int push_back(int);
int get_back();
int size();
};

// 생성자
Stack::Stack
()
{
element_num = 0;
memset(mystack, 0x00, sizeof(int)*MAX_ELE_NUM);
}

// 데이타 입력
int Stack::push_back(int data)
{
if (element_num > (MAX_ELE_NUM))
{
return -1;
}
mystack[element_num] = data;
element_num++;

return 1;
}

// 데이타 가져오기
int Stack::get_back()
{
element_num--;
return mystack[element_num];
}

// 가지고 있는 데이타의 갯수
int Stack::size()
{
return element_num;
}

int main()
{
int i;
Stack *mystack;
int size;

mystack = new Stack;
mystack->push_back(1);
mystack->push_back(2);
mystack->push_back(3);
mystack->push_back(4);

size = mystack->size();
for(i = 0; i < size; i++)
{
cout << mystack->get_back() << endl;
}
}
이렇게 ADT 를 이용해서 자료를 추상화 할경우 얻을수 있는 이익에 대해 생각해보자. 위의 Stack class 를 라이브러리화 해서 관리할경우 클래스 사용자는 stack 자료구조를 어떻게 구현해야 하는지 신경쓸필요없이 자신의 개발에만 전념할수 있다. class 개발 자가 get_back() 함수에 문제가 생겨서 이것을 바꿀경우가 생기더라도 (인수나 리턴값이 바뀌지 않는한) class 사용자는 여기에 대해서 전혀 신경쓸 필요가 없다. class 사용자가 class 사용중 버그를 사용했다면, 해당문제만 개발자에게 알려 주고 자신은 작업을 계속하면 된다. 전체적으로 개발속도가 빨라질것이며, 유지보수 역시 수월해 질것이다.

위의 코드의 경우 c++ 을 이용했는데, 기본적으로 class 를 이용할 경우 쉽게 ADT 를 정의할수 있기 때문으로 개념설명에 적합하기 때문이다 (class 자체를 ADT라고 볼수 있다). 물론 ADT 는 개념임으로 약간더 신경써주면 C 로도 어렵지 않게 정의 할수 있다.

위의 코드는 int 자료만을 stack 에 입력할수 있는데, c++ 의 다형성을 이용하면 다른 자료형으로도 쉽게 확장 가능할것이다. 만약 Template 를 사용할경우 거의 대부분의 자료형에 대한 입/출력이 가능할것이다. Template 에 대한 내용은 stl(1)-STL 개요에서 (비록 간단하지만)다루고 있음으로 참조하기 바란다.


3절. 결론

본론인 ADT 를 다루기 전에 추상의 개념에 대해서 꽤 많은 내용을 다루었는데, 이는 현대 프로그래밍에 있어서 추상이 대단히 중요한 주제임에도 불구하고 개념적인 이해가 부족한 경우를 자주 보아왔기 때문이다. 추상의 개념을 제대로 이해하고 있으면 현대 프로그래밍의 줄기를 이해하기가 좀더 쉬워진다.

자료구조에 들어가기전에 앞서 ADT를 다룬 이유는 앞으로 자료구조를 구현함에 있어서 ADT 를 정의해서 구현할 예정이기 때문이다. 이 문서에서는 ADT 의 개념을 c++ 을 통해서 구현했는데, 머리도 식힐겸 c 로도 한번 구현해 보기 바란다. 그래도 시간이 남는다면 템플릿버젼도 연습삼아 만들어 보기 바란다.

by yundream | 2007/03/20 01:54 | 트랙백 | 덧글(4)

트랙백 주소 : http://yundream.egloos.com/tb/91005
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by alones at 2007/03/20 11:00
좋은 글들이 많군요 ^^ 자주 자주 오겠습니다~~ rss 가져갑니다~
Commented by 강풍 at 2007/03/20 12:21
형은 하루죙일 이런 문서 작성하는게 일인거얌? ㅡ_ㅡ;; 너무 잘 쓰자넝.
근데 오타 발견.
1절. 소개
이글은 자료구조와 알리즘에 -> 알고리즘에
캬캬... ㅡㅡ;;
Commented by yundream at 2007/03/20 13:01
이 문서 작성한게 한 4년전인가야... 쿨럭..
그리고 그 명인어쩌고 TV프로 못봤어 ?
하루에 양푼그릇 600개 만들어내는 사람도 있잖아.
그냥 훈련되다 보니.. 주제하나 정하고 맘먹고 글쓰면 한시간이면 .. 쫑.
Commented by yundream at 2007/03/20 13:02
... 오오.. 도움이 되었다니 다행입니다.

강풍 // 응 수정할께 =.=;

:         :

:

비공개 덧글

이글루스 | 로그인