[ Java ] 08. 다형성 ( Polymorphism )
📚 Table of Contents
01. 다형성 ( Polymorphism )
다형성이란 하나의 객체가 여러 가지 형태를 가질 수 있는 것을 의미한다.
자바에서 다형성은 한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 하는 것이다.
즉, 상위 클래스 타입의 참조 변수를 통해서 하위 클래스의 객체를 참조할 수 있도록
허용하여 상위 클래스가 동일한 메시지로 하위 클래스들이 서로 다른 동작을 할 수 있도록 한다.
다형성을 활용하면, 부모 클래스가 자식 클래스의 동작 방식을 알 수 없어도 오버라이딩을 통해 자식 클래스에 접근할 수 있다.
다형성의 장점
- 유지보수 : 여러 객체를 하나의 타입으로 관리할 수 있어 유지보수가 용이하다.
- 재사용성 : 객체의 재사용이 쉬워 재사용성이 높아진다.
- 느슨한 결합 : 클래스 간의 의존성을 줄여 확장성은 높아지고 결합도는 낮아진다.
다형성의 조건
- 상위 클래스와 하위 클래스는 상속 관계여야 한다.
- 다형성이 보장되기 위해 오버라이딩(하위 클래스 메서드의 재정의)이 반드시 필요하다.
- 자식 클래스의 객체가 부모 클래스의 타입으로 형변환(업캐스팅) 해야 한다.
class Human {
public void info() {
System.out.println("나는 사람입니다.");
}
}
class Female extends Human {
public void info() {
System.out.println("나는 여자입니다.");
}
}
class Male extends Human {
public void info() {
System.out.println("나는 남자입니다.");
}
}
public class PolymorphismEx {
public static void main(String[] args) {
// 객체 타입과 참조변수 타입이 일치
Human human = new Human();
Female female = new Female();
// 객체 타입과 참조변수 타입이 불일치(다형성)
Human female = new Female();
Human male = new Male();
// 하위 클래스 타입으로 상위 클래스 참조 불가능
// Female female2 = new Human();
human.info();
female.info();
male.info();
}
참조 변수의 형 변환
자바에서는 기본 자료형의 형 변환도 가능하지만, 참조 변수도 형 변환이 가능하다.
참조 변수의 형 변환은 사용할 수 있는 멤버의 개수를 조절하는 것이다.
형 변환을 위한 조건
- 서로 상속관계에 있는 상위 클래스 : 하위 클래스 사이에만 형 변환이 가능하다.
- 업 캐스팅(하위 클래스 타입에서 상위 클래스 타입으로 형 변환)은 형 변환 연산자를 생략할 수 있다.
- 다운 캐스팅(상위 클래스에서 하위 클래스 타입으로 변환)은 형 변환 연산자를 반드시 작성해야 한다.
// 업 캐스팅 () 생략 가능
Parents parents = (Parents) child1;
// 다운 캐스팅 () 생략 불가능
Child1 child11 = (Child1) parents;
// Child1과 Child2는 상속 관계가 아니므로 형변환 불가능
// Child2 child2 = (Child2) child1;
02. instanceof
instanceof 연산자는 참조 변수의 형 변환이 가능한 지의 여부를 boolean 타입으로 확인할 수 있는 자바의 문법 요소이다.
즉, 업 캐스팅 또는 다운 캐스팅이 가능한 지를 검사하는 것이다.
Animal animal = new Animal();
System.out.println(animal instanceof Object); // true
System.out.println(animal instanceof Animal); // true
System.out.println(animal instanceof Dog); // false
System.out.println(animal instanceof Cat); // false
Animal cat = new Cat();
System.out.println(cat instanceof Object); // true
System.out.println(cat instanceof Animal); // true
System.out.println(cat instanceof Dog); // false
System.out.println(cat instanceof Cat); // true
Animal dog = new Dog();
System.out.println(dog instanceof Object); // true
System.out.println(dog instanceof Animal); // true
System.out.println(dog instanceof Dog); // ture
System.out.println(dog instanceof Cat); // false
'Language > Java' 카테고리의 다른 글
[ Java ] 10. 인터페이스 ( interface ) (0) | 2023.11.09 |
---|---|
[ Java ] 09. 추상 클래스 ( abstract class ) (0) | 2023.11.09 |
[ Java ] 07. 상속 ( Inheritance ) (1) | 2023.11.09 |
[ Java ] 06. 클래스 ( class ) 와 객체 (5) | 2023.11.09 |
[ Java ] 05. 다차원 배열 ( multi-dimensional array ) (1) | 2023.11.09 |