다형성 (polymorphism)
: 하나의 메소드가 서로 다른 클래스에서 다양하게 실행되는 것을 말한다.
다형성을 구현하기 위해서는 다형성을 구현할 메소드를 포함할 클래스에게 부모 클래스가 상속을 해줘야 한다.
부모클래스와 자식클래스에는 같은 이름의 메소드가 있어야 하고,
자식 클래스에서는 재정의(Override) 해야한다.
업 캐스팅 Up Casting
: 부모 클래스 타입으로 자식 생성자를 호출하는 것
부모클래스명 객체명 = new 자식생성자();
부모와 자식 간의 공통요소(재정의 메서드)만 사용가능하며,
자식클래스의 추가된 것들은 사용할 수 없다.
부모타입으로 선언되었기 때문에 부모의 필드만 사용가능하지만,
자식클래스에서 재정의 했다면, 재정의 된 메서드로 사용된다.
다운 캐스팅 Down Casting
: 부모클래스로 객체가 생성된 경우 자식 클래스에만 있는 메서드에 접근하려 할 때, 자식 클래스라고 명시를 해주며 호출을 해준다.
((자식클래스) 부모클래스객체).메서드();
instanceof 연산자
: 타입을 반환하는 연산자이다.
예시코드
- Avengers.java
public class Avengers { // 부모 클래스
// 멤버변수
String name;
// 생성자
public Avengers(String name) {
this.name = name;
}
// 메서드
public void assemble() {
System.out.println(name + " : Assemble !");
}
}
- CaptainAmerica.java
public class CaptainAmerica extends Avengers { // 자식 클래스
// 생성자
public CaptainAmerica(String name) {
super(name);
}
// 부모클래스 메서드 재정의
@Override
public void assemble() {
System.out.println(name + " : Hail, Hydra");
}
}
- IronMan.java
public class IronMan extends Avengers{ // 자식클래스
public IronMan(String name) {
super(name);
}
// 부모클래스 메서드 재정의
@Override
public void assemble() {
System.out.println(name + " : I am Ironman.");
}
}
- Thor.java
public class Thor extends Avengers{ // 자식 클래스
public Thor(String name) {
super(name);
}
// 부모클래스 메서드 재정의
@Override
public void assemble() {
System.out.println(name + " : I am the god of thunder !!!");
}
// 부모클래스에 없는 메서드 생성
public void attack() {
System.out.println("망치 공격");
}
}
- MainTest.java
public class MainTest {
public static void main(String[] args) {
// Up Casting
Avengers avengers = new Avengers("Avengers");
Avengers captainAmerica = new CaptainAmerica("Captain America");
Avengers ironMan = new IronMan("Iron Man");
Avengers thor = new Thor("Thor");
if(thor instanceof Thor) {
System.out.println("토르 타입입니다.");
}
avengers.assemble();
captainAmerica.assemble();
ironMan.assemble();
thor.assemble();
// Down Casting
((Thor) thor).attack();
}
}
다형성으로 자식클래스들은 부모클래스로 볼 수 있다.
업 캐스팅을 이용해 자식클래스들은 부모클래스로 객체를 생성을 할 수 있고,
각 자식클래스 별로 재정의(Override)한 부모클래스의 메서드에 .연산자로 접근할 수 있다.
instanceof 연산자로 타입을 확인해보면,
부모클래스로 객체를 생성해도 자식클래스의 타입으로 반환되는 것을 확인할 수 있다.
Thor 클래스에만 있는 attack() 메서드는 부모클래스로 생성된 객체로는 접근할 수 없기 때문에
다운 캐스팅을 이용해 attack() 메서드에 접근할 수 있도록 한다.
'Back-End > Java' 카테고리의 다른 글
[Back-End][Java] 31. 객체 지향 프로그래밍 연습하기 (스타크래프트) (0) | 2021.09.14 |
---|---|
[Back-End][Java] 30. 추상 클래스, 후크메서드, 템플릿 메서드 패턴 (0) | 2021.09.14 |
[Back-End][Java] 28. 상속 Inheritance (1) (0) | 2021.09.10 |
[Back-End][Java] 27. ArrayList (0) | 2021.09.09 |
[Back-End][Java] 26. 배열 Array (2) - 객체 배열 (0) | 2021.09.07 |