[자바] 좌표가 변화하는 프로그램 작성

오늘·2021년 3월 10일
0

문제풀기

목록 보기
15/24

요구사항

  • (출력내용)
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 병을 내렸습니다

어떤 순서로 만들어야 할지 생각해보기

  1. 문제에서 공통 부분 찾기
    int x,y / void move() / void stop()

  2. 찾은 공통 부분으로 부모 클래스가 될 Unit 만들자
    2-1) 좌표 받을 x, y를 필드값 지정
    2-2) 자세히 보니 void move() 메소드 부분이
    부품마다 움직이는 크기가 달라야 함
    -> 그럼 부모에서는 기본 부품으로 만들어 놓고, 자식 클래스에서 오버라이딩하여 사용해야겠다.

  3. 각자 필요한 부분이 있는 자식 클래스 만들기


공통부분이 있는 Unit 작성

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;
	}	
}

Unit을 상속받는 Marine의 클래스

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");
	}
}

Unit을 상속받는 Tank 클래스

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");
	}
}

Unit을 상속받는 Dropship 클래스

다른 클래스에서 변경된 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");
	}
}

출력하는 main 메소드

순서대로 객체 생성 후 확인

-객체 변수명.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("------------------------------------------------------------------");
	}
}

실행결과

0개의 댓글