반응형
이 포스팅에서는 클래스배열과 클래스 형변환(업캐스팅, 다운캐스팅)에 대해 다루었다. 그외 객체지향코딩의 특징을 활용한 예제 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]);
}
}
반응형
'JAVA' 카테고리의 다른 글
[최상위클래스] Object클래스 (0) | 2022.01.03 |
---|---|
[다형성] 추상클래스 & 인터페이스 (0) | 2022.01.01 |
[상속] 상속과 Overriding (0) | 2022.01.01 |
[클래스] 제어자 & 필드의 구분 (0) | 2022.01.01 |
[클래스] 객체지향 코딩 & 생성자 (0) | 2022.01.01 |