본문 바로가기
Java/기본 개념 및 클래스

[Java] 40. 메서드 오버로딩, 상속 응용: 유닛에 마린, 질럿, 저글링 상속시키기

글: Song hyun 2024. 4. 23.
728x90
반응형

[Java] 40. 메서드 오버로딩, 상속 응용: 

유닛에 마린, 질럿, 저글링 상속시키기

 

*이전 글: https://whatsthatsound.tistory.com/61

 

[Java] 27. Java로 스타크래프트 모델링하기

[Java] 27. Java로 스타크래프트 모델링하기 모델링 과정 1. 질럿, 저글링, 마린 클래스 생성하기 (1) 클래스마다 사용자 정의 생성자 만들기 (2) 클래스 별로 공격할 때/공격 받았을 때의 메서드 만들

whatsthatsound.tistory.com


이전에 작성한 스타크래프트 모델링의 소스코드를, 상속을 이용해 더욱 간단하게 만들어보자.

 

1. 상위 클래스인 Unit을 생성한다. 

-> 이 때, Unit의 변수는 질럿/마린/저글링 클래스가 공통적으로 지니는 name/power/hp가 된다.

 

2. 중복되는 메서드를 찾는다.

->이전의 코드를 살펴본다면...

 

getter/setter 메서드

beAttacked(공격을 당했을 때의 메서드)

attack(다른 캐릭터를 공격할 때의 메서드)

showInfo(상태창 조회 메서드) 등의 메서드들이 세 클래스 파일 내부에서 중복된다는 사실을 알 수 있다.

->해당 메서드들을 상위 클래스인 Unit에서 선언하고, Unit을 세 클래스들이 상속받는다면,

더욱 간단하게 코드를 작성할 수 있다.

 


package starcraft.ver03;
/**
 * 접근 제어 지시자
 * public
 * protected
 * default
 * private
 */
public class Unit {
	
	protected String name;
	protected int power;
	protected int hp;

	public Unit(String name) {
		this.name=name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPower() {
		return power;
	}

	public void setPower(int power) {
		this.power = power;
	}

	public int getHp() {
		return hp;
	}

	public void setHp(int hp) {
		this.hp = hp;
	}
	
	public void showInfo() {
		System.out.println("=====상태창=====");
		System.out.println(" 이름: "+this.name);
		System.out.println(" 공격력: "+this.power);
		System.out.println(" 생명력: "+this.hp);
	}
	
	public void beAttacked(int power) {
		// 방어적 코드 작성
		if (hp <= 0) {
			System.out.println("[" + this.name + "]은 이미 사망했습니다.");
			hp = 0;
			return;
		}
		hp -= power;
	}
	
	// 질럿이 저글링을 공격합니다.
	public void attack(Zergling z) {
		System.out.println("[" + this.name + "]이 [" + z.getName() + "]을 공격합니다.");
		z.beAttacked(this.power); // 질럿의 공격력을 beAttacked 메서드에 대입
	}

	// 질럿이 마린을 공격합니다.
	public void attack(Marine m) {
		System.out.println("[" + this.name + "]이 [" + m.getName() + "]을 공격합니다.");
		m.beAttacked(this.power);
	}
	
	// 질럿이 마린을 공격합니다.
		public void attack(Zealot z) {
			System.out.println("[" + this.name + "]이 [" + z.getName() + "]을 공격합니다.");
			z.beAttacked(this.power);
		}

	
}

 

 

package starcraft.ver03;

public class Marine extends Unit {

	public Marine(String name) {
		super(name);
		super.name=name;
		super.power=power;
		super.hp=70;
	}
	
}

 

package starcraft.ver03;

public class StarCraftTest1 {
	public static void main(String[] args) {
		
		Zealot zealot=new Zealot("잠자던 질럿");
		Marine marine=new Marine("밥먹던 마린");
		Zergling zergling=new Zergling("야근하는 저글링");
		
		zealot.showInfo();
		marine.showInfo();
		zergling.showInfo();
		
		
		System.out.println("-----------------");
		zergling.attack(marine);
		marine.showInfo();
		marine.attack(zealot);
		zealot.showInfo();
		
	} // end of main

} // end of class
728x90
반응형