다형성(polymorphism)이란?
객체지향 3대특징(상속,다형성,캡슐화)중 하나이다.
하나의 타입으로 다양한 실행 결과를 얻을 수 있게하는 방식을 일컫는다.
하나의 타입이란 상위클래스 타입의 변수가 복수의 하위클래스 객체를 참조할 수 있도록 하는것을 말함.
상위클래스 new(하위클래스1)
상위클래스 new(하위클래스2)
이런식으로 쓴다는 얘기
어떻게 구현하나?
우선 구현할 코드를 선언부분과 구현부분으로 분리한다.
선언부분은 추상화 시키고 구현 부분을 다양한 방법으로 만들어 선언부분에서 선택하여 사용할 수 있게한다.
현실세계를 예로들면 상위개념/하위개념으로 각각 선언/구현 부분을 나눈다.
ex) 선언부분=컨센트 구현부분=220V,110V
선언부분=유닛 구현부분=질럿,드론,시저탱크
선언부분=아이돌 구현부분=트와이스,BTS,ITZY
왜 다형성으로 구현하는가?
다음과 같은 장점이 있다.
여러 타입의 객체를 하나의 타입으로 관리가 가능
각각의 타입을 따로 정의하지 않아도 되므로 코드양이 그만큼 줄어든다.
적은 결합도로 코딩이가능해 재사용성이 높아짐
다형성은 무조건 좋은가?
일단 type이 없는 언어에서는 하나의 타입으로 관리가 가능하다는 장점은 사라짐.
그 외에도 다형성의 단점에 대해 구글링 해본결과 아래와 같은 단점이 있다고 한다.
프로그램 가독성이 낮아짐
주관적이긴한데 그러한 의견들이 종종보임. 필자는 가독성이 높아지는 느낌을 받음..
개발자의 능력에 따라 코드의 품질차이가 큼
OOP의 이해도 문제인건가..?
디버깅이 어려움
이걸 컴파일링 언어에 한정된 단점? build시 에러를 확인할 수 없으므로
메모1
java에서 다형성을 실현하기 위해서는 오버리딩,오버로딩을 이용한다고함.
메모2
ruby나 javascript는 인터페이스가 없어서 선언부분의 추상화를 완벽히 구현할 수 없다.(추상화 비슷한 코드를 짠다.)
메모3
duck typing이라는 개념이 다형성을 구현하기 위한 방법론중 하나이다.
메모4
레일즈에서는 관계에 대한 다형성을 구현하기 위한 polymorphic association이라는 기능이 있다.
reference:
https://webclub.tistory.com/406
https://debugdaldal.tistory.com/152