JAVA_상속_추상 클래스 (Abstract Class)

JW__1.7·2022년 8월 10일
0

JAVA 공부일지

목록 보기
16/30

추상 메소드 (Abstract Method)

  • 선언되어 있으나, 본문이 없는 메소드
  • 호출용으로 사용되는 메소드
  • 본문이 없어서 중괄호 { } 자체를 없애고, 세미콜론;을 추가
  • public abstract

추상 클래스 (Abstract Class)

  • 추상 메소드가 1개 이상 존재하는 클래스
  • 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());
	}
}

Quiz 6

탱크 : 에너지 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

0개의 댓글