Marine 위치 : 10 , 20
Marine 위치 이동 : 20 , 10
Marine 현재 위치에서 정지
Marine 은 스팀팩을 사용합니다
Tank 위치 : 100 , 200
Tank 위치 이동 : 50 , 250
Tank 현재 위치에서 정지
Tank가 공격모드를 전환합니다
Dropship 위치 : 1000 , 2000
Dropship 위치 이동 : 900 , 1500
Dropship 현재 위치에서 정지
Dropship, Marine의 위치 (20 , 10) 에서 Marine을 태웠습니다
Dropship, Tank의 위치 (50 , 250) 에서 Tank 병을 내렸습니다
문제에서 공통 부분 찾기
int x,y / void move() / void stop()
찾은 공통 부분으로 부모 클래스가 될 Unit 만들자
2-1) 좌표 받을 x, y를 필드값 지정
2-2) 자세히 보니 void move() 메소드
부분이
부품마다 움직이는 크기가 달라야 함
-> 그럼 부모에서는 기본 부품으로 만들어 놓고, 자식 클래스에서 오버라이딩하여 사용해야겠다.
각자 필요한 부분이 있는 자식 클래스 만들기
public class Unit {
// 위치 좌표 받는 필드 값
int x;
int y;
// 어떤 클래스인지 받을 필드 값------------------
String a;
// 필요 메소드 작성-----------------------------
void move(int x, int y) {
this.x = x;
this.y = y;
}
void stop(String a) {
// 자식 클래스에서 값을 넘겨줄 것
System.out.println(a + " 현재 위치에서 정지");
}
// Getter Setter 로 받아보자-----------------
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
public class Marine extends Unit {
// 스팀 팩을 사용한다는 걸 출력하는 메소드-------------------------------------
void stimPack() {
System.out.println("Marine 은 스팀팩을 사용합니다");
}
// 부모 메소드를 오버라이딩 할 메소드----------------------------------------
@Override
void move(int x, int y) {
// super로 부모에게 값 넘겨주기
super.x = x + 10;
super.y = y - 10;
// Marine의 현재 위치가 출력되도록
System.out.println("Marine 위치 이동 : " + super.x + " , "+ super.y);
}
// 부모 메소드에게 값 넘겨주는 메소드----------------------------------------
// 부모 클래스에도 stop(String a)라는 메소드가 있기는 하지만
// 이건 stop() 으로 매개 값이 없어 오버라이딩이 아니다
// 그냥 Marine의 stop() 메소드일 뿐
void stop() {
// 부모의 stop(String a)로 값을 넘겨주기
super.stop("Marine");
}
}
public class Tank extends Unit {
void changeMode() {
System.out.println("Tank가 공격모드를 전환합니다");
}
@Override
void move(int x, int y) {
super.x = x - 50;
super.y = y + 50;
System.out.println("Tank 위치 이동 : " + super.x + " , "+ super.y);
}
void stop() {
super.stop("Tank");
}
}
다른 클래스에서 변경된 x, y의 위치를 받기 위해 load(), unload() 부분 작성
public class Dropship extends Unit {
// Dropship에서 Marine의 현재 위치를 출력할 수 있게끔 하는 메소드
// 실행 main에서 값을 받아오도록 작성
void load(int x, int y) {
Marine mar = new Marine();
System.out.println("Dropship, Marine의 위치 (" + x + "," + y + ") 에서 Marine을 태웠습니다");
}
// Dropship에서 Tank의 현재 위치를 출력할 수 있게끔 하는 메소드
// 실행 main에서 값을 받아오도록 작성
void unload(int x, int y) {
Tank ta = new Tank();
System.out.println("Dropship, Tank의 위치 (" + x + "," + y + ") 에서 Tank 병을 내렸습니다");
}
@Override
void move(int x, int y) {
super.x = x - 100;
super.y = y - 500;
System.out.println("Dropship 위치 이동 : " + super.x + " , "+ super.y);
}
void stop() {
super.stop("Dropship");
}
}
순서대로 객체 생성 후 확인
-객체 변수명.set() 에 넣은 값에 따라 출력되는 값 확인 가능
-변수값.move() 메소드 실행 횟수에 따라 계속 값이 변하는 것을 확인 가능
ex. mar.move(mar.getX(), mar.getY());
-다른 클래스에서 저장된 값 출력 확인
public class GameEx {
public static void main(String[] args) {
// Marine 위치 : 10, 20
Marine mar = new Marine();
mar.setX(10);
mar.setY(20);
System.out.println("Marine 위치 : " + mar.getX() + " , " + mar.getY());
// x좌표는 +10 , y좌표는 -10으로 변한다
mar.move(mar.getX(), mar.getY());
mar.move(mar.getX(), mar.getY());
mar.move(mar.getX(), mar.getY());
// 현재 위치 정지
mar.stop();
mar.stimPack();
System.out.println("------------------------------------------------------------------");
// Tank의 위치 : 100, 200
Tank ta = new Tank();
ta.setX(100);
ta.setY(200);
System.out.println("Tank 위치 : " + ta.getX() + " , " + ta.getY());
// x좌표는 -50 , y좌표는 +50으로 변한다
ta.move(ta.getX(), ta.getY());
ta.move(ta.getX(), ta.getY());
// 현재 위치 정지
ta.stop();
ta.changeMode();
System.out.println("------------------------------------------------------------------");
// Dropship의 위치 : 1000, 2000
Dropship drs = new Dropship();
drs.setX(1000);
drs.setY(2000);
System.out.println("Dropship 위치 : " + drs.getX() + " , " + drs.getY());
// x좌표는 -100 , y좌표는 -500으로 변한다
drs.move(drs.getX(), drs.getY());
// 현재 위치 정지
drs.stop();
// 다른 클래스에서 저장된 x, y 좌표 값을 받아 출력하기
drs.load(mar.getX(), mar.getY());
drs.unload(ta.getX(), ta.getY());
System.out.println("------------------------------------------------------------------");
}
}