본문 바로가기

JAVA/DAY 15 _ 23.09.06

Abstract Class_ 스타ex활용

// 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