다형성 Polymorphism
- 다형성이란 "객체가 여러 형태를 가진다" = 하나의 객체가 여러가지 타입으로 사용되는 것
- 다형성은 상속을 전제 조건으로 함
- 다형성을 위해 자바는 자식 클래스가 부모 클래스의 타입을 가질 수 있도록 허용
- 부모 타입에 모든 자식 객체가 대입 될 수 있음
** 객체지향 프로그래밍에서는 객체에 의존하지 않고 역할에 의존해야 함 (의존 = 종속)
다형성을 사용하는 이유
이종모음구조를 하나의 배열로 만들 수 있음 → 코드의 반복을 줄일 수 있음
오버라이딩된 메서드가 작동
// Sonata sonata1 = new Sonata();
Car sonata1 = new Sonata();
// Tucson tucson1 = new Tucson();
Car tucson1 = new Tucson();
Car mustang1 = new Mustang();
Car mustang2 = new Mustang();
// 다형성을 통해 이종모음 배열을 구현할 수 있음
Car[] cArr = {sonata1, tucson1, mustang1, mustang2};
for (Car car : cArr) {
car.accelerate();
}
매개변수에 다형성 적용
자바는 타입을 정확히 지켜야하기 때문에 타입이 다른 메서드를 클래스 만큼 선언해야 함
다형성을 적용하면 메서드 오버로딩을 통해 일일히 구현해 주지 않아도 됨
public void drive(Car car) {
System.out.println("운전을 시작합니다.");
car.accelerate();
}
리턴 타입에 다형성 적용
리턴 타입 역시 자바는 정확히 지켜야 하는데 여러 타입을 반환하고자 할 때
다형성을 사용하면 하나의 메서드로 모든 자식 객체를 리턴 가능
public Car exportCar(int money) {
// 리턴 타입이 다양할 경우 다형성 활용
if(money == 6000) {
return new Mustang();
} else if (money == 4000) {
return new Tucson();
} else if (money == 3000) {
return new Sonata();
} else {
return null;
}
}
타입 캐스팅
자식 클래스를 부모 클래스로 선언하는 것은 자료형의 자동 형변환처럼 업캐스팅이 자동 적용됨
** 주의!! 부모타입을 자식타입으로 다운캐스팅은 불가능
자식을 부모 타입으로 업캐스팅 시 주의할 점
부모가 물려준 필드, 메서드는 작동하지만 자식만의 고유한 속성 및 기능은 사용 불가
자식의 고유 속성 및 기능을 사용하기 위해서는 2가지 방법이 있음
1. 자식 타입으로 자식 객체 선언 및 초기화 한 뒤 필요할 때 부모 타입으로 업캐스팅 적용
2. 형 변환 연산자를 이용하여 타입을 강제로 다운캐스팅 (단, 업캐스팅된 자식을 다운캐스팅하는 것만 가능)
public class Parent {
public int n1;
void method1() {...}
void method2() {...}
}
public class Child extends Parent {
public int n2;
@override
void method2() {...}
void method3() {...}
}
//////////////////////////////////////////////////////////////////////
public class Main {
Parent p = new Child();
p.n1 = 1;
//p.n2 = 2; (x)
p.method1();
p.method2();
//p.method3(); (x)
}