본문 바로가기

게임개발 수업

가상함수

c++ 은 기본적으로 정적 바인딩을 한다.

 

바인딩이란?

프로그램 소스에 쓰인 각종 내부 요소, 이름 식별자들에 대해 값 또는 속성을 확정한 과정을 바인딩이라고 한다.

 

정적 바인딩이란?

컴파일 시점에 바인딩 하는 것을 정적 바인딩이라 하며, 컴파일 후 변경이 불가능하다.

 

정적 바인딩으로는 oop의 다형성을 구현하기 어렵다.

 

다형성이란?

한 클래스로부터 파생된 클래스가 다양한 형태를 가질 수 있다는 의미이다.

 

고양이와 강아지가 있다고 가정해보자.

이들은 동물이라는 클래스로 묶을 수 있다. cat is a animal, dog is a animal

 

같은 동물이지만 울음소리가 다르다.

class animal{
	virtural void cry() = 0;
}

class cat : public animal{
    void cry(){
    	cout << "냥냥";
    }
}

class dog : public animal{
    void cry(){
    	cout << "멍멍";
    }
}

 

예를 들어 동물들이 입장할 때 소리를 내는 프로그램을 만든다고 가정해보자.

dog1 = new dog;
dog2 = new dog;

cat1 = new cat;
cat2 = new cat;

dog1.cry();
dog2.cry();

cat1.cry();
cat2.cry();

동물들이 얼마나 있을지도 모르는데 이렇게 일일이 써줘야 할까?

우리가 하고 싶은 것은 동물들 리스트를 가지고 동물.cry()를 해주는 것이다.

vector<animal> animalList;

for(auto animal : animalList){
	animal.cry();
}

이렇게 for문으로 구현하고 싶을 것이다.

하지만 c++은 정적바인딩이다. animal 타입으로 선언했으면 animal의 cry()를 호출한다.

우리가 원하는 것은 강아지라면 dog.cry() , 고양이라면 cat.cry()다.

 

즉 객체의 타입을 보고 dog이면 dog의 cry()를, cat이면 cat의 cry()를 호출하게 만들고 싶은 것이다.

이렇게 런타임 순간에 바인딩하는 것을 동적 바인딩이라 한다.

 

이를 구현하려면 부모 클래스의 함수에 virtural 키워드를 넣어주면 된다.

즉 virtural(가상)함수란 이 함수를 동적 바인딩 하겠다는 의미이다.

동적 바인딩을 하겠다고 했으니, 자식 클래스는 가상함수를 구현해야 한다. 부모 클래스의 함수를 다시 정의 해주면 된다.

이를 오버라이딩이라 한다.

 

부모클래스의 가상함수는 구현을 포함해도 된다. 

class bicycle{
    vitural void run(){
    	cout << "자전거 달린다.";
    }
}

class Tricycle : bicycle{
    vitural void run(){
    	cout << "세발 자전거 달린다.";
    }
}

자전거도 달릴 수 있고, 세발 자전거도 달릴 수 있다.

 

하지만 때로는 부모클래스를 구현하는 것이 개념적으로 불편할 때가 있다.

위의 animal과 cat dog과 같은 경우이다.

 

cat 과 dog은 실체가 있는 것이지만, animal은 실체가 없는 개념적인 단어이다. 동물 자체가 실체를 갖는 것은 이상하다.

 

이럴 때는 구현을 하지 못하게 virtural void cry() = 0; 함수에 null값을 준다. 이를 순수 가상함수라 한다.

 

1개 이상의 순수 가상함수를 가지면 추상 클래스라 한다.

 

추상 클래스에서 아래와 같은 특성을 가지면 인터페이스라 한다.

 

-0개 이상의 기본 인터페이스에서 상속할 수 있습니다.

-기본 클래스에서 상속할 수 없습니다.

-공용 순수 가상 메서드만 포함할 수 있습니다.

-생성자, 소멸자 또는 연산자를 포함할 수 없습니다.

-정적 메서드를 포함할 수 없습니다.

-데이터 멤버를 포함할 수 없습니다. 속성은 허용됩니다.

 

 

 

'게임개발 수업' 카테고리의 다른 글

팩토리 패턴  (0) 2022.11.29
객체 복사  (0) 2022.11.29
클래스 생성자와 소멸자  (0) 2022.11.24
static 키워드  (0) 2022.11.23
OOP의 특징  (0) 2022.11.16