{ }
자체를 없애고, 세미콜론;
을 추가public abstract
public abstract class
반드시
추상 메소드를 모두
오버라이드 해야 한다.동물
커피
도형
음식
...package ex01_abstract;
// 클래스 앞에 abstract 키워드를 붙여야 함
public abstract class Shape {
private String type;
public Shape(String type) {
super();
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
// Shape을 상속 받는 객체들이 호출할 때 사용하는 메소드
// 사용하지 않는다. → 추상 메소드로 바꿔준다. (본문이 없는 메소드)
public abstract double getArea();
}
package ex01_abstract;
public class Circle extends Shape {
private double radius;
public Circle(String type, double radius) {
super(type);
this.radius = radius;
}
// Shape 클래스는 추상 클래스이므로,
// 반드시 double getArea() 메소드를 오버라이드 해야 함
@Override
public double getArea() {
return Math.PI * Math.pow(radius, 2);
}
}
package ex01_abstract;
public class Main {
public static void main(String[] args) {
// Shape 클래스 타입의 객체는 존재할 수 없는 객체이다.
// abstract 처리해서 객체의 생성을 막을 수 있다.
// 추상 클래스 객체는 못 만듬
// Shape s1 = new Shape("도형");
// System.out.println(s1.getType());
// System.out.println(s1.getArea());
Shape s2 = new Circle("원", 1);
System.out.println(s2.getType());
System.out.println(s2.getArea());
}
}
탱크 : 에너지 100, 공격력 10
마린 : 에너지 50, 공격력 5
한 대씩 주고 받고, 두 유닛 모두 살아 있으면 계속 싸움
package quiz06_game;
// 추상 클래스
public abstract class GameUnit {
private String name;
private int energy;
private int power;
private boolean isAlive; // boolean alive;도 동일한 getter/setter가 생성
public GameUnit(String name, int energy, int power) {
this.name = name;
this.energy = energy > 0 ? energy : 0;
this.power = power;
this.isAlive = energy > 0;
}
public void info() {
System.out.println(name + " : 에너지 " + energy + ", 공격력 " + power);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getEnergy() {
return energy;
}
public void setEnergy(int energy) {
this.energy = energy;
}
public int getPower() {
return power;
}
public void setPower(int power) {
this.power = power;
}
// boolean alive로 해도 동일 (위에서 말한 내용이다.)
public boolean isAlive() {
return isAlive;
}
public void setAlive(boolean isAlive) {
this.isAlive = isAlive;
}
// 추상 메소드
public abstract void attack(GameUnit unit);
}
package quiz06_game;
public class Tank extends GameUnit {
public Tank(String name) {
super(name, 100, 10);
}
@Override
public void attack(GameUnit unit) {
// 내 에너지 : getEnergy(), this.getEnergy()
// 내 공격력 : getPower(), this.getPower()
// 내 이름 : getName(), this.getNamte()
// 상대 에너지 : unit.getEnergy()
// 상대 공격력 : unit.getPower()
// 상대 이름 : unit.getName()
// 10% 확률로 KO 시킬 수 있다.
if(Math.random() < 0.1) {
unit.setEnergy(0); // 읽는건 get, 쓰는건 set
unit.setAlive(false);
System.out.println(unit.getName() + "를 한 방에 죽였다.");
} else {
int unitEnergy = unit.getEnergy() - getPower() < 0 ? 0 : unit.getEnergy() - getPower();
unit.setEnergy(unitEnergy);
unit.setAlive(unitEnergy > 0);
System.out.println(unit.getName() + "의 남은 에너지 " + unit.getEnergy());
}
}
}
package quiz06_game;
public class Marine extends GameUnit {
public Marine(String name) {
super(name, 50, 5);
}
@Override
public void attack(GameUnit unit) {
// 내 에너지 : getEnergy(), this.getEnergy()
// 내 공격력 : getPower(), this.getPower()
// 내 이름 : getName(), this.getNamte()
// 상대 에너지 : unit.getEnergy()
// 상대 공격력 : unit.getPower()
// 상대 이름 : unit.getName()
// 30% 확률로 KO 시킬 수 있다.
if(Math.random() < 0.3) {
unit.setEnergy(0); // 읽는건 get, 쓰는건 set
unit.setAlive(false);
System.out.println(unit.getName() + "를 한 방에 죽였다.");
} else {
int unitEnergy = unit.getEnergy() - getPower() < 0 ? 0 : unit.getEnergy() - getPower();
unit.setEnergy(unitEnergy);
unit.setAlive(unitEnergy > 0);
System.out.println(unit.getName() + "의 남은 에너지 " + unit.getEnergy());
}
}
}
package quiz06_game;
public class Main {
public static void main(String[] args) {
// 슈퍼 // 서브 = 상속관계
GameUnit unit1 = new Tank("탱크");
GameUnit unit2 = new Marine("마린");
unit1.info(); // 탱크 : 에너지 100, 공격력 10
unit2.info(); // 마린 : 에너지 50, 공격력 5
System.out.println("========= 전투 시작 =========");
// 공격 차례 정하기
boolean myTurn = Math.random() < 0.5;
// 한 대씩 주고 받기
// 두 유닛이 모두 살아있으면 계속 싸움
// while(unit1.getEnergy() > 0 && unit2.getEnergy() > 0) 동일하게
while(unit1.isAlive() && unit2.isAlive()) {
if(myTurn) {
System.out.println(unit1.getName() + "의 공격!");
unit1.attack(unit2);
// unit1이 unit2를 공격한다. (탱크는 10% 확률로 상대를 한번에 죽인다.)
} else {
System.out.println(unit2.getName() + "의 공격!");
unit2.attack(unit1);
// unit2이 unit1를 공격한다. (마린는 30% 확률로 상대를 한번에 죽인다.)
}
myTurn = !myTurn; // 공격 차례를 바꿔준다.
}
System.out.println("========= 전투 종료 =========");
// 승자 확인
if(unit1.isAlive()) {
System.out.println(unit1.getName() + "의 승리! 남은 에너지 " + unit1.getEnergy());
} else {
System.out.println(unit2.getName() + "의 승리! 남은 에너지 " + unit2.getEnergy());
}
}
}
반환값
탱크 : 에너지 100, 공격력 10
마린 : 에너지 50, 공격력 5
========= 전투 시작 =========
마린의 공격!
탱크의 남은 에너지 95
탱크의 공격!
마린의 남은 에너지 40
마린의 공격!
탱크의 남은 에너지 90
탱크의 공격!
마린를 한 방에 죽였다.
========= 전투 종료 =========
탱크의 승리! 남은 에너지 90