// Abstract Class : 클래스, 메서드 또는 속성을 추상적으로 정의할 때 사용 (= 정말 상속만을 위해 정의된 클래스.)
// --> 추상 클래스는 객체를 직접 생성할 수 없으며, 하위 클래스에서 추상 메서드를 구현해야 함
// --> 추상 클래스는 상속과 다형성을 구현하는 데 사용됨
// Abstract Method : 메서드의 시그니처만 선언되고 메서드의 본문은 제공되지 않는다.
// ★★★답정너 : abstract class를 상속받은 하위클래스는 무조건! abstract된 메서드를 오버라이딩 해야한다 ★★★
// --> 근데 abstract 잘안써^^...; 이유는 다음 클래스에서....ㅎ
abstract class Unit{
int hp;
int ap;
int speed;
// void move() { // 얘가 없어지면 Unit은 move를 못해.
// SCV, Marine, Tank는 각자의 매서드로 move를 할 수 있어
// // --> 개념적으로도 X. 상위클래스의 매서드를 삭제하면 안되겠지?
// // System.out.println("유닛이 " + speed + "의 속도로 움직입니다");
// --> 근데 굳이굳이 Unit의 move를 정의해줄 필요는 없지?
// }
abstract void move();
// abstract method의 문법 : 어차피 구현될 기능이 없으니까 {}없이 ;이걸로 닫아버려.
void stop() {
System.out.println("유닛이 멈췄습니다");
}
void attack() {
System.out.println("유닛이 " + ap + "의 공격을 합니다");
}
}
// SCV
class SCV extends Unit{
// abstract클래스를 상속받은 하위 클래스들 --> abstract 메서드를 무조건! 재정의 해줘야한다.
SCV(){
this.hp = 40;
this.ap = 5;
this.speed = 1;
}
void move() {
// 오버라이딩 --> 움직이긴 움직이는데, 각 유닛마다 움직이는 모습이 다르겠찌
System.out.println("SCV가 자신만의 방식으로 " + speed + "의 속도로 움직입니다");
}
}
// Marine
class Marine extends Unit{
Marine(){
this.hp = 40;
this.ap = 5;
this.speed = 2;
}
void move() { // 오버라이딩
System.out.println("Marine이 자신만의 방식으로 " + speed + "의 속도로 움직입니다");
}
}
// Tank
class Tank extends Unit{
Tank(){
this.hp = 150;
this.ap = 20;
this.speed = 3;
}
void move() { // 오버라이딩
System.out.println("Tank가 자신만의 방식으로 " + speed + "의 속도로 움직입니다");
}
}
// 내가 알던 방식
SCV s1 = new SCV();
SCV s2 = new SCV();
Marine m1 = new Marine();
Tank t1 = new Tank();
// test) 다른 데이터로 동일한 알고리즘 구현 가능
// s1.move();
// m1.move();
// t1.move();
// 이제는 다형성으로...
// 1. 부대지정
// SCV[] arr = new SCV[12]; ---> 이렇게히면 SCV만 다룰 수 있는 배열임
Unit[] arr = new Unit[12]; // 문법적으로 Unit을 담을 수 있는 배열
arr[0] = new SCV(); // 다형성으로 -> 하위 클래스를 담을 수 있는 배열이됐지.
arr[1] = new SCV();
arr[2] = new Marine();
arr[3] = new SCV();
arr[4] = new Marine();
arr[5] = new Tank();
arr[6] = new SCV();
arr[7] = new Tank();
arr[8] = new SCV();
arr[9] = new Marine();
arr[10] = new Tank();
arr[11] = new Marine();
// 2. 부대이동
for(Unit x : arr) { // 모든 unit들이 반복문들 돌면서 움직이겠지 (그게 SCV인지 Tank인지는 몰라)
x.move(); // --> 오버라이딩을 하면 어떤유닛이 어떻게 움직이는지 알 수 있다.
} // --> 출력결과 : if문이 없는데 코드가 분기되어 나오고있다!★★★
// ---> move가 abstract로 정의되니까 연두색으로 변했넹 ㅎ.ㅎ
// 3. 부대멈춤 --> 모든 유닛이 한순간에 똑같이 멈추면 되니까 굳이 오버라이딩을 안해도 되지.
// 4. 부대공격 --> 각기 다른 방식으로 공격해야하니까 오버라이딩 해야되지! (이건그냥 구현안할게...)
'JAVA > DAY 15 _ 23.09.06' 카테고리의 다른 글
Interface review (0) | 2023.09.14 |
---|---|
interface 활용ex - self (0) | 2023.09.14 |
Overiding (0) | 2023.09.13 |
상속_array활용3 (0) | 2023.09.13 |
상속_array활용2 (0) | 2023.09.12 |