일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
26 | 27 | 28 | 29 | 30 | 31 |
- 강의
- 원격 제어 프로그램
- 프로젝트
- 졸업 작품 소재
- 소스 코드
- 독립기념관
- 산책하기 좋은 곳
- Windows Forms
- 추천
- 동영상
- 실습으로 다지는 c#
- 캡슐화
- c#
- 언제나 휴일
- 실습
- 클래스 다이어그램
- 알고리즘
- c언어
- 네트워크 프로그래밍
- 소켓 통신
- 충남 천안
- 언제나휴일
- 유튜브 동영상 강의
- 무료 동영상 강의
- 안드로이드 앱 개발
- 표준 라이브러리 함수
- 파이썬
- 표준 입출력
- C++
- 동영상 강의
- Today
- Total
프로그래밍 언어 및 기술 [언제나휴일]
[C++] 32. 형식의 다형성 본문
이번에는 형식의 다형성을 살펴볼게요. 형식의 다형성은 기반 형식 포인터 변수로 파생 형식 개체를 설정하거나 기반 형식 참조 변수로 파생 형식 개체를 설정할 수 있는 특징입니다.
예를 들어 음악가 형식을 기반으로 파생한 형식으로 피아니스트와 드러머가 있다고 가정할게요. “피아니스트는 음악가이다.”, “드러머는 음악가이다.” 처럼 일반화관계로 정의하기 적합한 관계죠.
만약 음악가 형식 포인터 변수가 있다면 음악가 개체를 설정할 수 있겠죠. 그런데 피아니스트와 드러머는 음악가가 아닌가요? 네. 피아니스트나 드러머도 음악가입니다. 이러한 일반화관계의 특징을 OOP언어에서 활용할 수 있게 만든 문법이 다형성입니다.
void StartConcert(Musician *musician);
int main()
{
Pianist *pianist1 = new Pianist("피아노맨1");
Drummer *drummer1 = new Drummer("두둥맨1");
StartConcert(pianist1);
StartConcert(drummer1);
delete pianist1;
delete drummer1;
return 0;
}
void StartConcert(Musician *musician)
{
musician->Play();
}
위의 예처럼 음악가 형식 포인터 변수에 파생 형식의 개체를 전달받아 사용할 수 있습니다. 마찬가지로 음악가 형식 참조 변수로 파생 형식인 피아니스트와 드러머 개체를 전달받아 사용할 수 있어요.
void StartConcert(Musician &musician);
int main()
{
Pianist pianist2("피아노맨2");
Drummer drummer2("두둥맨2");
StartConcert(pianist2);
StartConcert(drummer2);
return 0;
}
void StartConcert(Musician &musician)
{
musician.Play();
}
void StartConcert(Musician &musician)
{
musician.Play();
}
다음은 앞에서 예로 보여준 형식의 다형성을 확인하는 예제 코드입니다.
//형식의 다형성
//Program.cpp
#include <iostream>
#include <string>
using namespace std;
class Musician
{
string name;
public:
Musician(string name)
{
this->name = name;
}
void Play()
{
cout<<name<<" 연주하다."<<endl;
}
};
class Pianist:public Musician
{
public:
Pianist(string name):Musician(name)
{
}
};
class Drummer:public Musician
{
public:
Drummer(string name):Musician(name)
{
}
};
void StartConcert(Musician *musician);
void StartConcert(Musician &musician);
int main()
{
Pianist *pianist1 = new Pianist("피아노맨1");
Drummer *drummer1 = new Drummer("두둥맨1");
StartConcert(pianist1);
StartConcert(drummer1);
delete pianist1;
delete drummer1;
Pianist pianist2("피아노맨2");
Drummer drummer2("두둥맨2");
StartConcert(pianist2);
StartConcert(drummer2);
return 0;
}
void StartConcert(Musician *musician)
{
musician->Play();
}
void StartConcert(Musician &musician)
{
musician.Play();
}
▷ 실행 결과
피아노맨1 연주하다.
두둥맨1 연주하다.
피아노맨2 연주하다.
두둥맨2 연주하다.
이와 같은 다형성 특징을 이용하면 하나의 기반 형식에서 파생한 다양한 형식의 개체를 기반 형식 포인터 변수나 기반 형식 참조 변수를 사용할 수 있어 집합체를 다룰 때 효과적으로 프로그래밍 할 수 있습니다. 그런데 파생 형식의 종류에 관계없이 다 똑같이 동작하는 것은 개발자가 원하는 형태가 아닐 수 있습니다. 이러한 문제를 해결하기 위해 OOP 언어에서는 형식의 다형성과 함께 메서드의 다형성을 제공하고 있습니다.
형식의 다형성에 이어 다음 주제는 메서드의 다형성입니다.
'C & C++ > 디딤돌 C++' 카테고리의 다른 글
[C++] 36. 다중 상속 (0) | 2024.04.08 |
---|---|
[C++] 35. 인터페이스 (INTERFACE) (0) | 2024.04.08 |
[C++] 34. 추상 클래스(ABSTRACT CLASS) (0) | 2024.04.08 |
[C++] 33. 메서드의 다형성 (0) | 2024.04.07 |
[C++] 31. 다형성 개요 (0) | 2024.04.07 |
[C++] 30. 무효화 (0) | 2024.04.07 |
[C++] 29. 접근 지정자 protected (0) | 2024.04.07 |
[C++] 28. 파생 개체의 생성과 소멸 과정 (0) | 2024.04.07 |