1.다형성 배열
일반 변수방(int, String, double 등)에 배열 선언[]을 할 때의 방식처럼
클래스 선언시에도 이용이 가능하다.
배열은 특징이 유사하니 별도의 설명 없이 예제를 보자.
마법사가 3가지의 주문을 외우는 코드로 예를 든다.
주문 클래스
package Chap05.exam08.field;
public class Spell {
public String casting() {
return "주문을 외운다.";
}
}
주문 클래스를 상속받는 마법들
package Chap05.exam08.field;
public class Fire extends Spell {
@Override
public String casting() {
// TODO Auto-generated method stub
return "화염 " + super.casting();
}
}
package Chap05.exam08.field;
public class Ice extends Spell {
@Override
public String casting() {
// TODO Auto-generated method stub
return "얼음 " + super.casting();
}
}
package Chap05.exam08.field;
public class Light extends Spell {
@Override
public String casting() {
// TODO Auto-generated method stub
return "빛 " + super.casting();
}
}
스펠을 배열방식으로 객체화하여 사용
package Chap05.exam08.field;
public class MacroMage {
public static void main(String[] args) {
// 한번 실행하면 무조건 세개의 주문이 나가도록 (for문 이용)
// 배열로 생성해서 객체 생성
Spell[] mage = new Spell[3];
mage[0] = new Fire();
mage[1] = new Light();
mage[2] = new Ice();
for(int i = 0; i < 3; i++) {
System.out.println(mage[i].casting());
}
for(Spell spell : mage) {
System.out.println(spell.casting());
}
// for(int i = 0; i < 5; i++) {
// mage = new Light();
// System.out.println(mage.casting());
// mage = new Fire();
// System.out.println(mage.casting());
// mage = new Ice();
// System.out.println(mage.casting());
// }
}
}
2.활용, 메소드 매개변수에 클래스를 타입으로 설정하기
예전에 설명했듯이 변수 타입 역시 클래스와 같이 구현되고 메소드의 매개변수에 이용할 변수들을 따로 선언해주었다.
그러면 클래스를 직접 선언하고 나서 매개변수에 선언하여 활용 할 수 없을까?
가능하다. 다음 예제를 통해 눈에 익히자.
자동차와 그것을 상속받는 페라리와 마세라티
package Chap05.exam09.refer;
public class Car {
public void run() {
System.out.println("자동차가 달린다.");
}
}
package Chap05.exam09.refer;
public class Ferrari extends Car {
@Override
public void run() {
System.out.println("페라리가 달린다.");
}
}
package Chap05.exam09.refer;
public class Maserati extends Car {
@Override
public void run() {
System.out.println("마세라티가 달린다.");
}
}
운전자 클래스
package Chap05.exam09.refer;
public class Racer {
// public void drive(Car car) {
// //Car 형태면 Car가 부모클래스이기 때문에 어떠한 객체라도 다 받을 수 있다.
// car.run();
// }
// 다형성을 사용 하지 않을 경우?
// 각 형태별 메서드를 만들어야 한다.
// 오버로드를 사용하면 사용자 입자에서는 동일
public void drive(Maserati car) {
// 다형성을 사용하지 않아 고유의 멤버 사용이 가능
car.run();
}
public void drive(Ferrari car) {
car.run();
}
public void drive(McLarren car) {
car.run();
}
}
레이서 클래스를 불러오는 메인 클래스
package Chap05.exam09.refer;
public class Main {
public static void main(String[] args) {
// 레이서를 부른다
Racer man = new Racer();
Car car1 = null; // 차를 가져온다.
car1 = new Maserati();
// man.drive(car1);
man.drive(new McLarren());
man.drive(new Ferrari());
}
}
'개념 및 코딩 > 05.상속' 카테고리의 다른 글
| [JAVA]05-06.익명객체, 결합도 (0) | 2018.08.30 |
|---|---|
| [JAVA]05-05.추상클래스, 인터페이스 (0) | 2018.08.30 |
| [JAVA]05-03.다형성 (0) | 2018.08.29 |
| [JAVA]05-02.오버라이드 (0) | 2018.08.27 |
| [JAVA]05-01.상속 (0) | 2018.08.24 |