다형성 Polymorphism
OOP의 4대 특성
* 다형성은 OOP(Object Oriented Programming)의 4대 특성 중 하나로
주류 OO언어에 꼭 들어가는 개념이다.
* 그중에서도 가장 핵심이라고 생각되는 개념이다.
넓은 의미의 다형성
* 넓은 의미에서 다형성은 무언가가 여러가지로 변할 수 있다는 의미이다.
약간만 축소하자면 객체가 여러 타입으로 변할 수 있다는 의미이다.
* 자바나 C++같이 대중적인 언어들은 다형성에 많은 제한을 두고 사용한다.
(제한 내용은 거의 같다.)
많이 채택하고 있는 다형성
* 자바와 C++같은 대중적인 객체지향 언어는 다형성을 부모 자식관계에서만 허용한다.
* 객체가 무엇이든지 변할 수 있는 자유도보다
부모자식관계로 제한된 다형성이
자유도는 적지만 실수가 적고 유용하다고 판단했기때문이다.
* 그러므로 좁은 의미에서 다형성은 자식 객체가 부모 타입으로 변할 수 있다는 의미이다.
(부모가 자식으로는 변할 수 없다.)
다형성의 장점
* 다형성의 가장 큰 장점은
여러 타입의 객체들을 하나의 저장공간에 넣을 수 있다는 것이다.
여러 타입의 개체들이 / 같은 지시를 받고 / 다르게 동작하는 것이다.
* 자바에서 다형성을 사용하기 위해서는 상속관계가 필요하다. (자식의 Overriding)
같은 부모를 가지고 있는 자식 클래스들이
동일한 함수 시그니쳐를 가지고
각각의 다른 동작을 구현한다.
절차적 언어의 if 조건문
* 다형성이 하는 일은 사실 조건문으로도 구현할 수 있다.
하지만 다형성이 가지는 장점이 있고,
상황에 따라 둘을 나누어 사용해야한다.
* 조건문 특히 switch문에 case가 엄청나게 많아지면
가독성이 떨어져 관리하기가 쉽지 않고,
수 많은 조건문들에서 일어나는 변화의 책임이 switch문에 집중된다.
책임이 집중되면 협업을 하거나 책임관계를 생각할때 어려움이 더 커진다.
* 조건문에 조건이 복잡하거나 판단을 위해 여러정보를 요구한다면
문제는 더욱 복잡해지고 다형성을 사용하는게 편할 수 있다.
* 만약 조건문이 주기적으로 업데이트가 필요하다면 단점은 더욱 부각된다.
늦은 바인딩 Late Binding
* 우리는 함수를 호출한다.
호출은 포인터를 가지고 실제 함수 위치로 이동한다는 뜻이다.
이렇게 호출자와 실제 함수가 위치한 메모리가 연결되는 것이 바인딩이다.
* 일반적인 함수 바인딩은 컴파일중에 결정된다. (함수 포인터는 제외)
프로그램을 실행할때 어떤 함수가 호출될지는 이미 결정되어 있다.
이를 이른 바인딩(early binding)이라고 한다.
* 다형성을 사용하기 위해 상속관계와 오버라이딩이 필요하고
이는 늦은 바인딩(late binding)을 해야한다.
늦은 바인딩은 어떤 함수가 호출될지 실행 중에 결정된다.
* 실행 중에 결정되는 늦은 바인딩은 비교적 느릴 수 있다.
다 때려 박아
* 부모형을 사용하면
다양한 종류의 객체들을 한 곳에 저장할 수 있다.
* 부모 포인터는 자식 객체를 가리킬 수 있고,
부모포인터는 함수 호출 또한 가능하다.
부모[max] = { 자식 객체들 };
for(int i =0; i < max; i++){
부모[i].method();
}
다른 의미의 다형성
* 다형성이라고 하면 99% 위와 같은 개념을 말하는 서브타입(subtype) 다형성이다.
이름은 같지만 의미가 다른 2가지 다형성이 더 있다.
* 애드혹(ad-hoc) 다형성
함수명은 같지만 매개변수 목록이 다른 것.
(함수 오버로딩, 연산자 오버로딩)
* 매개변수 다형성
자바의 제네릭(Generic)이나 C++의 템플릿(Template)
* 그냥 그런게 있다고....
보통 다형성이라고 부르지도 않음.
귀여운 그림은 쭐어님이 그리셨습니다.
'자바 JAVA' 카테고리의 다른 글
[JAVA]자바 - getter와 setter (0) | 2021.07.04 |
---|---|
[JAVA]자바 - 생성자 Constructor (0) | 2021.07.03 |
[JAVA]자바 - 데이터 추상화 Data Abstraction (0) | 2021.06.29 |
[JAVA]자바 - 캡슐화 Encapsulation (0) | 2021.06.29 |
[JAVA]자바 - 빌드와 라이브러리 (0) | 2021.06.24 |