다형성( polymorphism )

다형성 : 객체의 타입이 다르면 같은 이름의 함수가 호출되더라도 서로 다른 동작을 하는 것

하나의 코드로 다양한 타입의 객체를 처리하는 기술.

형변환

  • upcasting : 상향 형변환
    implicit하게 일어남. 서브클래스를 수퍼클래스 타입으로 변환
  • downcasting : 하향 형변환
    implicit하게 일어나지 않음 수퍼클래스를 서브클래스 타입으로 변환

Shape *ps = new Rectangle(); 자동적 upcasting

왜 그럴까?

자동적으로 upcasting 이 일어나는 이유?
서브 클래스 객체는 수퍼 클래스 객체를 포함하기 때문.

상향 형변환

Shape *ps = new Rectangle(); 하면 객체 포인터가 Rectangle > Shape로 상향 형 변환이 일어남.

하향 형변환

  1. Rectangle *pr = (Rectangle *)ps;
    pr -> setWidth(100);
  2. ((Rectangle *)ps) -> setWidth(100)
    화살표 연산자 이용

매개변수

함수 호출에서 인자를 전달할 때에도 implicit upcasting 이 일어난다.
따라서 함수의 매개 변수는 서브클래스보다는 수퍼클래스 타입으로 선언하는 것이 좋다.

가상 함수

  • 만약 Shape 포인터를 통하여 멤버 함수를 호출하더라도 도형의 종류
    에 따라서 서로 다른 draw()가 호출된다면 상당히 유용할 것이다.
  • 즉 사각형인 경우에는 사각형을 그리는 draw()가 호출되고 원의 경우
    에는 원을 그리는 draw()가 호출된다면 좋을 것이다.

-> draw()를 가상 함수로 작성하면 가능
virtual 이란 키워드를 사용하면 가상함수가 된다 라는 것.

정적, 동적 바인딩

  • 컴파일 단계에서 모든 바인딩이 완료되는 것을 정적 바인딩(static
    binding)이라고 한다.
  • 반대로 바인딩이 실행 시까지 연기되고 실행 시간에 실제 호출되는
    함수를 결정하는 것을 동적 바인딩(dynamic binding), 또는 지연 바인
    딩(late binding)이라고 한다
  • 특징
    • 정적바인딩
      대상: 일반함수
      속도: 빠르다
      특징: 컴파일 시간에 호출 함수가 결정된다.
    • 동적바인딩
      대상: 가상함수
      속도: 느리다
      특징 : 실행시간에 호출함수가 결정된다.
Shape shapeArray[2];

shapeArray[0] = r;
shapeArray[1] = c;
Shape *shapePtrs[2];

shapePtrs[0] = &r;
shapePtrs[1] = &c;

다형성의 장점

새로운 도형이 추가되어도, maim()의 루프는 변경할 필요가 없다.

소멸자의 Virtual 선언

  • 소멸자를 virtual로 선언하지 않으면 문제가 발생할 수 있다.
  • 소멸자를 정의해주어야하는 class 는?
    • 생성자에서 동적 할당을 하는 class
  • 객체의 포인터가 수퍼클래스 타입 포인터인 경우 소멸자의 virtual
    선언을 하지 않으면 수퍼클래스의 소멸자만 실행된다.

순수 가상함수

  • 순수 가상 함수(pure virtual function): 함수 헤더만 존재하고 함수의 몸체는 없는 함수
virtual 반환형 함수 이름(매개변수 리스트) = 0;
  • 추상 클래스 : 순수 가상 함수를 하나라도 가지고 있는 클래스 -> 객체를 생성할 수 없는 클래스
  • 사용할때 : 추상적 개념이나, 클래스간 인터페이스를 나타내는 용도로 사용
  • 예시
  • class Shape { protected: int x, y; public: … virtual void draw() = 0; }; class Rectangle : public Shape { private: int width, height; public: void draw() { cout << "Rectangle Draw" << endl; } };

'TIL > [C++ 프로그래밍} TIL' 카테고리의 다른 글

TIL (22.05.25)  (0) 2022.05.25
TIL (22.05.23)  (0) 2022.05.23
TIL 22.05.11  (0) 2022.05.11
TIL (22.04.18)  (0) 2022.04.18
TIL (22.04.17) 3주차 알고랩 풀이  (0) 2022.04.17