• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

3:30 쯤에서 질문있습니다

21.07.27 23:56 작성 조회수 100

1

Derived* derived = new Derived(5);

Base* base = derived;

delete base;

요렇게 하셨는데 굳이 Base* base = derived; 로 할 필요가 있나요 ..? 혹시 실제로 이런 기법이 언제 쓰이는지 궁금합니다

답변 1

답변을 작성해보세요.

10

안소님의 프로필

안소

2021.07.28

정~~~~~~~~~~말 많이 쓰입니다!!! 

앞에서 이러한 형태가 바로 "다형성"이라는 것이라고 배우셨을텐데요. 다형성은 코드 설계에 있어 정말 중요한 개념입니다. 코드를 효율적이고 깔끔하게 짜는 여러 기법들을 '디자인 패턴' 이라고 부르는데요, 여러 디자인 패턴 중 다형성을 활용하는게 대부분일 정도입니다. (개인적으로 이 다형성을 잘 활용하는 사람이 코드를 이쁘게 잘 짜는 사람이라고 생각해요 ! )

예를 들어.. Animal 이라는 부모 클래스가 있고 이를 상속받는 Cat, Dog, Pig, Lion 자식 클래스들이 있다고 해볼게요. 그리고 Animal 클래스에 Walk 함수를 가상함수로 설정하고 이를 자식 클래스들에서 각각 오버라이딩 했다고 가정해보겠습니다. 여러 자식 동물 클래스마다 Walk 함수 내용이 다르겠죠.

다형성이 없었다면 if(고양이라면) cat.Walk();  if (개라면)  dog.Walk();  if (돼지라면) pig.Walk(); 이런식으로 일일이 나열했어야할지도 모릅니다. 그러나 다형성을 사용한다면 animal.Walk();  이 코드 한 줄이 끝입니다. 앞서 Animal* animal = new Cat(); 을 하여 부모 타입의 포인터인 animal 이 자식 타입 중 하나인 Cat 타입 객체를 가리키고 있었던 상태라면 animal.Walk(); 는 알아서 자동으로 Cat 클래스의 Walk() 을 실행할 것입니다. Dog 객체를 가리키고 있던 상태였으면 animal.Walk(); 는 알아서 자동으로 Dog 클래스의 Walk() 을 실행할 것입니다. 어떠한 동물이던간에 animal.Walk();  한줄로 그 시점에서 animal 이 가리키고 있던 객체의 Walk() 를 실행할 수 있게 되는 것입니다. 전자처럼 여러 조건문을 사용한다던가 개, 고양이, 돼지, 사자별로 따로 함수를 마련한다던가 그럴 필요가 없어지는 것입니다.

void Func(Animal* animal)
{
	animal.Walk();
}

위와 같은 코드가 있다면, Func 함수에 Cat 객체를 파라미터로 넘겼으면 자연스레 Cat 의 Walk() 가 호출될 것이고 Dog 객체를 넘겼다면 Dog 의 Walk() 가 호출될 것입니다. 코드가 정말 깔끔해지죠. 이러한 다형성 개념은 부모 타입의 포인터 혹은 참조가 자식 타입의 객체를 가리킬 때, 그리고 가상 함수 사용으로 실현할 수 있습니다.

혹시 제 설명이 이해가 되지 않으신다면 앞에서 배우셨을 가상함수 강의를 다시 들어보실 것을 권합니다.