fullstack

'전체 글'에 해당되는 글 76건

  1. [C++] 순수 가상 함수와 추상 클래스
  2. [C++] static binding & dynamic binding
  3. [C++] virtual 키워드

[C++] 순수 가상 함수와 추상 클래스

Language/C++

이전 글인 [C++] virtual 키워드 를 보면 virtual 키워드를 통해서 가상 함수를 정의하였다.

보통 가상 함수를 쓸 때, Base 클래스에서는 함수를 정의만 하고 실제 구현은 오버라이딩 하고 있는 Derived 클래스에서 하게된다.

이러한 경우 다음과 같이 함수를 선언만 하고 정의를 하지 않아도 된다.


1
virtual void func() = 0;



이처럼 선언한 함수를 순수 가상 함수라 부른다.

이처럼 Base 클래스에서 순수 가상 함수를 정의하면 Derived 클래스에서는 반드시 오버라이딩 하여 함수를 정의 해야 한다.

순수 가상 함수는 진짜로는 존재하지 않는 가상의 함수를 말하며, 하나 이상의 순수 가상 함수를 가지고 있는 클래스를 추상(abstract) 클래스라 부른다.

추상 클래스는 함수 정의가 생략된 순수 가상 함수를 가지고 있기 때문에 완전한 클래스가 아니다. 

따라서 추상 클래스는 객체화 할 수 없다. (객체 지향적 설계에 따른다면 객체화 할 필요도 없다)


순수 가상함수와 추상 클래스가 필요한 이유는 다음 예제를 보면 이해할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Object
{
public:
    virtual void draw() = 0;
};
 
class Circle : public Object
{
public:
    void draw() { cout << "draw circle" << endl; }
};
 
class Rect : public Object
{
public:
    void draw() { cout << "draw rect" << endl; }
};



Object 클래스는 draw라는 순수 가상 함수를 가진 추상 클래스로, 이를 상속하는 클래스는 모두 draw라는 함수를 오버라이딩하여 정의 해야 한다.

이처럼 순수 가상 함수를 이용해 모든 Derived 클래스에서 구현해야될 함수를 정의할 수 있다.


'Language > C++' 카테고리의 다른 글

[C++] 다중 상속  (1) 2015.12.28
[C++] virtual 소멸자  (0) 2015.12.26
[C++] static binding & dynamic binding  (0) 2015.12.26
[C++] virtual 키워드  (0) 2015.12.24
[C++] 오버라이딩 (Overriding)  (0) 2015.12.24

[C++] static binding & dynamic binding

Language/C++

binding이란 프로그램 소스에 쓰인 내부 요소, 이름, 식별자들에 대해 값이나 속성을 확정하는 과정을 일컫는 말이다.

이 과정이 컴파일 타임에 이루어지면 static binding이라 하고, 런 타임에 이루어지면 dynamic binding이라 한다.




1
int static_binding = 1;



static binding은 위와 같이 일반적으로 이루어진다.

데이터 타입이 int로 정해지는 것과 그 타입의 변수명이 static_binding으로 정해지는 것이 바로 static binding이다.




1
2
AAA* a = new /* ??? */ ;
a->func();



dynamic binding은 이전 글인 [C++] virtual 키워드 에서 이미 사용하였다.

Base 클래스의 멤버 함수를 가상함수로 선언하여 여러 Derived 클래스에서 오버라이딩 한다면 위의 ??? 부분에 어떤 Derived 클래스를 넣는 가에 따라서 다른 함수가 호출된다.

이처럼 dynamic binding은 포인터가 가리키는 객체가 무엇인가에 따라서 호출되는 함수가 유동적으로 변하게 된다.




dynamic binding은 다형성의 한 예이며, 이처럼 모습은 같은데 형태는 다른것을 다형성(polymorphism)이라 한다.


'Language > C++' 카테고리의 다른 글

[C++] virtual 소멸자  (0) 2015.12.26
[C++] 순수 가상 함수와 추상 클래스  (0) 2015.12.26
[C++] virtual 키워드  (0) 2015.12.24
[C++] 오버라이딩 (Overriding)  (0) 2015.12.24
[C++] 객체 포인터  (0) 2015.12.22

[C++] virtual 키워드

Language/C++

virtual 키워드를 사용하면 오버라이딩 되는 함수를 가상으로 선언할 수 있다.

함수의 앞에 virtual 키워드를 붙여주면 되고, 이를 가상 함수(virtual function)라 부른다.


이전 글인 [C++] 오버라이딩 (Overriding) 의 예제에서 AAA 클래스의 함수만 가상함수로 바꾸어 보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
 
class AAA
{
public:
    virtual void func() { cout << "AAA" << endl; }
};
 
class BBB : public AAA
{
public:
    void func() { cout << "BBB" << endl; }
};
 
int main()
{
    BBB b;
    b.func();
 
    AAA* a = new BBB;
    a->func();
 
    return 0;
}




AAA 클래스의 func 함수는 가상함수로 선언하였기 때문에 존재하지만 존재하지 않는 함수로 선언되어 있는 것이다. 따라서, AAA 타입의 포인터로 접근하더라도 호출되지 않고 오버라이딩된 BBB 클래스의 func 함수가 호출되는 것이다.


가상 함수의 특성은 상속된다. 따라서, Base 클래스에서 선언한 가상 함수를 Derived 클래스에서 오버라이딩 한다면 이 오버라이딩한 함수 또한 가상 함수의 특성을 가지게 된다.

'Language > C++' 카테고리의 다른 글

[C++] 순수 가상 함수와 추상 클래스  (0) 2015.12.26
[C++] static binding & dynamic binding  (0) 2015.12.26
[C++] 오버라이딩 (Overriding)  (0) 2015.12.24
[C++] 객체 포인터  (0) 2015.12.22
[C++] 상속의 조건. is-a 와 has-a  (0) 2015.12.19