7. Abstract Data Types(ADT)
대학교 1학년 2학기 c/c++입문 강의 말미에 abstract data type이라는 말을 처음 들었습니다. 단순히 시험을 보기 위해 내용을 암기했고 제대로된 이해가 되지 않은 채 3년이 지난 지금(병장 3호봉)에 와 있습니다.
이것이 왜 중요하고 파이썬을 공부하면서 객체 지향 프로그래밍과 함께 왜 이렇게 언급이 많이 되는지에 대해 이번 시간에 배워 보는 시간을 가지도록 하겠습니다.
1. Abstract Data Types가 무슨 말일까
이름부터 감이 잡히지 않는 ADT는 무엇인지 한글말로 해석하며 설명해보겠습니다.
영어사전에 abstract를 검색하면 '추상적인'이라는 말이 나오고, 추상적인이라는 말이 애매해서 국어사전에 검색해보니
구체성(具體性)이 없어서 그 뜻이 분명하지 않은 (것).
이렇게 나옵니다. 따라서 abstract data type을 우리나라 말로 쉽게 설명하자면 "구체적이지 않은 자료형"이 되는 것입니다. 이렇게 우리말로 보아도 무슨 말인지 잘 모르겠으니 프로그래밍에서 사용되는 abstract data type의 정의와 개요를 살펴보도록 하겠습니다.
Abstract Data Type의 정의는 다음과 같습니다.
문제를 해결하기 위해 필요한 자료의 형태 및 연산을 수학적으로 정의한 모델
ADT는 추상적인 개념일 뿐, 구체적인 룰이 없는 상태라고 이해하면 됩니다. 집합, 리스트, 큐, 덱, 스택, 트리 등이 이에 해당합니다. ADT에 대해 구글링을 해보면 많은 블로그들이 ADT의 형태로 큐와 스택의 예시를 들어 설명하고 있는 것을 볼 수 있습니다. 프로그래밍을 하다보면 숫자형(int), 문자열(str), 튜플,딕셔너리 등의 데이터 타입보다 더 복잡하지만 자료를 보관하는데 훨씬 효율적이고 강력한 성능을 갖는 자료형이 필요할 때가 있습니다.
이렇게 문제상황 해결 및 목적에 맞는 자료 자체의 형태와 그 자료에 관계된 연산들을 고려하여 적합한 자료형을 개념적으로 생각해볼 수가 있고, 그러한 자료형을 ADT, 추상적 자료형이라고 합니다.
2. 자료 구조(Data structure)
자료가 어떤 형태로 저장되며 자료의 삽입/삭제/탐색 등 필요한 작업은 어떠한 것이 있는지 정의만 한 것이 추상적 자료형입니다. 실제로 프로그래밍적으로 해당 자료가 어떤 형태를 갖고 각 작동은 어떻게 구현할지를 고민하는 것, 다시 말해 추상적 자료형을 구체적으로 어떻게 구현하는가에 대해 고민하고 정리하는 것은 자료구조 영역입니다. 예시로는 다음 시간에 배워 볼 연결 리스트 등이 있습니다.
흔히 자료구조를 '책장 속 책을 배열하는 방법'이라고 많이 묘사된다고 합니다. 데이터를 어떤 식으로 구조화할지 정하고 필연적으로 생성되는 규칙들을 이해해야 합니다. 프로그래밍 언어마다 어떻게 구현할 수 있을지, 관련 라이브러리는 있는지, 같은 자료구조라도 어떤 자료형을 썼을 때 더 효율적인지 등을 정리해보아야 합니다.
즉, 정리하자면 자료구조는 추상적 자료형을 구체화시킨 것이라고 생각하면 될 것 같습니다. 또한 어떠한 single data structure도 모든 목적을 잘 수행할 수는 없습니다. 그렇기 때문에 그것들의 몇가지 장점과 단점을 아는 것이 중요하고 이를 잘 조합하여 사용하는 것이 좋겠습니다.
3. Encapsulation(캡슐화)
어쩌면 Abstract data type에서 가장 많이 링크되는 개념인 Encapsulation, 캡슐화에 대해 알아보겠다.
캡슐화의 정의부터 읊고 지나가자면,
캡슐화(영어: encapsulation)는 객체 지향 프로그래밍에서 다음 2가지 측면이 있다:
객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고,
실제 구현 내용 일부를 외부에 감추어 은닉한다.
abstract data type과 마찬가지로 뭔소린지 하나도 모르겠었지만!
아래의 블로그를 읽고 이해가 되었다. (공중제비 3바퀴!!)
캡슐화란 무엇인가? 어떤 이점이 있는가?
객체지향을 공부하면 처음부터 귀에 못이 박히도록 듣는 단어가 있다. 바로 캡슐화다. 캡슐화가 도대체 뭐고, 이게 왜 중요한 요소일까? 일단 위키를 보도록 하자 캡슐화(영어: encapsulation)는 객
bperhaps.tistory.com
캡슐화는 클래스 안에다 데이터와 데이터를 처리하는 행위를 묶어놓는 것을 말하는데, 여기서 캡슐화는 클래스(Class)자체를 의미한다.
class Capsule {
int number;
public Capsule(int number) {
this.number = number;
}
public double getHalf() {
return number / 2;
}
}
------------------------------------------------------
class Main {
public static void main(String[] args) {
Capsule capsule = new Capsule(10);
System.out.println(capsule.getHalf());
}
}
캡슐화를 위와 다르게 정의하자면, 데이터와 데이터를 처리하는 행위를 묶고 외부에는 그 행위를 보여주지 않는 것이라고 할 수 있다.
그렇다면 도데체 외부에는 그 행위를 보여주지 않는 것이 무엇이냐고 하면,
클래스 내부에서 데이터와 데이터를 처리하는(연산, 저장, 이동 등등) 과정을 담고 밖에서는 그 과정을 보여주지 않는 것이다. 파이썬에서 내가 자주 사용하는 sort() 함수로 예를 들어보자. 정렬되는 과정 중간중간을 내가 알지 못하지만 sort()를 쓰면 내 입맛대로 오름차순으로 정렬되는 것을 볼 수 있다는 것이다.
이게 왜 효율적이고 중요한 포인트나면, 코드의 중복을 피할 수 있다는 점과 데이터를 처리하는 동작 방식을 외부에서 알 필요가 없기 때문이다.
Java code로 예시를 들자면
public void foo(Goods goods) {
double discountedPrice = goods.getPrice() * 0.9;
var(discountedPrice);
}
public void foo2(Goods goods) {
double discountedPrice = goods.getPrice() * 0.9;
var2(discountedPrice);
}
이렇게 10프로 할인 로직을 class에서 벗어나 외부에 행위(10프로 할인)를 보여주게 되면 10프로 할인을 할때마다
double discountedPrice = goods.getPrice() * 0.9;
를 복사해야하고 할인률이 바뀌었다면 모든 걸 다 수정해야 한다. 코드의 중복의 큰 단점인 셈이다.
그렇다면 이번에는 데이터를 객체로부터 받아오는 것이 아니라 객체에게 처리를 요청하는 코드를 작성하면 어떻게 될까?
class Goods {
int price = 10000;
...
public int getDiscountedPrice() {
return price * 0.9;
}
}
public void foo(Goods goods) {
double discountedPrice = goods.getDiscountedPrice();
var(discountedPrice);
}
이런식으로 앞으로 할인된 금액을 고칠때는 return price * 0.9; 에서 숫자만 바꾸면 된다!
데이터를 처리하는 방식이 외부에 드러나는 게 아닌, 객체 스스로 처리하도록 하니 애초에 외부에서 데이터를 처리하는 방식을 알 필요가 없었을뿐더러 코드의 중복성을 상쇄할 수 있었던 것이다!
오늘은 이렇게 개념마저 추상적인 추상적 자료형, Abstract Data Type(ADT)에 대해 자세히 알아보고 더 나아가 Encapsulation(캡슐화)에 대해 알아보았습니다.
앞으로는 Abstract Data Type이 더 이상 많이는 들어봤는데 뭔지는 잘 모르겠다라고 하지 않고 어떤 문제를 처리하기 위해 필요한 자료와 형태를 수학적으로 정의한 모델이며, 예시로는 스택, 큐, 집합, 리스트, 트리 등이 있다라고 말할 수 있어 뿌듯합니다.
Reference
https://cdragon.tistory.com/entry/Python-Abstract-Data-Types?category=1070664
[Python] Abstract Data Types
Abstract Data Types(ADT) 1) Encapsulation (캡슐화) 2) Inheritance (상속) 3) Polymorphism (다형성) Encapsulation 멤버 함수의 구현과 object의 data에 대한 구현이 class를 사용하는 programmer들에게 알려지지 않도록 혹은
cdragon.tistory.com
https://baileyworld.tistory.com/16
추상적 자료형, 자료구조, 알고리즘의 차이
한정된 자원을 최대한 효율적으로 사용하고 portability도 높이기 위해서 알고리즘에 대한 이해는 필수이다 입사 시 필수인 코딩 테스트는 알고리즘을 얼마나 잘 이해하고 코드로 풀어낼 수 있는
baileyworld.tistory.com
캡슐화란 무엇인가? 어떤 이점이 있는가?
객체지향을 공부하면 처음부터 귀에 못이 박히도록 듣는 단어가 있다. 바로 캡슐화다. 캡슐화가 도대체 뭐고, 이게 왜 중요한 요소일까? 일단 위키를 보도록 하자 캡슐화(영어: encapsulation)는 객
bperhaps.tistory.com