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

+ Recent posts