Abstract Data Types(ADT)
1) Encapsulation (캡슐화)
2) Inheritance (상속)
3) Polymorphism (다형성)
Encapsulation
멤버 함수의 구현과 object의 data에 대한 구현이 class를 사용하는 programmer들에게 알려지지 않도록 혹은 적어도 무관하게끔 class 정의하는 것은 여러 용어를 통해 알려져 있습니다.
사용되는 용어 중에 가장 흔한 것은 information hiding , data abstraction , and encapsulation 이고 이것들 모두는 어떠한 class의 구현 시 세부사항이 그 class를 사용하는 programmer로부터 숨겨져 있다는 것을 의미합니다.
이러한 원칙은 OOP(Ojbect Oriented-Programming) 즉, 객체지향프로그래밍의 주요한 기조(base) 중에 하나입니다.
다음과 같은 원칙을 통해 OOP를 통해 프로그래밍을 할 수 있다고 합니다.
우리는 적어도 class 바깥 의 code가 class 안 에서 선언된 변수의 값을 바꾸거나 접근하는 것을 어렵게 해야 한다.
구현의 구체적인 내용 과 class를 어떻게 사용하는지와 같은 설명 을 분리해야 한다.
구체적인 내용이라 함은 예컨데, class의 method가 어떻게 정의 되었는지와 같은 것들을 말한다.
If the abstraction(encapsulation) fails : 추상화에 실패한다면,
class Day:
def __init__(self):
self.month = 1
self.day = 1
def output(self):
print(f'Month: {self.month}, Day: {self.day}')
today = Day()
today.month, today.day = 12, 37
today.output()
# Month: 12, Day: 37
위 예시를 보면, information hiding이 되지 않아서 누구나 접근이 가능하기 때문에 문제가 발생한 것입니다.
우리는 Month와 Day가 모두 1이 나오기를 기대했으나 그러지 못했습니다.
그래서 information hiding원칙을 지켜 마음대로 access(접근)하지 못하게 하고 사용자에게는 해당 클래스의 사용법만을 알려주어야 하는 것입니다.
Objects interact only through the member functions.(객체는 멤버 함수를 통해서만 소통한다.)
object는 member 함수를 통해서만 접근이 가능합니다.
Object는 시스템의 나머지로부터 encapsulated 되어야 하고 그 object가 제공하는 서비스를 정의하는 구체적인 여러 함수들을 통해서만 프로그램의 다른 부분과 상호작용 해야 합니다.
이러한 과정을 통해 얻는 장점은?
시스템을 설계한 사람의 의도대로 동작을 하게 할 수 있다.
interface (함수)를 이용하여 거대한 규모의 응용 프로그램을 만들었는데 클래스가 개선되기를 원할 때 아무리 수정을 해도 client 입장에서는 코드 사용법이 바뀌지 않는 다는 것이다.
ADT(Abstract Data Type)
Data type(데이터 타입) 은 이러한 value들에 정의된 기본 동작(basic operation)의 집합 과 함께 value들의 집합 으로 구성됩니다.
또한 그 type을 사용하는 프로그래머가 value와 operation이 어떻게 구현되었는지의 세부사항 에 접근하지 않는다면 abstract data type이라고 불린다.
The predefined types(미리 정의된 타입 ex. int, float...)는 모두 ADT입니다. 우리는 operation(such as +, *)이 int type에서 어떻게 구현 되었는지 알지 못합니다.
그렇기 때문에 ADT를 만들기 위한 방법의 하나가 Class 인 것입니다. (class가 encapsulation을 제공하기 때문에)
즉, 프로그래머가 정의한 타입(programmer-defined types)인 Classe들은 ADT가될 수도 있습니다.
다시말해서, operation이 어떻게 구현 되는지의 세부사항을 이 class를 사용하는 어떠한 프로그래머로부터 숨겨야만 하고 그들과 최대한 관련없게 해야하는 것입니다.
정리하자면 어떤 class를 사용하는 프로그래머는 class의 data가 어떻게 구현되는지를 알 필요가 없어야 하며, data의 구현은 member functions의 구현처럼 숨겨져야 합니다.
model for an ADT
application program은 데이터의 지식(구조)을 갖지 않아야 합니다.
위 그림처럼 Application program은 interface를 통해 접근만 할 뿐 물리적으로 접근하는 경우은 없습니다.
ADT examples
지금까지 우리는 string, lists, sets, and dictionaries와 같은 built-in data type들을 봤었습니다. (추가적으로 decimal and fraction modules)
이들은 종종 ADT 관점에 의해 묘사됩니다. ADT들은 data에게 수행되어질 수 있는 operation(연산)들의 집합에 대한 수학적인 specifications(설계 명세서)으로 생각될 수 있습니다.
또한 그들의 implementation이라기 보다는 그들의 behavior에 의해 정의됩니다.
우리가 봤던 ADT에 덧붙여서, built-in data type들에대한 extension을 제공하는 몇가지 python library들이 존재합니다.
위 리스트는 다양한 application에서 유용하다고 인정된 몇 가지의 흔한 ADT 리스트입니다.
이러한 ADT 각각은 다양한 방식과, 다른 종류로 정의 될 수 있습니다. (다 똑같이 필수적인 건 아니지만)
Data structure and ADT(자료구조와 ADT)
Data structure(자료 구조)란 접근과 수정을 용이하게 하기 위해 data를 store and organize(저장 및 정렬) 하는 방법입니다.
어떠한 single data structure도 모든 목적을 잘 수행할 수는 없습니다. 그렇기 때문에 그것들의 몇가지 장점과 단점을 아는 것이 중요하고 이를 잘 조합하여 사용하는 것이 좋겠습니다..
Data Structure's example: stack, queue, linked list, tree, etc
Data structure를 만들 때 다음과 같은 두 가지 경우로 나뉩니다.
ADT로 만들 수 있다.
data type이 아닌 것으로 만들 수 있다.
또한 어떤 ADT는 수많은 data structure가 포함될 수 있습니다.