은닉성:https://monstrosite.tistory.com/18
저번 포스팅에서는 객체지향 프로그래밍의 3대 요소 중 하나인 은닉성에 대해 배워보았습니다.
이번 포스팅에서는 마지막 요소인 다형성에 대해 알아보겠습니다.
1) 다형성이란?
마이크로소프트 공식문서에서는 다형성에 관해 2가지 측면의 설명을 제시합니다.
https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/object-oriented/polymorphism
그리고 저는 이 2가지의 측면 중 2번째 측면인 가상 메서드에 관해 설명드리고자 합니다.
가상 메서드는 상속으로 이루어진 관계에서
원본의 메서드가 기존에 갖고있던 동작보다 더 많은 동작을 할 수 있게끔 해줍니다.
그리고 원본의 메서드가 상속관계에서 재정의되는 것을 함수의 오버라이딩(Overridng)이라고 합니다.
2) virtual 과 override 키워드
함수의 재정의 즉, 함수의 오버라이딩을 사용하기 위해서는 위와 같은 2개의 키워드를 사용합니다.
위 2개의 키워드의 사용방법은 이미 한번 다룬 적이 있으므로 링크로 대신하겠습니다.
https://monstrosite.tistory.com/15
3) 사용예시
위의 코드에서 Move() 메서드는 Knight와 Mage 클래스로부터 재정의되었습니다.
그런데, 조금 이상합니다.
Player 클래스의 Move() 메서드 옆에 abstract라는 키워드가 수식되어 있습니다.
이 abstract 키워드는 순수가상함수 라는 것을 만들 때 사용됩니다.
순수가상함수는 메서드가 구체적인 내용없이 형식으로만 존재할 때 사용됩니다.
즉, 순수가상함수는 오직 재정의되기 위해 동작합니다.
그리고 이런 순수가상함수를 하나라도 갖고있는 클래스를 추상 클래스라고 합니다.
추상 클래스는 다음과 같은 특징을 갖고 있습니다.
- 추상 클래스는 인스턴스를 만들 수 없다
- 추상클래스에서 상속받은 클래스는 반드시 순수가상함수를 재정의해야 한다
다시한번 위로 올라가 코드를 살펴보면, 결국 Player 클래스는 추상 클래스로서
우리는 순수가상함수인 Move() 메서드를 재정의해야만 합니다.
그런데 다시 한번, 이상함을 느낍니다. 소멸자에는 왜 virtual이 수식되어 있을까요?
위의 링크를 눌러 그 내용을 읽어보면 그 이유를 알 수 있습니다.
virtual이 수식되지 않았다면 컴파일러는 Knight 클래스의 인스턴스를 삭제했을 때
Knight의 부모 클래스인 Player의 소멸자를 호출해버리는 문제가 발생할 수 있습니다.
그렇다면, 삭제되지 않은 Knight 클래스의 인스턴스는 메모리를 야금야금 먹어치우게 됩니다.
이러한 가상소멸자는 상속관계에 있어서 반드시 필요합니다.
특히나 C++과 같은 언어에서는 더더욱 조심하며 사용해야 할 것입니다.
이로써 객체지향프로그래밍의 3대 요소에 관한 포스팅이 마무리되었습니다.
3대 요소 모두 결국 효율적이고 체계적인 프로그래밍을 위해 우리 모두가 꼭 사용할 줄 알아야 하는 개념입니다.
그리고 이 포스팅이 그런 배움에 도움이 되었으면 좋겠습니다.
'컴퓨터 구조' 카테고리의 다른 글
싱글톤 패턴 (1) | 2024.11.12 |
---|---|
멀티쓰레드란? (0) | 2024.07.27 |
객체지향의 프로그래밍의 3요소 - 은닉성 (0) | 2024.03.30 |
객체지향 프로그래밍의 3요소 - 상속성 (0) | 2024.03.29 |
프로그래밍 개론 (0) | 2024.02.18 |