본문 바로가기

대학생활

[C++] Static Polymorphism & Dynamic Polymorphism

정적 다형성과 동적 다형성

다형성이라.. 너무 생소한 단어다.

이런 기본적인 개념을 들어본 적조차 없다는 게, 베이스가 숭숭 뚫려있다는 약점을 방증하는 것 같다..

근데.. 다형성..? 다형성,, 뭔가 다양성(diversity)이랑 비슷한 느낌이다.

 

일단 구글링을 통해 찾은 다형성의 정의는 이렇다.

다른 타입이 같은 인터페이스를 지원하는 것
 

 ㄷ ㄷ ㄷ.. 아무리봐도 한눈에 안들어 온다..

 

그래서 스스로 결론 내린 다형성의 정의는

코딩의 편의를 위한 함수 정의의 다양성 존중
또는
코딩의 편의를 위한 함수의 유연성

으로 생각했다..

 

정적 다형성(Static Polymorphism)의 경우..

그럼 정적 다형성이란 뭘까..?

 

다른 블로그를 찾아보면

정적 다형성은 컴파일 단계에서 요소들이 바인딩(binding)되는 것이라네요~ + overloading, template~~

라고 나와 있다.. 근데 알짜배기로 잘 설명한 것 같은.. 느낌..

 

간단히 예제를 살펴보면

#include <iostream>
#include <string>

using namespace std;

void naming(string first_name, string last_name) {
	cout << "Im " << first_name << " " << last_name << "\n";
}

void naming(string first_name, string last_name, string middle_name) {
	cout << "Im " << first_name << " " <<  middle_name << " " << last_name << "\n";
}

int main() {

	string first_name = "Miji";
	string last_name = "Fernandes";
	string middle_name = "blank";

	naming(first_name, last_name);				// (1)
	naming(first_name, last_name, middle_name);		// (2)
    
	return 0;
}

 

위의 naming 함수는 이름이 중복되지만 파라미터의 개수가 달라 문제없이 컴파일되고 또 실행된다.

이는 정적 다형성의 기능 중 하나로, 미리 컴파일 단계에서 (1)에 해당하는 함수, (2)에 해당함수가 매핑되기 때문이다.

즉, 컴파일러가 (1), (2) 명령어를 실행할 때 쓰일 함수가 다르다는 것을 인지하고 있다. (template을 활용하는 경우도 동일)

 

#include <iostream>
#include <string>

using namespace std;

template <class T>
void naming(T first_name, T last_name) {
	cout << "Im " << first_name << " " << last_name << "\n";
}

template <class T>
void naming(T first_name, T last_name, T middle_name) {
	cout << "Im " << first_name << " " <<  middle_name << " " << last_name << "\n";
}

int main() {

	string first_name = "Miji";
	string last_name = "Fernandes";
	string middle_name = "blank";

	naming(first_name, last_name);
	naming(first_name, last_name, middle_name);

	return 0;
}

 

(그냥 넣어본 template  예제)

 

동적 다형성(Dynamic Polymorphism)의 경우..

동적 다형성은 런타임 단계에서 각 요소들의 매핑이 일어난다.

"동적 다형성 덕에 인터페이스와 클래스간의 위계가 분리될 수 있다고 함" <- "무슨 소린지 모르겠음"

일단 큰 어려움 없이 클래스 간의 관계에 쪼인할 수 있다는 것으로 이해했어요.. ㅠㅠ

 

예제를 보면,,

#include <iostream>

using namespace std;


struct Asian{
	virtual void introduce() {
		cout << "Im a Asian\n";
	};
};

struct Korean :Asian {
	void introduce() override {
		cout << "Im a korean\n";
	};
};

struct Japanese :Asian {
	void introduce() override {
		cout << "Im a Japanese\n";
	};
};


void whoAreU(Asian *asian) {
	asian->introduce();
}

int main() {

	Asian *a1 = new Korean;
	Asian *a2 = new Japanese;
	Asian *a3 = new Asian;

	whoAreU(a1);
	whoAreU(a2);
	whoAreU(a3);

	return 0;
}

 

위 코드는 쉽게 설명하자면 이렇게 볼 수 있다.

 

    Compile stage: 서양인(서양인의 시각으로 한중일 구분)

    Runtime stage: 동양인(동양인의 시각으로 한중일 구분)

 

Korea, Japanese가 Asian 구조체 대신 선언되더라도 컴파일러(서양인)는 그들을 "Asian"으로 인식한다.

하지만 런타임 단계에선 각 Asian 구조체에 그들의 특성들이 투영된다. (영어 문서에선 kicks in이란 표현을 쓰더라..)

런타임 단계에서 Asian이 Korean이 되도록 포인터가 우회돼서 들어온다.

 

즉,  a1이라는 변수에는 static type의 Asian과 dynamic type의 Korean이 공존하는 상태다.

 

 

※ 정리 및 빠른 요약

정적 다형성은 overloading이고,

동적 다형성은 overriding이다. (라고 이해하면 편할 거 같습니다..)

 

 

참고 자료

https://medium.com/@kateolenya/static-polymorphism-in-c-9e1ae27a945b

 

Static Polymorphism in C++

Static Polymorphism: Ws and How

medium.com

https://www.modernescpp.com/index.php/dynamic-and-static-polymorphism

 

Dynamic and Static Polymorphism - ModernesCpp.com

Polymorphism is the property that different types support the same interface. In C++, we distinguish between dynamic polymorphism and static polymorphism. Now, we are done with the basics, details, and techniques around templates, let me write about the de

www.modernescpp.com

 

'대학생활' 카테고리의 다른 글