알버트의 개발하는 블로그

C 언어 / C++ 언어 제26강 다형성 본문

프로그래밍 언어/C & C++

C 언어 / C++ 언어 제26강 다형성

알버트 2021. 4. 30. 10:30

 

이번 시간에는 함수의 다형성에 대해서 배워보겠습니다. 이 개념은 자바에서도 많이 쓰이는 개념으로 꼭 알고 자바로 넘어가야 합니다.

 

 


다형성이란?

다형성이란 이름이 같은 함수가 서로 다른 여러 클래스에서 다양하게 실행되는 것을 말합니다. 이름이 같은 함수이지만 기능을 다르게 하고 싶을 때 많이 쓰입니다.

다형성을 구현할 함수가 포함된 모든 클래스는 같은 부모 클래스를 상속받아야 합니다. 그리고 부모와 자식이 같은 이름의 함수를 가지고 있어야 하는데요. 부모 클래스로부터 상속받은 함수(순수 가상 함수)를 반드시 자식 클래스에서는 재정의(오버라이딩)시켜 사용해야 합니다.

그리고 이렇게 순수가상함수를 포함한 부모 클래스를 추상 클래스라고 하며 이는 자바에서도 많이 쓰이는 개념입니다. 이제 간단한 예제를 통해서 다형성을 구현해보겠습니다.

 

 


코딩과 실행 결과

#include <stdio.h>
#include <iostream>
using namespace std;

class Shape {          //부모 클래스(추상 클래스)
private :
	int x, y;
public :
	Shape(int x = 0, int y = 0){     //생성자를 이용한 초기화
		this->x = x;
		this->y = y;
	}
//	순수 가상 함수 선언 (함수의 몸체가 없는 함수)
	void virtual draw() = 0;   //virtual을 붙여줘야 한다.
};

//	Shape 클래스를 상속받아 Point 클래스를 만든다.
class Point : public Shape {
	void draw() {      //함수 오버라이딩
		cout << "점을 찍는다." << endl;
	}
};

class Line : public Shape {
	void draw() {   //함수 오버라이딩
		cout << "선을 그린다." << endl;
	}
};

void main() {
	Shape *pShape[] = { new Point(), new Line() };    //2개짜리 포인터 배열을 만들어 저장 
	int menu;
	cout << "원하는 작업을 선택하세요 :";
	cin >> menu;       //1이나 2를 입력받음
	pShape[menu - 1]->draw();         //각기 다른 객체의 draw() 실행
}

 

 

이렇게 코딩해주었습니다. 부모 클래스(추상 클래스)는 순수 가상 함수를 갖고 있어야 하므로 virtual을 붙여주었습니다. 그리고 Point와 Line클래스에 부모클래스를 상속시켜주었고, 클래스 안에서 draw() 함수를 오버라이딩하였습니다.

그랬더니 메인 함수에서 같은 draw()함수를 실행시키게 하지만, Point()인지 Line()인지에 따라서 다른 결과가 나오는 것을 알 수 있다. 한번 실행해보겠습니다.

 

대표사진 삭제

사진 설명을 입력하세요.

콘솔창이 이와 같이 실행된 것을 볼 수 있습니다. 숫자 2를 입력시켰더니 포인터배열의 2번째 값인 line클래스의 draw()가 실행되었음을 알 수 있습니다.

이처럼 다형성은 객체 지향의 꽃이라고도 할 수 있습니다. 그래서 자바에서도 아주 유용하게 쓰이는 기능이기 때문에 프로그래밍을 잘하기 위해서는 반드시 잘알고있어야 하는 기능이겠습니다.

읽어주셔서 감사합니다.