다형성( polymorphism )
다형성 : 객체의 타입이 다르면 같은 이름의 함수가 호출되더라도 서로 다른 동작을 하는 것
하나의 코드로 다양한 타입의 객체를 처리하는 기술.
형변환
- upcasting : 상향 형변환
implicit하게 일어남. 서브클래스를 수퍼클래스 타입으로 변환 - downcasting : 하향 형변환
implicit하게 일어나지 않음 수퍼클래스를 서브클래스 타입으로 변환
Shape *ps = new Rectangle(); 자동적 upcasting
왜 그럴까?
자동적으로 upcasting 이 일어나는 이유?
서브 클래스 객체는 수퍼 클래스 객체를 포함하기 때문.
상향 형변환
Shape *ps = new Rectangle(); 하면 객체 포인터가 Rectangle > Shape로 상향 형 변환이 일어남.
하향 형변환
- Rectangle *pr = (Rectangle *)ps;
pr -> setWidth(100); - ((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 |