컴퓨터 구조

객체지향의 프로그래밍의 3요소 - 다형성

monstro 2024. 3. 30. 19:40
728x90
반응형

은닉성:https://monstrosite.tistory.com/18

 

객체지향의 프로그래밍의 3요소 - 은닉성

상속성 : https://monstrosite.tistory.com/17 객체지향 프로그래밍의 3요소 - 상속성 객체지향 프로그래밍(Object Oriented Programming) 줄여서 OOP의 3가지 요소에 대해 알아보고자 합니다. 첫 번째 시작으로, 상

monstrosite.tistory.com

 

저번 포스팅에서는 객체지향 프로그래밍의 3대 요소 중 하나인 은닉성에 대해 배워보았습니다.

이번 포스팅에서는 마지막 요소인 다형성에 대해 알아보겠습니다.

 

1) 다형성이란?

마이크로소프트 공식문서에서는 다형성에 관해 2가지 측면의 설명을 제시합니다.

https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/object-oriented/polymorphism

 

다형성 - C#

기본 및 파생 클래스 간의 관계를 설명하는 C#과 같은 개체 지향 프로그래밍 언어의 핵심 개념인 다형성에 대해 알아봅니다.

learn.microsoft.com

 

그리고 저는 이 2가지의 측면 중 2번째 측면인 가상 메서드에 관해 설명드리고자 합니다.

가상 메서드는 상속으로 이루어진 관계에서

원본의 메서드가 기존에 갖고있던 동작보다 더 많은 동작을 할 수 있게끔 해줍니다.

 

그리고 원본의 메서드가 상속관계에서 재정의되는 것을 함수의 오버라이딩(Overridng)이라고 합니다.

 

2) virtual 과 override 키워드

함수의 재정의 즉, 함수의 오버라이딩을 사용하기 위해서는 위와 같은 2개의 키워드를 사용합니다.

위 2개의 키워드의 사용방법은 이미 한번 다룬 적이 있으므로 링크로 대신하겠습니다.

https://monstrosite.tistory.com/15

 

virtual , override 키워드

C++은 효율 우선주의 언어입니다. 특별한 경우가 없다면, 컴파일 시에 비용이 더 높은 게 있다면 비용이 더 높은 걸 사용합니다. 이 특징은 장점일 수도 있고, 단점일 수도 있는 말 그대로 양날의

monstrosite.tistory.com

 

3) 사용예시

플레이어로부터 Move()를 재정의

 

위의 코드에서 Move() 메서드는 Knight와 Mage 클래스로부터 재정의되었습니다.

그런데, 조금 이상합니다.

 

Player 클래스의 Move() 메서드 옆에 abstract라는 키워드가 수식되어 있습니다.

이 abstract 키워드는 순수가상함수 라는 것을 만들 때 사용됩니다.

 

순수가상함수는 메서드가 구체적인 내용없이 형식으로만 존재할 때 사용됩니다.

즉, 순수가상함수는 오직 재정의되기 위해 동작합니다.

 

그리고 이런 순수가상함수를 하나라도 갖고있는 클래스추상 클래스라고 합니다.

추상 클래스는 다음과 같은 특징을 갖고 있습니다.

 

  1. 추상 클래스는 인스턴스를 만들 수 없다
  2. 추상클래스에서 상속받은 클래스는 반드시 순수가상함수를 재정의해야 한다

 

다시한번 위로 올라가 코드를 살펴보면, 결국 Player 클래스는 추상 클래스로서

우리는 순수가상함수인 Move() 메서드를 재정의해야만 합니다.

 

그런데 다시 한번, 이상함을 느낍니다. 소멸자에는 왜 virtual이 수식되어 있을까요?

위의 링크를 눌러 그 내용을 읽어보면 그 이유를 알 수 있습니다.

 

virtual이 수식되지 않았다면 컴파일러는 Knight 클래스의 인스턴스를 삭제했을 때

Knight의 부모 클래스인 Player의 소멸자를 호출해버리는 문제가 발생할 수 있습니다.

 

그렇다면, 삭제되지 않은 Knight 클래스의 인스턴스는 메모리를 야금야금 먹어치우게 됩니다.

이러한 가상소멸자는 상속관계에 있어서 반드시 필요합니다.

 

특히나 C++과 같은 언어에서는 더더욱 조심하며 사용해야 할 것입니다.

 

이로써 객체지향프로그래밍의 3대 요소에 관한 포스팅이 마무리되었습니다.

3대 요소 모두 결국 효율적이고 체계적인 프로그래밍을 위해 우리 모두가 꼭 사용할 줄 알아야 하는 개념입니다.

 

그리고 이 포스팅이 그런 배움에 도움이 되었으면 좋겠습니다.

728x90
반응형

'컴퓨터 구조' 카테고리의 다른 글

싱글톤 패턴  (1) 2024.11.12
멀티쓰레드란?  (0) 2024.07.27
객체지향의 프로그래밍의 3요소 - 은닉성  (0) 2024.03.30
객체지향 프로그래밍의 3요소 - 상속성  (0) 2024.03.29
프로그래밍 개론  (0) 2024.02.18