본문 바로가기

프로그래밍/JAVA

생성자를 포함하는 클래스의 정의

난 정말 JAVA를 공부한 적이 없다구요(윤성우 저, 오렌지미디어)에서 발췌한 문제(202p 문제 7-1)


   다음 조건을 만족하는 클래스를 정의해보자

      1. 어린이가 소유하고 있는 구슬의 개수 정보를 담을 수 있다. 

      2. 놀이를 통한 구슬의 주고받음을 표현하는 메소드가 존재한다.

      3. 어린이의 현재 보유자산(구슬의 수)을 출력하는 메서드가 존재한다.


  2번 조건은 두 아이가 구슬치기를 하는 과정에서 구슬의 잃고 얻음을 의미하는 것이다. 위의 조건을 만족하는 클래스를 정의하였다면, 다음 조건을 만족하는 인스턴스를 각각 생성하자.

     1. 어린이 1의 보유자산 : 구슬 15개

     2. 어린이 2의 보유자산 : 구슬 9개


  인스턴스의 생성이 완료되면 다음의 상황을 main 메서드 내에서 시뮬레이션 한다.

      1차 게임에서 어린이1은 어린이 2의 구슬 2개를 획득한다.

      2차 게임에서 어린이2는 어린이 1의 구슬 7개를 획득한다.


  마지막으로 각각의 어린이가 보유하고 있는 구슬의 수를 출력하면서 프로그램을 종료한다. 



<나의 쓰레기같은 코드>

 1시간 30분 정도 걸렸는데 완벽한 답은 아니다.

public class test {

public static void main(String[] args){

Player player1 = new Player("A", 15);
Player player2 = new Player("B", 9);
Play play = new Play();

System.out.println("1차 게임");
play.getMarble(player1, 2);
play.looseMarble(player2, 2);

System.out.println("2차 게임");
play.getMarble(player2, 7);
play.looseMarble(player1, 7);

System.out.println("Player A의 구슬 보유 현황 : " + player1.numOfmyBeed);
System.out.println("Player B의 구슬 보유 현황 : " + player2.numOfmyBeed);


}
}

class Play{

Player name;

public int getMarble(Player name, int i){

name.numOfmyBeed+=i;
System.out.println("플레이어 " + name.name + "가 구슬을 " + i + "개 획득");
System.out.println( name.name + "의 구슬 갯수 : " + name.numOfmyBeed);
return name.numOfmyBeed;
}

public int looseMarble(Player name, int i){
name.numOfmyBeed-=i;
System.out.println("플레이어 " + name.name + "가 구슬을 " + i + "개 손실");
System.out.println( name.name + "의 구슬 갯수 : " + name.numOfmyBeed);
return name.numOfmyBeed;
}
}

class Player{

int numOfmyBeed;
String name;

public Player(String name, int numOfmyBeed){ // 생성자
this.name=name;
this.numOfmyBeed = numOfmyBeed;
}

public int state(int myBeed){
return numOfmyBeed;
}

}


  [1] 문제에서 '구슬의 잃고 얻음'을 표현하라고 했으니 행위를 담당하는 메서드는 2개가 필요하다.


  [2] 내가 쓴 코드의 경우, 중복이 많이 발생하고 비효율적이다.

      메인메서드에서 getMarble과 looseMarble을 두 번씩 써주고 있다.


<효율적인 코드>

public class test {

public static void main(String[] args){

Player player1 = new Player(15);
Player player2 = new Player(9);

System.out.println("게임 전 구슬의 보유 개수");
System.out.println("Player1******");
player1.myState();
System.out.println("Player2******");
player2.myState();

player1.getMarble(player2, 2); // 1차 게임, 어린이1이 어린이2의 구슬 2개 획득
player2.getMarble(player1, 7); // 2차 게임, 어린이2가 어린이2의 구슬 7개 획득

System.out.println("게임 후 구슬의 보유 개수");
System.out.println("Player1******");
player1.myState();
System.out.println("Player2******");
player2.myState();
}
}


class Player{

int numOfmyBead;

public Player(int numOfmyBead){ // 생성자
this.numOfmyBead = numOfmyBead;
}

public void getMarble(Player player, int getCount){
int getMarble=player.loseMarble(getCount);
numOfmyBead+=getCount;
}

public int loseMarble(int loseCount){
if(numOfmyBead<loseCount){
int value=numOfmyBead;
numOfmyBead=0;
return value;
}

numOfmyBead-=loseCount;
return loseCount;

}

public void myState(){
System.out.println("보유 구슬의 개수 : " + numOfmyBead); // 여기서는 void로 처리해줬음
}

}


[1] 가장 큰 차이점은 Player 클래스 하나로 구슬의 잃고 얻음을 모두 표현했다.


[2] 그리고 getMarble과 loseMarble이 유기적으로 연결되어 있다.

    즉, 내가 얻어온 만큼 상대방에게서 빼앗은 게 되므로 loseMarble의 매개변수로 getCount가 전달된다.


    단, 빼앗아 온 구슬의 개수(loseCount)가 현재 내가 가지고 있는 구슬의 개수(numOfmyBead)보다 크다면

    return값으로 0을 돌려준다.


[3] 메인메서드에 있는 player1.getMarble(player2, 2) player2.getMarble(player1, 7)를 떠올리는 게 

    가장 중요하다고 생각한다. 이 메서드는 "player1이 player2의 구슬을 2개 뺏어온다."는 코드를 작성해야

    한다.


'프로그래밍 > JAVA' 카테고리의 다른 글

캡슐화  (0) 2017.01.31
[JAVA} 쓰레드(Thread) 2편  (0) 2016.11.02
[JAVA] 쓰레드(Thread) 1편  (0) 2016.11.02
[JAVA TIP] 글자크기 바꾸기, 음영처리 바꾸기  (0) 2016.11.01
[JAVA] 제너릭(Generic)  (0) 2016.10.25