다형성; Polymorphism in C++

sunghoon·2025년 3월 18일
0

2.0 Glove Project

목록 보기
22/35
post-thumbnail

가상함수의 개요

부모 객체를 통해 자식 객체의 멤버를 호출하고 싶다면..

Employee* emp = (Employee*)&rgl;
cout << emp->PayCehck() << endl;

가상함수란 자식 클래스에서 오버라이딩 될 것으로 예상되는 멤버함수를 의미한다. 상수 관계에서 부모 클래스와 자식 클래스 모두 같은 이름의 멤버 함수가 존재하되, 자식 클래스의 멤버함수를 재정의 할 수 있었다.

상속성의 문제점은 부모 클래스의 객체를 통해 자식 클래스에서 오버라이딩

해답은 virtual

class Parent {
	virtual double PayCheck() {return 0.0;}
}

class descendant {
	double PayCheck() {}
}
  • 정보처리기사, 실무에서 수도 없이 많이 나오는 개념이지만, JAVA에서는 기본적으로 오버라이딩이 적용되다 보니 표면에서 볼 수 없지만 동일한 개념이 적용됩니다.
  • 왜 부모 객체가 자식 멤버 함수를 받는 형태로 만들까? (알고 보면 굉장히 중요한 기능이다)
    • emp -> PayCheck() ⇒ 결과 값은 객체마다 달라진다. 여러 객체가 있을 때 오버라이딩된 함수를 통해 결과값을 출력하도록 작성할 수 있다. 즉 객체값만으로 결과를 출력할 수 있다.

부서 만들기

1 step

class Department {
private:
	Employee* emp[10];
};

2 step

class Department {
private:
	Employee* employee[10];
	int count;

public:
	Department() { count = 0; }
	
	void AddEmployee(Employee& emp) {
	  this->employee[count] = &&emp;
	  count++;
	}
	
	void Display() const {
	  for (int i = 0; i < count; i++) {
	    cout << "급여" << employee[i]->PayCehck() << endl;
	  }
	}
};
// main 
Department dept;
dept.AddEmployee(rgl);
dept.AddEmployee(tmp);
dept.AddEmployee(slm);
Employee* emp = (Employee*)&rgl;
cout << emp->PayCehck() << endl;

정적/동적 바인딩

처음부터 객체가 정해진 형태 ⇒ 정적바인딩

들어오는 객체에 따라 달라지는 형태 ⇒ 동적 바인딩

다형성의 의미

  • 다형성이란
    • 다형성 polymorphism의 사전적 의미로 poly(많은)와 morphism(형태)의 합성어로 여러 형태라는 뜻이 된다.
    • 오버로딩과 오버라이딩이 다형성을 보여주는 대표적인 예이다.
  • 동적 결합과 정적 결합
    • 동적결합
      • ptrEmp -> PayCheck() 호출 시 Regular, Temporary, SalesMan 클래스 객체에 따라 다른 급여액을 보여줄 것이다.
      • 컴파일 시에는 ptrEmp 포인터 변수에 저장된 객체를 알 수 없다. 프로그램 실행 시 평가할 수 있는데, 이것을 동적 결합이라고 한다.
    • 정적결합
      • 컴파일 시에 어떤 함수가 호출되는지 알 수 있다.
      • 우리가 작성하는 일반적인 형태이다.
  • virtual 가상 함수 존재해야하지만 기능으로써는 필요가 없을 때는 0을 대입하면 된다.
virtual double PayCheck() = 0; 
  • 위와 같이 정의부가 없는 가상함수를 순수가상함수라고 부른다.
  • 주로 언제 사용할까?
    • 구상 후 설계(문서화) 진행되는데 설계에서
    • c#, Java에서는 interface가 대체된다.
      상속과 interface를 혼용하여 사용될 때가 있지만 엄현히 용도가 다르기 때문에 구분할 필요가 있습니다.

순수 가상함수와 추상 클래스

  • 추상 클래스
    • 순수 가상함수가 선언되어 있는 클래스는 객체를 선언할 수 없다.
    • Employee클래스에 PayCheck()라는 순수 가상함수를 선언하였기 때문에 Employee클래스의 객체를 선언할 수 없다.
    • 왜냐하면 객체를 통해 순수가상함수를 참조한다는 것은 의미가 없기 때문이다.
    • 순수 가상함수를 포함하고 있는클래스를 추상클래스라고 한다.

📚 reference

profile
프라다 신은 빈지노와 쿠페를 타는 꿈을 꿨다.

0개의 댓글