본문 바로가기
JAVA

[다형성] 클래스배열 & Casting

by amoomar 2022. 1. 1.
반응형

 

 

이 포스팅에서는 클래스배열과 클래스 형변환(업캐스팅, 다운캐스팅)에 대해 다루었다. 그외 객체지향코딩의 특징을 활용한 예제 2개에 대한 코드가 추가되어있다.

 

 


 

 

 

1. 클래스배열

: 객체를 여러개 선언해야 하는 경우 배열 타입으로 한 번에 선언후 사용 가능하다.

 

1) 클래스 배열 선언

main{
// 방법 1
	클래스명 [] 배열명 = new 클래스명 [길이];
	클래스명[0] = new 클래스명();
	클래스명[1] = new 클래스명();
	.
	.
	.

// 방법 2
	클래스명 [] 배열명 = {
		new 클래스명(),
    		new 클래스명(),
    		.
    		.
            new 클래스명()
	};
}

 

2) 클래스 배열 사용

main{
	배열명[index].필드명
	배열명[index].메서드명();
}

 

 

 


 

 

2. Casting : 클래스 형변환

 

1) Up casting : 업캐스팅

  • 부모클래스 타입으로 자식클래스를 호출하는 것
  • 부모와 자식간의 공통요소(재정의 메서드)만 사용 가능하며, 자식 클래스의 추가된 것들은 사용할 수 없다.
  • 부모타입으로 선언되었기 때문에 부모의 필드만 사용 가능하지만, 자식클래스에서 재정의 했다면 재정의 된 메서드로 사용된다.
main{
	부모클래스명 배열명 = new 자식클래스명();
}

 

2) Down casting : 다운캐스팅

  • 자식클래스 타입으로 부모생성자를 호출하는 오류
  • 부모의 범위가 더 크기 때문에 자식클래스에 담을 수 없다.
  • 오류표시가 없기 때문에 출력 전에는 오류를 확인할 수 없다.

 


 

3. 예제

 

1) 클래스배열&업캐스팅 활용

: 위의 내용을 기반으로 이론들을 확인 할 수 있는 내용을 직접 코딩할 것.

package class05;
//부모클래스 생성
class Animal{
	String name;
	String food;

	Animal(String name){
		this.name = name;
		this.food = "사료";
	}

	void hello () {
		System.out.println("소리를 낸다.");
	}
	void eat () {
		System.out.println(food +"를(을) 먹는다.");
	}
}
// 자식클래스 1
class Quokka extends Animal{
	Quokka(String name){
		super(name);
		this.food = "이파리 나부랭이";
	}
	void hello () {
		System.out.println("제 이름은 " + name +"이구요! 쿼카 입니당");
	}
	void eat () {
		System.out.println(food +"를(을) 얌얌 먹겠습니당.");
	}
}
// 자식클래스 2
class Giraffa extends Animal{
	Giraffa(String name){
		super(name);
		this.food = "나뭇잎";
	}
	void hello () {
		System.out.println("저는 " + name + "이고요 목이 깁니다..");
	}
	void eat () {
		System.out.println(food +"를(을) 낼름낼름 먹는다.");
	}
}
public class Test02 {
	public static void main(String[] args) {
		Animal [] data = new Animal[5];
		data[0] = new Quokka("김쿼카");
		data[1] = new Giraffa("최기린");
		data[2] = new Quokka("박퀑캉");
		data[3] = new Giraffa("기이린");
		data[4] = new Giraffa("목이긴");

		for(int i=0; i<data.length; i++) {
			data[i].hello();
			data[i].eat();
			System.out.println("=============================");
		}
	}
}

 

 


 

 

2) 클래스배열&업캐스팅 활용 2

: 포켓몬스터

package Test;

import java.util.Random;

class Player{
	void game(Monster mon) {
	 mon.attack();
	}
	void show(Monster mon) {
	mon.info();
	}
}
//부모클래스 생성
class Monster{
	String name;
	int level;
	
	Monster(String name){ //생성자 1(이름) : 오버로딩
		this(name, 5);
	}
	Monster(String name, int level){	//생성자 2(이름, 레벨)
		this.name = name;
		this.level = level;
	}
	void attack() {
		System.out.println("공격!");
	}
	void info() {
		System.out.println("정보");
	}
}
//자식클래스
class Pika extends Monster{
	// 부모생성자와 가장 동일하게 만드는 것이 Best이긴 하나,
	// super안에 사용할 생성자의 인자만 담는다면 오류는 작동하지 않는다.
	Pika(){ // 부모생성자1 사용
		super("피카츄");
	}
	Pika(int level){ // 부모생성자2 사용
		super("피카츄", level);
	}
	void attack() { //공격시 레벨 1증가
		System.out.println("백만볼트!");
		level++;
	}
	void info() {
		System.out.println("이름 : " + name + "\n레벨 : " + level);
	}
}
//자식클래스
class Pai extends Monster{
	Pai(){// 부모생성자1 사용
		super("파이리");
	}
	Pai(int level){ // 부모생성자2 사용
		super("파이리", level);
	}
	void attack() { //공격시 레벨 1~5 랜덤증가
		System.out.println("불뿜기!");
		level += new Random().nextInt(5)+1;
	}
	void info() {
		System.out.println("이름 : " + name + "\n레벨 : " + level);
	}
}
public class Test01 {

	public static void main(String[] args) {
		Player p = new Player();
		// 추천하지 않는 업캐스팅
//		Monster m1 = new Pika(32);
//		Monster m2 = new Pai();
		
		//배열 업케스팅
		Monster [] data = new Monster[3];
		data[0] = new Pika(32);	
		data[1] = new Pai();
		
		//메서드인자 업캐스팅
		p.game(new Pai()); //메서드 인자로는 Monster클래스가 들어가야하기 때문
		p.game(data[0]);	
		
		p.game(data[0]);
		p.game(data[1]);
		p.game(data[0]);
		p.game(data[1]);
		p.game(data[1]);
		p.game(data[0]);
		p.game(data[1]);
		
		p.show(data[0]);
		p.show(data[1]);
	}
}

반응형