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

[프로그래밍 언어론] OOP (객체지향 프로그래밍론) Part 2 - Design Issue

Cloud Travel 2011. 12. 5. 23:26
1. The Exclusivity of Object? (객체를 얼마나 배타적으로 취급할 것인가?)
 - Everything is an object : 모든 것을 객체로 만들어서 정의(모든 타입(primitive type 포함)의 객체화) 
  > 장점 : 순수하고 우화하다. 모든것이 객체이다.
  > 단점 : Message protocol을 이용하여 모든 것을 수행하여 느리다.
           Dynamic Binding과 Type check때문에 느리다.
  ex) small talk
 - Add objects to a complete typing system(명령형 언어에 객체 개념이 추가된 언어가 취하는 형식)
  > 명령형언어에서 가지고 있는 모든 것을 수용하였다. record, struct, primitive type, ... + OOP
  > 장점 : 간단한 타입이라면 효율성이 높다.
  > 단점 : 아래와 같이 하나의 변수에 대해서 혼란성이 일어난다.
    ex) temp t1; // temp is class, struct, record, enum, float, int,... What!?!
  ex) C++
 - Include an imperative-style typing system(primitive type만 정의해주고 그외는 모두 class) 
  > 장점 : Simple Object에서 매우빠르다. (명령형 모델과 거의 비슷한 수준의 빠르기가 나온다.)
  > 단점 : 여전히 class와 primitive type이 혼재하여 색갈릴 요소가 존재한다.
  ex) Java 

2. Are Subclasses Subtypes? (서브클래스를 서브타입처럼 취급할 것인가?)
 - 이 말은 Subclasses는 Subtypes처럼 부모의 모든 속성(Attribution)와 행동(Method)를 포함하는가?
   라고 바꾸어 말할 수 있다. 일전에 서브타입은 부모의 모든 속성을 가져온다고 보았던봐있다. 클래스 또한
   서브타입처럼 모든것을 전해줄 필요가 있는가?
 - 서브 클래스가 서브타입처럼 사용되면, 부모는 어떠한 정보도 숨길수 없으며, 자식은 부모의 어떠한 것도
   변경하지 못하는 상태가 된다. 

3. Implementation and Interface Inheritance
 - 상속에는 두 가지 종류의 부류가 존재한다. Implementation과 Interface가 그 종류이다.
  ⓐ Interface : 상속시 자식은 상속받은 것을 수정하지 못한다.
   > 비효율적으로 프로그램을 작성될 가능성이 크다.
   > 신뢰성이 높다. 다른사람도 이것을 수정하지 못하기 때문에 다른사람의 영향을 받지 않는다.
  ⓑ Implementation : 자식에서 필요한 것을 수정이 가능하다.
   > 누군가 코드(부모의)를 고친다면, 자신도 코드를 고쳐야한다.
   > 변화되는 요구사항에 대응하여 코드를 수정하기에 용의하다.

4. Type Checking and Polymorphism
 - Polymorphism => Dynamic Binding => Dynamic Type Check => Cost,시간 비용이 커진다.
 - 얼마만큼 Dynamic을 지원해줄 것인가가 이번 이슈의 중점이다.
  ⓐ 객체선언시 Default를 Dynamic하게하고 사용자가 static을 임의로 주는 법을 제시한 것
  ⓑ 객체선언시 Default를 Static하게하고 사용자가 Dynamic을 임의로 주는 법을 제사한 것
   ex) C++의 경우 default를 static으로 잡고 virtual 키워드를 사용하여 dynamic 구현을 하게한다.

5. Single and Multiple inheritance
 - 장점 : 편리하고 가치가 있다.
 - 단점 : 다중상속을 받을때, 여러 클래스에서 같은이름의 변수나 메소드가 있을때 상속받은 곳에서 어떻게
            사용할 것인가?에 대한 문제를 해결해야 한다.

6. Allocation and De-allocation of Objects 
 - 어느 지점에서 객체를 생성하고 해제할 것인가?
  > All heap  vs  User select(static, stack dynamic, heap dynamic)
 
7. Dynamic and static Binding
 - Dynamic한 부분을 얼마만큼 줄일 수 있는가? Dynamic한 부분이 적어지면 비용또한 적어진다.


* Design Issue에 대한 각 언어별 선택
 ⓐ C++
  - C++의 특성 : typing system is mixed(타입 시스탬이 여러개가 혼재되있다).
                       Because Backward Compatibility to C (C에서 제공하는 모든것을 사용가능하게 하기 위해서)
  - 생성자와 소멸자가 존재한다.
  - public,private,protected등 access control이 존재한다.
  - 상속 : small talk와 같이 부모 클래스인 기존 클래스로 유도 하는 방법 이외에
             독립적으로 클래스 정의를 할 수 있다.
           : 다중 상속을 지원해준다. 다중 상속시 겹치는 변수나 메소드를 위해 resolution operator를 제공해준다.
             ex) class c: public a, public b{  a::x; // a class의 x변수  b::x; // b class의 x변수 ... }
   - objects의 정의는 static, stack dynamic, heap dynamic방법으로 모두 생성이 가능하다.
   - Dynamic Binding
   > 위에서 보았듯이 default를 static으로 잡고 virtual 키워드를 이용해서 dynamic한 클래스를 정의 해준다. 
    ex) shape *ptr_shape;                   // shape is virtual class
          rectangle rect;  rect.draw();      // rect is subclass of shape. default is static. 컴파일시 알 수 있음
          ptr_shape = ▭                   // Dynamic binding! 실행시 알 수 있음
          prt_shape -> draw(); 
  - 평가
   > small talk에 비해서 풍부한 access control을 제공해준다. 
   > 객체 생성에 있어서 어떠한 방법을 취할지 programmer가 정할수 있게 해주었다.

 ⓑ Java
  - C++과 유사하나 차이점은 존재한다.
  - primitive를 제외한 모든 Type을 객체로 두었다.
  - 모든 객체는 heap-dynamic으로 정의된다. ( stack stk = new stack(); // 포인터의 사라짐 )
  - 단일 상속만을 제공한다.
   > 그러나 interface class라는 특수한 class를 이용하여 다중상속이 가능하게 해준다.
   > Interface는 명세만 나타난 클래스로 상속받은 클래스는 Interface에 있는 모든 것을 재정의(구현) 해줘야한다. 
   > C++의 추상클래스와 동일한 역할을 하지만, C++의 추상클래스는 그것 자체로 하나의 객체를 갖을수 있지만,
      Java의 Interface는 그것이 불가능하다.
  - Dynamic Binding
   > C++과 반대로 default를 dynamic으로 잡고 있으며, final 키워드를 이용하여 static한 것을 지정할 수 있다.
  - Encapsulation
   > C++의 access control을 이어 받았고, 이에 더 나아가서 package라는 제 2의 스코프를 갖는다.
     (전에도 나왔듯이 C++에서의 friend를 확장한 개념)

 ※ C++과 Java
  - Java가 C+보다 더 OOP에 가까운 구현을 해주었다.
  - C++에서는 독립적 함수가 존재하여, 모든 것의 클래스(객체)화가 이뤄지지 않았다.