프로그래밍[Univ]/프로그래밍 언어론

[프로그래밍 언어론] Abstract Data Types(추상화 타입)

Cloud Travel 2011. 12. 4. 22:49
* Abstract  Data Type의 시작
 - 복잡한 부분을 가리는 역할을 한다.
 - 1980년대 이전 : Process Abstraction은 이미 존재하였다.(서브프로그램)
 - 1980년대 이후 : 언어개발의 관심사가 Process에서 Data로 이동되었다.
  > module, package, class라는 것을 이용하여 각각의 언어에서 ADT(Abstract Data Types)을 정의하기 시작 
 - Built - in Type이 아니다.
  > Built - in Type 또한 이미 누군가 정의해 놓은 ADT중 하나이다. 하지만 ADT란 Built-in Type이 아닌 사용자가
    정의한 User-Defined Type이다.

* Abstract Data Type를 만족하기 위해서는...
 - Data representation + Operation  
  ex) Stack을 구현할때 Array로 구현할 것인가, Linked List로 구현할 것인가(Data representation)
        Stack은 push, pop, top, Empty라는 Operation인 필요하다. 
 - 위 두개가 하나의 구문으로 정의 되있으며, 객체로 사례화가 가능해야 한다.(Encapsulation)
    > 조직화가 되어 수정에 용의하다.(Modifiability) / C에서 구조체로는 이러한 것이 불가능하다.
 - 사용되는 객체의 representation 부분은 가려져있고 단지 Operation만 사용자가 사용이 가능해야 한다.
    (Information Hiding) > Reliability(신뢰성)이 높아진다.

* ADT의 설계 이슈
 - ADT에서 1개의 구조가 나오는가 여러개의 구조가 나오는가?
 - 추상화할때 가질 수 있는 타입 제한이 있는가?
 - 파라미터가 있는 것을 허용할 것인가?
 - Access controls을 제공하는가?

* 각 언어별 예시
 ⓐ Ada
  - Encapsulation : package
  - 각각의 ADT는 Specification package(선언부)와 Body package(구현부)로 나뉘어 작성되며,
    사용자가 사용하는 use package도 존재한다. 
  - 어떠한 타입도 사용이 가능하다.
  - Information Hiding : private

  ※ 필자는 이부분이 잘 이해가안간다...
  - Ada에서는 ADT에 주어지는 기본적인 연산자가 존재한다. =, ==, !=, >, < 같은것이 연산자의 예이다.
  - ADT를 정의할때 기본적인 연산자가 필요없는 데이터 타입이 존재할 수 있다(ex: Stack)
    이러할 때 기본 연산자가 포함되지 않게 정의하는 방법이있는데 그것은 Type을 정의할때 limited private를
    부여하는 것이다.

 ⓑ C++
  - C에 기초를 두었고 Simula 67의 class 개념을 가져온다.
   > C에 기초를 둔것은 struct 개념으로 representation이 가능한 추상데이터 타입을 이미 제공하고 있었다는 것을
      가져온 것이고 Simula의 class를 이용해 representation + operation을 구현시킨 것이다.
  - Encapsulation
   > class라는 키워드를 사용하여 캡슐화를 한다.
   > 모든 클래스의 객체들은 하나의 함수를 공유하여 사용을 한다.
   > 각각의 사례(객체)는 static, static dynamic, heap dynamic으로 정의가 가능하다. 
  - Information Hiding
   > 뒤에서 자바와 비교를 하겠지만 절 단위로 I.H를 정한다.
   > private(All Hide), public(All Open), protected(inheritance)의 키워드를 이용하여 실현한다. 
  - 생성자, 소멸자를 제공해준다.
   ※ 생성자란?
    > 사례(객체)를 만들때 data member를 초기화 하는 역할을 한다.
    > 파라미터를 가질 수 있다.
    > 묵시적으로 call되기도 하고, 사용자에 의해 call되는 경우도 있다.
    > 생성자의 이름은 class의 이름과 같아야 한다. 
   ※ 소멸자란? 
    > 소멸자의 이름은 class이름 앞에 tilda(~)를 붙여줘서 표현해준다.
    > lifetime끝났을때 묵시적으로 실행되기도 하고, 사용자에 의해 의도적으로 실행되기도한다.
    > 객체가 사라질때 메모리를 반납하는 역할을 한다.
  - Ada와의 차이 : Ada의 packages는 캡슐화에 중점을 두었지만 C++의 class는 타입생성에 중점을 두고 개발됨 
 
 ⓒ Java
  - C++과 비슷한 형식을 따른다.
  - C++과의 차이점
   > 모든 ADT는 class로만 정의 가능하다.(구조체로 선언하는 것이 사라짐)
   > 모든 객체는 힙영역에 할당이 된다.
   > 하나에 하나씩 I.H를 표시한다.

    

 
   > 제 2 의 Scoping mechanism을 제공해준다. : package(C++의 friend 기능을 확장)
    ※ friend란? 상속관계가 없어도 특정 클래스에만 자신을 알려 줄 수 있다.

* Generic Abstract Data Types
 우리는 일전에 Generic Sub-Program을 공부한봐 있다. 이를 응용하여 Generic ADT를 구현할 수 있다.
 - Ada와 C++이 Generic 기능을 제공해주었었다. 일전에 했던것과 비슷하게 하면된다.
   위에서 나왔던 Linked_List를 Generic type으로 재정의하면 다음과 같다.

 
 - 생성자가 존재하는 C++에서는 더욱 유연하게 Generic한 프로그램을 작성할 수 있다.
   이 글을 읽고 있는 사람도 한번쯤 해봤을 것이다. size값을 생성자로 넘겨서 그 size만큼 할당하는 것을...
   타입에서는 이런게 불가능하겠지만 size만큼은 가능할 것이다.
  ※ Generic Parameter Passing : Type이나 size를 Parameter로서 passing할때 어떤 형식을 취할까?
   > 정답은 : Pass by name 이다.
 - 자바에서도 5.0 이후로 generic class를 제공해주었지만, 사용자가 정의하는 것은 아니고 이미 정의 되있는          것을 사용하는 것이다.