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++에서는 독립적 함수가 존재하여, 모든 것의 클래스(객체)화가 이뤄지지 않았다.
- 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++에서는 독립적 함수가 존재하여, 모든 것의 클래스(객체)화가 이뤄지지 않았다.