C++은 효율 우선주의 언어입니다.
특별한 경우가 없다면, 컴파일 시에 비용이 더 높은 게 있다면 비용이 더 높은 걸 사용합니다.
이 특징은 장점일 수도 있고, 단점일 수도 있는 말 그대로 양날의 검인 특징입니다.
처리철차가 간단하고 처리속도 역시 빠르겠지만, 또 그만큼 상황을 제한해버립니다.
그렇지만 우리에게는 virtual 과 override라는 2개의 무기로 이 단점을 능숙하게 조련할 수 있습니다.
한번 보겠습니다.
Children은 Parent클래스로부터 상속받은 자식 클래스 입니다.
따라서 Parent타입 포인터에 객체 kids의 주소를 넣었다면 우리는 "자식입니다"라는 출력화면을 보았어야 합니다.
하지만, 출력은 "엄마, 아빠입니다" 가 되어버렸습니다.
이러한 결과가 발생한 이유는 C++의 효율 우선주의 방침때문입니다.
따라서 자동적으로 부모의 메소드를 실행하게 된 것입니다.
이러한 상황을 예방할 수 있는 것이 virtual 과 override입니다.
virtual키워드는 포인터가 가리키는 진짜 대상이 누구인지 파악해 대상의 함수를 호출하게 합니다.
이를 Dynamic Dispatch라고 합니다.
또 override 키워드는 사용이 강제되지는 않지만, 한번 사용하고 나면 일종의 안전장치로써 작동합니다.
재정의 되야 하는 가상메소드가 부모에 존재하는지 + 또 가상메소드가 자식클래스 안에서 재정의되었는지를 판단하여
빨간색의 에러를 코드에 표현해줍니다.
virtual은 C++의 특징 중 하나인 다형성을 구현할 때 매우 중요하게 사용됩니다.
또 override는 프로그래머로 하여금 위험상황을 인지할 수 있게 도움을 줍니다.
이러한 키워드들을 다루고 사용하는 데 두려움이 없어지셨으면 좋겠습니다.
'C++' 카테고리의 다른 글
C++의 캐스팅 - static_cast (0) | 2024.04.08 |
---|---|
캐스팅 - C언어의 캐스팅 (0) | 2024.04.07 |
람다 (0) | 2024.03.18 |
함수 객체 (0) | 2024.03.11 |
함수 포인터 (0) | 2024.03.11 |