Week2 기술블로그

나현·2026년 9월 12일

java2

목록 보기
1/7

실습 1. Battle 리팩토링

1.

Main 클래스에서의 무기들(청룡언월도, 쌍고검, 장팔사모, 청강검) 값 초기화

public class Main {

	public static void main(String[] args) throws InterruptedException {

		청룡언월도 청룡 = new 청룡언월도(50,90);
		관우 운장 = new 관우("관우", 900, 50, 10, "관우.png", "관우2.png", 청룡);

		쌍고검 쌍고 = new 쌍고검(30,30);
		유비 현덕 = new 유비("유비", 500, 5, 40, "유비1.png", "유비2.png", 쌍고);

		장팔사모 장팔 = new 장팔사모(45,80);
		장비 익덕 = new 장비("장비", 700, 40, 15, "장비1", "장비2.png", 장팔);

		청강검 청강 = new 청강검(35,40);
		조조 맹덕 = new 조조("조조", 600, 15, 35, "조조.png", "조조2.png", 청강);

		// 무기 플레이어무기 = 운장.전용무기;
		// int 무기필요mp = 청룡.필요mp;

	System.out.println(운장.전용무기.get필요mp());

	}

}

Win 클래스에서의 무기들(청룡언월도, 쌍고검, 장팔사모, 청강검) 값 초기화

public class Win extends JFrame {

	private JPanel contentPane;
	private JTextArea ta;

	/**
	 * Launch the application.
	 */

	청룡언월도 청룡 = new 청룡언월도(50, 90);
	관우 운장 = new 관우("관우", 500, 50, 10, "관우.png", "관우2.png", 청룡);

	쌍고검 쌍고 = new 쌍고검(30, 30);
	유비 현덕 = new 유비("유비", 900, 5, 40, "유비1.png", "유비2.png", 쌍고);

	장팔사모 장팔 = new 장팔사모(45, 80);
	장비 익덕 = new 장비("장비", 700, 40, 15, "장비1.png", "장비2.png", 장팔);

	청강검 청강 = new 청강검(35, 40);
	조조 맹덕 = new 조조("조조", 600, 15, 35, "조조.png", "조조2.png", 청강);

두 개의 클래스에서 같은 무기들이 두번씩 반복되어 정의되어 있으므로 데이터를 한 곳으로 몰아 통일하는 것이 좋아보임.

2.

2번 변경 전

Win 클래스 내에서 플레이어 생성


		if (Math.random() * 10 < 3) {
			플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 운장.getImgFile1())));
			플레이어생성 = 0;
			플레이어 = 운장;
		} else if (Math.random() * 10 >= 8) {
			플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 현덕.getImgFile1())));
			플레이어생성 = 1;
			플레이어 = 현덕;
		} else if (Math.random() * 10 >= 3 && Math.random() <= 4) {
			플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 맹덕.getImgFile1())));
			플레이어생성 = 2;
			플레이어 = 맹덕;
		} else {
			플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 익덕.getImgFile1())));
			플레이어생성 = 3;
			플레이어 = 익덕;
		}

Win 클래스 내에서상대 생성

		if (Math.random() * 10 < 2 && 플레이어생성 != 0) {
			상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 운장.getImgFile1())));
			상대 = 운장;
		} else if (Math.random() * 10 >= 8 && 플레이어생성 != 1) {
			상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 현덕.getImgFile1())));
			상대 = 현덕;
		} else if (Math.random() * 10 >= 2 && Math.random() <= 4 && 플레이어생성 != 2) {
			상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 맹덕.getImgFile1())));
			상대 = 맹덕;
		} else if (플레이어생성 != 3) {
			상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 익덕.getImgFile1())));
			상대 = 익덕;

캐릭터 랜덤 생성을 위해서 Math.random을 쓴건 알겠으나, Math.random을 if문 마다 돌리면 값이 일정하게 정해져 있지 않기 때문에 캐릭터 랜덤 생성에 문제가 생길 수 있어 보임. 변수를 플레이어 자신과 상대방으로 하나씩 만들어서 랜덤 출력값을 넣어놓고 그 값에 대한 if문으로 변경해야할 듯.

2번 변경 후

Win 클래스 내에서 플레이어 생성

int random1 = (int)(Math.random()*10);
		
		if (random1 < 3) {
			플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 운장.getImgFile1())));
			플레이어생성 = 0;
			플레이어 = 운장;
		} else if (random1 >= 8) {
			플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 현덕.getImgFile1())));
			플레이어생성 = 1;
			플레이어 = 현덕;
		} else if (random1 >= 3 && random1 <= 4) {
			플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 맹덕.getImgFile1())));
			플레이어생성 = 2;
			플레이어 = 맹덕;
		} else {
			플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 익덕.getImgFile1())));
			플레이어생성 = 3;
			플레이어 = 익덕;
		}

Win 클래스 내에서 상대 생성

int random2 = (int)(Math.random()*10);
		if (random2 < 2 && 플레이어생성 != 0) {
			상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 운장.getImgFile1())));
			상대 = 운장;
		} else if (random2 >= 8 && 플레이어생성 != 1) {
			상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 현덕.getImgFile1())));
			상대 = 현덕;
		} else if (random2 >= 2 && random2 <= 4 && 플레이어생성 != 2) {
			상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 맹덕.getImgFile1())));
			상대 = 맹덕;
		} else if (플레이어생성 != 3) {
			상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 익덕.getImgFile1())));
			상대 = 익덕;를 입력하세요

3.

public interface Defend {

    public void 방어하기();

}
public class 쌍고검 extends 무기 implements Defend {

	public boolean 방어완료;

	@Override
	public void 방어하기() {

		int 방어확률 = (int) (Math.random() * 100);
		if (방어확률 < 20) {
			this.방어완료 = true;
		} else
			this.방어완료 = false;

	}
public class 청강검 extends 무기 implements Defend {

	public boolean 방어완료;

	@Override
	public void 방어하기() {

		int 방어확률 = (int) (Math.random() * 100);
		if (방어확률 < 15) {
			this.방어완료 = true;
		} else
			this.방어완료 = false;

	}

쌍고검과 청강검에서 Defend의 기능이 있어서 interface까지 만들어서 오버라이드를 하였지만, 막상 Defend 인터페이스에는 아무런 바디가 구현되어 있지 않아(추상클래스?), 반복을 줄였다거나 통일감을 만들었다거나 하는 장점이 없어보임.
인터페이스를 더 활용하기 위해 Defend에 방어확률 숫자 인자를 통해 if문을 안에서 방어를 성공했는지 여부를 알려주는 바디를 구현함으로써
청강검과 쌍고검에서는 상속을 통해 숫자 인자만 넣으면 성공확률을 알 수 있게 한다면 코드가 훨씬 간결해질 수 있을듯.

실습 2. lab 05 코드실습

상위 인터페이스






여기서 MyRemoteControl에서 RemoteRole을 상속을 이미 했는데 굳이 오버라이드를 해야하는 이유?
1. 클래스를 상속했을 경우: 오버라이드 없이 상위클래스의 메서드를 사용할 수 있다.
2. 인터페이스를 구현할 경우: 말 그대로 '구현'하는 것이기 때문에 바디를 오버라이드를 통해 하위클래스에서 구현해야한다(추상메서드).
만약 인터페이스의 바디를 상위 인터페이스에서 이미 구현했다면?
이때에는 하위클래스에서 구현없이 default를 통해 바로 사용할 수 있다.

(RemoteRole은 내용이 비어있는 인터페이스(껍데기)이기 때문에, 이를 가져다 쓰는 MyRemoteControl은 반드시 오버라이드를 통해 그 빈 공간을 채워주어야 정상적으로 작동함.)

실습 3. 짱구



엄마 클래스에서 왜 핸드폰 핸드폰bag이 되는걸까?
핸드폰: 자료형
핸드폰bag: 변수

짱구클래스에서 짱구가 엄마가 뺏어간 핸드폰 다시 뺏는 코드 구현하기

수정 전

수정 전의 코드는 엄마의 핸드폰bag에 있는 핸드폰을 그저 짱구가 복사하였기에 뺏어간 후에도 엄마의 핸드폰bag에 핸드폰이 남아있는 문제 발생.
수정후

public void 핸드폰뺏기(엄마 엄) {
    if (엄.핸드폰압수bag != null) {
        this.phone = 엄.핸드폰압수bag;
        엄.핸드폰압수bag = null;   //추가된부분
        System.out.println("핸드폰 뺏기 성공!");
    }

엄마의 핸드폰bag을 null로 초기화함으로써 핸드폰이 2개가 되는 문제 해결.

0개의 댓글