무효 클릭 IP 추적 중...
c#

[c#] 다형성(polymorphism) 이란? | 왜 사용하는가? + 오버라이딩

꼬예 2022. 5. 20.

이번 포스팅에서는 다형성에 대해 알아보도록 하겠습니다.

(포스팅을 읽기전 반드시 상속에 관한 해당 포스팅을 읽고 와주시기 바랍니다.)

 

1. 다형성이란?

우리에게는 두개의 클래스가 있습니다.

Monkey 클래스Animal 클래스를 상속받은 형태이고 , 두 클래스의 메소드는 같은 이름같은 시그니쳐로 구성 되어 있습니다.

 

자, 여기서 자식 클래스 객체를 생성해볼까요?

그런데! 아래와 같은 방법으로도 생성이 가능합니다.

두번째에서 어리둥절한 분들이 많을 것같은데요.

"아니 어떻게 Monkey()로 객체 생성을 했는데 Animal 타입의 변수에 할당할 수가 있지?"

 

이것을 가능하게 해주는것이 이번 포스팅의 주제인 다형성에 관한것입니다.

 

다형성(Polymorphism)이란 상속을 받은 자식 클래스(여기선 Monkey클래스)가 위와 같이 다양한 타입을 가질 수 있는것을 의미합니다.

 

 

왜 이런식의 다형성이 가능한지 메모리 구조를 통해 이해해보도록 하겠습니다.

 

 

 

2. 다형성 원리(with 그림)

 

위와 같이 Monkey() 클래스 객체를 생성하는 순간, 메모리상 Monkey뿐만아니라 Animal 까지 함께 들어오게 됩니다.

 

왜냐하면 Monkey클래스가 Animal클래스를 상속받았기 때문입니다. 즉 Monkey클래스에서 Animal클래스의 모든 기능을 이용가능한것도 이러한 원리 때문입니다.

 

자 그렇다면, 이 메모리에 올린 데이터를 변수에 할당한다는것은 무슨 의미일까요?

 

Monkey 타입으로 변수를 지정했기 때문에 AnimalMonkey에 둘다 접근 가능하다! 라는 것을 의미합니다.

반면 변수를 Animal타입으로 지정했다면 아래와 같이 Animal부분에만 집중하겠다라는것이 되는것입니다.

 

어차피 메모리에 다 있는데 그중에 일부만 보는건 당연히 가능하겠죠.

 

 

실제로 Animal타입으로 만든 변수로 지정을 할경우 sound 메서드를 찍어보면 Animal.sound()라는걸 알 수 있습니다. 

해당값을 출력을 해보면

output:

Animal 메서드의 값이 실행되는걸 알 수 있습니다.

 

 

 

 

3. virtual, override 를 추가 하면 벌어지는 일

 

여기까지 글을 읽으신분들은 의아하실것 같습니다. 

부모클래스 메서드를 실행시키고 싶으면 그냥 아래 같이 쓰면 되는거아닌가? 라고 하고말이죠.

 

하지만 기존 코드를 조금만 변경 해보겠습니다.

바로 부모 클래스에는 virtual , 자식(파생) 클래스에는 override를 추가해주었습니다.

(지난 오버라이딩 포스팅에서 설명드렸듯이 해당 키워드를 안적어도 오버라이딩은 잘 적용이 됩니다.)

 

어떤 차이가 발생하는지 한번 보시죠.

output:

 

똑같은 코드를 작성하였는데 자식 클래스의 메서드가 실행 된것을 알 수있습니다.

확인을 해보면 여전히 Animal.sound()를 가리키고 있는데말이죠.

왜냐하면 부모 클래스를 지켜보고 있던 컴파일러가 virtual 키워드를 보고 "아하 자식 클래스 메서드를 실행시키라는 말이구나"라는걸 깨닫고 메모리에 있는 자식 메서드를 실행시키기 때문에 가능한것입니다. 

 

여기까지 배운걸 정리하자면, 부모 타입으로 만들었음에도 불구하고 자식 클래스의 기능이 구현 가능하다! 라는것입니다.

 

그럼 이게 어디에 사용될까요?

 

 

4. 어디에 쓰일까?

위와 같이 동물 클래스를 몇개 더 만들어보았습니다.

모두 Animal을 상속하고 있구요!

 

이 클래스들의 메서드를 실행하고싶은데, 기존 방법으로는 아래와 같이 다적어주는 방법 밖에 없습니다.

똑같은 sound()를 세번이나 반복하고있네요.

 

이럴때는 리스트에 담아서 for loop를 돌린다면 훨씬 깔끔해질 수 있죠.

그런데 리스트에는 각각의 서로 다른 타입의 객체를 같이 담을 수 없습니다.

 

하지만! 앞서 배운 다형성을 이용하면 이게 가능합니다.

위와 같이  Animal(부모클래스) 타입의 리스트를 생성합니다. 

다형성덕분에 해당 리스트에 객체들을 담을때마다 자연스럽게 각 객체들이 부모 타입으로 변경됩니다.

 

그리고 forloop를 통해 출력할때는 부모 클래스 메서드에 virtual가 있기 때문에 각 객체(자식클래스)의 메서드가 실행이 됩니다.

output:

 

만약 virtual, override를 뺀다면 아래와 같이 모두 부모 메서드를 실행할 것입니다.

 

 

 

이 글과 읽으면 좋은글

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글