brunch

You can make anything
by writing

C.S.Lewis

다형성(Polymorphism)

* 이 내용은 철저히 초심자를 위해 알기 쉽게 설명하는 것을 목적으로 하고 있습니다.

* 더 정확하고 자세한 개념은 다른 고수님들의 글들을 참고하시길 바랍니다.

* 그리고 이 글에서는 코드 최소한으로 다루고 있습니다.


이번엔 OOP 4대 특성의 세 번째, 다형성(Polymorphism)에 대해서 알아보도록 하겠습니다.

다형성 역시도 굉장히 유용하게 사용할 수 있는 개념은 데, 생각보다 복잡하게 여겨지는 경우가 많습니다.

하지만 이 역시도 우리 생활과 연결 지어 생각해 보면 쉽게 이해할 수 있습니다.


우선 다형성의 개념에 대해서 알아보기 위해 우리가 사진 정리를 한다고 가정해 보겠습니다.

인간과 고래, 개의 폴더를 만들어서 해당되는 사진을 넣습니다.

그런데 사진들을 확인 후 3개의 폴더에 나눠서 다 보니 뭔가 힘듭니다.

그래서 포유류라는 폴더에 인간과, 고래, 개의 사진을 넣기로 결정합니다.

그리고 앞으로 원숭이, 사자, 고양이 등의 사진이 나타난다 해도 별도의 폴더를 만들 필요 없이 포유류 폴더에 넣으면 됩니다.


다른 예시를 들어볼까요? 이번엔 영화입니다.

영화를 장르별로 폴더에 나눠 담다가 마찬가지 이유로 각 폴더에 넣기도 어렵고, 새로운 장르의 영화가 나오면 별도의 폴더를 만들기도 어려워 movie라는 폴더에 넣는 것입니다.

위 두 상황을 보면 개별의 폴더에 무언가를 세세하게 나눠 담기가 힘들 경우 그 상위의 폴더에 담았습니다.

그리고 그 상위 폴더들은 누가 들어도 고개를 끄덕일 정도로 하위폴더와의 연관성이 있습니다.

이게 OOP의 4대 특성 중 하나인 다형성의 개념입니다.


이전에 봤던 영화의 분류 개념을 class로 표현해 봤습니다.

왼쪽의 폴더 그림을 볼까요?

각 장르 영화의 공통점은 바로 ‘영화’ 라는데 있었습니다.

그리고 하위 폴더에 있는 영화들은 상위 폴더에 넣어도 문제가 없겠죠?

다음은 오른쪽에 있는 클래스 다이어그램을 보겠습니다.

하위 클래스들의 공통점은 바로 Movie 클래스에게 상속을 받는다는 것입니다.

그러면, Movie 클래스에 Action, Horror, Comedy 클래스가 담길 수 있다는 말이 되나요?

바로 그겁니다!


자바에서 다형성은 공통점(같은 부모)이 있다면 그 안으로 들어갈 수 있는 개념니다.

그럼 이걸 사용하면 어떤 점이 좋을까요?

폴더를 자잘하게 여러 개를 사용하는 것보다 커다란 공통점이 있는 한 폴더에 사용할 때 좋은 점을 떠올려 봅시다.

1. 많은 폴더를 만들 필요가 없게 됩니다.

2. 해당 공통점을 가지고 있는 하위분류가 나타나더라도 대응이 가능합니다.


만약, 폴더로도 별로 와닿지 않는다면 좀 더 이해하기 쉬운 예시가 또 있습니다.

이건 어떤가요?

한 부모님 아래 네 형제가 살고 있었습니다.

이 형제들은 각각 독립해서 자취를 하고 있었습니다.

자취를 해 보신 분들은 알겠지만 생각보다 일도 많고 돈도 많이 듭니다.

즉, 자원이 많이 들어간다는 것이죠!

그래서 셋째는 다시 부모님 집에 들어가 살기로 합니다.

여기서 중요한 건 우리 부모님 집에 들어갈 수 있다는 것입니다.

다른 형제들도 자취하다가 힘들다면 다시 집에 들어올 수 있을 겁니다. 다 같은 가족이니까요.


다형성을 사용했을 때 장점이 조금 이해가 되시나요?

자취보단 부모님 집에서 사는 것이 여러모로 자원도 적게 들고 편리하기 때문이죠.

이걸 코드로 표현해 보고 프로그래밍 상에서 장단점을 다시 생각해 보겠습니다.

ParentHouse를 상속받는 세 개의 클래스들이 있습니다.


본래는 이 형제들을 가지고 무언가를 하기 위해서는 이들을 담을 수 있는 각각의 형태를 가지고 있는 변수가 필요합니다.

만약 이런 클래스가 100 개라면 100 개의 변수를 만들어야 합니다.

게다가 이 변수에 이름도 지어줘야 하는 등 번거로운 일들이 많겠지요?


배열을 사용하면 어떠냐 고요?

여기까지 생각하셨다면 프로그래밍에 상당한 재능이 있으신 겁니다.

하지만 아쉽게도 불가능합니다. 그 이유는 나중에 알아보도록 하겠습니다.


같은 상황에서 다형성을 활용해 보겠습니다.

부모 형태를 가진 변수 하나에 모든 형제들이 사용할 수 있습니다.

house라는 변수를 사용하고 싶으면 ParentHouse를 상속받은 클래스기만 하면 됩니다.

그리고 변수를 여러 개를 만들 필요도 없겠지요?


묵시적형변환, promotion

이렇게 자식의 객체가 부모 형태로 들어가는 것을 우리는 묵시적형변환, promotion이라고 합니다.

어디서 들어보지 않았나요?

맞습니다!

작은 물컵 안의 내용을 큰 물컵 안으로 옮길 때 별다른 체크 없이 들어간다는 그 묵시적형변환입니다.

작은 개념이 큰 개념으로 들어간다고 생각해 보면… 맞죠?


이 묵시적형변환은 본인의 부모, 혹은 부모의 부모와 같이 최 상위의 형태로 까지 계속 올라갈 수 있습니다.

위 다이어그램을 볼까요?

누가 누구를 상속받고 있는지 한눈에 알 수 있다면 여러분들은 클래스 다이어그램을 잘 읽고 계신 것입니다.

여기에서 Cat 은 Mammal의 형태로 promotion 이 될 수 있고, Vertebrate 에도 promotion 될 수 있습니다.


Chicken 은 Birds의 형태로 promotion 이 될 수 있고, Vertebrate 에도 promotion 될 수 있습니다.

하지만 Cat 은 Birds를 상속받지 않았기에 Birds 형태로 promotion 될 수 없듯이, Chicken 도 Mammal에 promotion 할 수 없습니다.


이 개념은 이후에도 계속 나올 테니 일단은 아~ 그렇구나 정도로만 넘어가셔도 됩니다.


명시적형변환, Casting

묵시적형변환 promotion에 대해서 알아보았습니다.

앞에서 설명했던 자식이 부모형태의 변수에 들어가는 다형성의 개념이 묵시적형변환이었죠?

이 묵시적형변환이 항상 장점만 있는 것은 아닙니다.

개는 멍멍하고 짖는 본인의 특징이 있습니다.

하지만 포유류의 형태가 되면 포유류가 곧 강아지 아니기에 멍멍 짖는 특징은 사라지게 됩니다.

조금 어렵나요?

그럼 보다 알기 쉽게 설명해 보겠습니다.


그림 한 장만으로도 단점 설명이 충분한 것 같습니다.

여러분들은 밤늦게 까지 게임을 하거나 영화를 보는 특성이 있습니다.

하지만 이 특성을 부모님과 함께 살면서 계속 유지할 순 없겠죠?


하지만 이 집안사람들은 모두 늦은 시간 영화 보는 것을 좋아한다면 이야기는 달라지겠죠.


어쨌든 부모님과 함께 영화만 보는 것에 만족하지 않고, 밤새 게임도 하고 싶다면 부모님으로부터 독립해 본래 자신의 집으로 돌아가야 하겠죠?

이 과정을 바로 명시적 형 변환, Casting이라고 부릅니다.

즉, 본인의 특성을 사용하기 위해 다시 본인의 형태로 되돌아가는 것이죠.

큰 개념인 부모로부터 자식이라는 작은 개념으로 되돌아가기에 명시적 형 변환을 하는 것입니다.

위에서 설명했던 명시적형변환을 코드로 살펴볼까요?


Child는 ParentHouse를 상속받았습니다.

Child는 부모로부터 상속받은 showMovie()를 override 하였네요.

그리고 본인만의 메서드인 playGame()을 가지고 있습니다.


이제 Child 클래스의 객체는 부모 형태인 house 변수 안으로 들어갑니다.(묵시적형변환 promotion)

그렇게 부모님의 집으로 들어갔기 때문에 본인만의 메서드인 playGame() 은 사용 할 수 없습니다.

하지만 Child 가 수정하긴 했지만 부모로부터 물려받은 showMovie()는 사용이 가능합니다.


본인만의 메서드인 playGame()을 사용하려면 부모 형태가 아닌 자신의 형태로 되돌아가야 합니다.

그렇게 되돌아가면 비로소 꿈에도 그리던 playGame()을 실행할 수 있게 되는 것입니다.


다형성에 대해서 알아보았습니다.

어렵지 않죠? 사실 다형성에 대한 100% 정확한 설명이라고 할 순 없으나 이 정도만 알고 계셔도 자바 프로그래밍 내에서 다형성을 이해하고 활용하는 데에는 모자람이 없을 것입니다.

다형성, 자취와 부모님 집으로 들어가서 살았을 때의 장점과 단점에 대해서 생각해 보세요!

다음에는 이 다형성을 활용한 사례들을 살펴보도록 하겠습니다.

매거진의 이전글 오버라이드(Override)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari