다형성(Polymorphism)
다형성은 여러 가지 형태를 가질 수 있는 능력을 의미한다.
객체 지향에서 다형성은 부모 타입의 참조 변수로 자식 타입 객체를 다루는 것을 뜻한다.
다형성을 활용하면 멤버를 사용할 수 있는 범위가 달라진다.
단, 자식 타입의 참조 변수로 부모 타입의 객체를 가리킬 수 없고 또 다른 자식 타입의 객체를 가리킬 수 없다.
자식 타입의 참조 변수로 부모 타입의 객체를 가리킬 수 없는 이유는 있는 기능을 안 쓰는 것은 괜찮지만, 없는 기능을 쓰려고 하면 문제가 생긴다.
예시와 같이 부모 타입인 Car는 색깔과 문, 운전 기능이 있고 자식 타입인 Suv는 바퀴를 추가하는 기능과 라디오 기능이 있다.
부모 타입인 Car가 자식 타입인 Suv를 참조하면 자식 객체만 가지고 있는 기능을 부모가 가지게 된다. (사용은 못함)
하지만 자식 타입인 Suv가 부모 타입인 Car를 참조하면 자식이 가지고 있는 addWheel(), radio() 기능은 부모가 가지고 있지 않기 때문에 문제가 발생한다.
종합해보면 자식 타입의 참조 변수로 부모 타입의 객체를 참조했을 경우 문제가 발생하는 이유는 실제 멤버 개수보다 부족하기 때문이다.
참조 변수의 형변환
참조 변수의 형변환을 이용하여 사용할 수 있는 멤버의 개수를 조절할 수 있다.
기본 타입의 형변환은 값이 바뀌지만, 참조 변수의 형변환은 주소 값이나 객체가 바뀌지 않고 멤버 개수만 바뀌게 된다. 위의 사진을 보면 참조 변수의 형변환으로 car1의 멤버 개수가 달라지는 것을 알 수 있다.
부모, 자식 관계의 참조 변수는 서로 형변환이 가능하다. 하지만 같은 조상을 상속받는 자식 관계 간 형변환을 할 수 없다.
부모 타입으로 형변환시 타입을 생략할 수 있지만, 자식 타입으로 형변환시 타입을 생략할 수 없다.
그 이유는 부모 타입으로 형변환을 시도하여 멤버 개수를 줄이는 것은 괜찮지만, 증가 시키는 것은 자식 타입으로 형변환 하지 않고서는 할 수 없기 때문에 타입을 꼭 명시해야 한다.
어차피 자식은 부모보다 멤버 개수가 최소 같기 때문에 형변환을 생략해도 문제되지 않는다.
결론적으로 형변활할 때 가장 중요한 것은 실제 인스턴스가 무엇인지가 중요하다는 것을 알 수 있다.
매개변수의 다형성
다형성의 장점으로는 다형적 매개변수가 가능하다는 것이다. (다형적 매개변수란 형태가 다양한 매개변수를 뜻함)
참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손 타입의 인스턴스를 넘겨줄 수 있다.
위의 예시와 같이 Tv와 Aircondition의 공통 부모는 Product이다. 따라서 Product 인스턴스를 매개변수로 받는 메서드는 해당 인스턴스의 자식도 받을 수 있다.
다른 장점으로는 하나의 배열로 여러 종류의 객체를 다룰 수 있다는 것이다.
부모 타입의 배열에 해당 부모를 상속받고 있는 자식들의 객체를 담을 수 있다.
Tv와 Aircondion 인스턴스를 따로 생성해주는 것이 아닌 공통 부모인 Product를 배열로 선언하고 해당 배열에 자식 인스턴스를 담을 수 있다.
instanceof 연산자
참조 변수를 형변환할 때 같은 자식 타입간 형변환을 하면 에러가 발생하는데 이러한 문제를 예방하기 위해 사전에 형변환이 가능한지 알 수 있는 방법으로 instanceof 연산자가 있다.
참조 변수의 형변환시 instanceof 연산자를 사용하면 해당 참조 변수가 형변환이 가능한지 확인할 수 있다.
예시와 같이 Suv1은 참조 변수 suv의 인스턴스이기 때문에 형변환이 가능하고 Car1은 부모 타입의 인스턴스이기 때문에 가능하다. Object는 모든 인스턴스의 공통 부모이기 때문에 모든 인스턴스에 대해서 형변환이 가능하다.
형변환이 가능하다면 true 값을 반환해준다.
형변환이 필요하다면 형변환 가능 여부를 확인할 수 있는 메서드를 만들어 체크할 수 있게 해줘야 한다.
'자바' 카테고리의 다른 글
객체 지향 프로그래밍 - 추상화 (0) | 2023.08.18 |
---|---|
객체 지향 프로그래밍 - 인터페이스 (0) | 2023.08.18 |
객체 지향 프로그래밍 - 제어자 (0) | 2023.08.16 |
객체 지향 프로그래밍 - Super (0) | 2023.08.15 |
객체 지향 프로그래밍 - 상속 (0) | 2023.08.15 |