Abstraction: Module, Module types, Class
Modules: 여러 개의 함수들을 공유하는 형태, 추상화된 타입을 export
Module Types: 모듈에서는 한 개의 인스턴스만 만들 수 있었는데, 타입을 제공함으로써 여러 개의 인스턴스를 제공한다.
Classes: 관련된 abstraction의 families를 정의해준다.
: 코드 재사용에 중점을 두고 있다.
Dynamic method binding : 다형성
Fundamental concepts:
: 가비지 콜렉션을 지원하지 않아서 아래와 같이 클래스(destructor)를 정의해줘야하는 언어가 존재한다.
//C++
~list() {
if (!header.singleton())
throw new list_err("attempt to delete nonempty list");
}
//생성자 호출
//C++
list_node elem1(0); //inline object (value 타입)
list_node* p = new list_node(13); //new 사용 (reference 타입) new 를 사용하면 delete로 지워줘야 함
: Public and Private Members
: C++를 포함한 많은 언어는 초기 declaration에 프로토타입 만을 제공하기도 한다.
: 클래스를 사용하는 사람들에게 보이지 않는 별도의 파일로 제공될 수 있다.
: OOP는 함수를 호출하거나 짧은 함수들이 많은 경향이 있다.
In C#
class list_node {
...
int val; // private
public int Val {
get { return val; }
set { val = value; }
}
...
}
list_node n:
...
int a = n.Val; // implicit call to get method
n.Val = 3; // implicit call to set method
: 상속받은 클래스
class queue : public list {
public:
void enqueue(int v) {
append(new list_node(v));
}
int dequeue() {
if (empty())
throw new list_err("attempt to dequeue from empty queue");
list_node* p = head();
p->remove();
int v = p->val;
delete p;
return v;
}
};
: 유효범위 (Scope rules)를 만드는게 중요한 포인트
: 상속을 제공한다.
additional issues가 존재한다.
-> C++에서는 해결하고 있다
객체 지향 언어에서는 다른 visible로 접근한다.
객체 지향 언어는 static 필드, 메소드를 허용한다.
만약 이너가 아우터의 멤버라면, 이너의 메소드는 아우터의 멤버를 볼 수 있는가?
: 다형성, C를 상속하는 D가 있을 때, base class를 기대하는 상황에서 derived class를 사용할 수 있다.
: 즉, 공통으로 갖는 형식 매개 변수의 기능만 사용 가능하다. (Parent)
함수 호출 시, 두 가지 방법이 존재한다.
1. 부모에 의거한다 -> static method binding
2. 실제 참조하고 있는 객체에 의거한다 -> dynamic method binding
class person {
public:
virtual void print_mailing_label(); // 함수 앞에 붙여줌
...
: 대부분 객체지향언어에서 virtual method의 바디를 생략할 수 있다.
abstract
virtual =0;
: static method binding - 컴파일러가 어떤 메소드를 호출할 것인지 타입으로 판단한다.
: dynamic method binding - 가리키는 object는 runtime 시점에 결정된다. -> 각각의 객체의 보이지 않는 필드에 virtual method table의 주소값을 가지고 있는다. 즉, concrete class는 같은 vtable을 공유한다.
backword
를 제공한다.foo F;
bar B;
foo* q;
bar* s;
q = &B; // ok
s = &F; // error
s = dynamic_cast<bar*>(q); // performs a run-time check
//q가 bar 이거나 자식이라면 pointer를 assign 해준다.
?=
타입 맞는지 확인해준다.as
instance of