# 리얼 격투 게임 <질문 1> 그동안 객체를 만들어줄 경우에는 주로 new 를 사용해서 Hero h = new Hero(); 이런 방식으로 했던 것 같은데 ***Hero attacker, defender;*** 이렇게 하는 것도 객체를 형성하는 방식인가요? 어떤 차이점이 있고 어떤 근거로 이게 성립하는 건가요?? <질문 2> if( Math.random() < 0.5 ){ attacker = a; defender = b; } else { attacker = b; defender = a; } 여기 부분에서요 if( Math.random() < 0.5 ) { a = attacker; b = defender; } else { b = attacker; a = defender; } 이렇게 코드를 바꿔서 했는데 안되더군요. 왜 안되는 건가요?? #### CODE <a class='btn btn-default' href='/codes/42012'>Link</a> ``` public class HeroTest { public static void main(String[] args) { // 두 싸움꾼 객체 생성 Hero arthas = new Hero("아서스"); Hero leona = new Hero("레오나"); // 격투 시작 Hero.battle(arthas, leona); } } class Hero { // 필드 String name; int hp; // 생성자 public Hero(String str) { name = str; hp = 30; } // 메소드(인스턴스 메소드) public void punch(Hero enemy) { System.out.printf("[%s]의 펀치\n", name); enemy.hp -= 10; System.out.printf("\t%s: %d/30\n", enemy.name, enemy.hp); } // 메소드(클래스 메소드) public static void battle(Hero a, Hero b) { // 두 영웅 모두 체력이 남아있다면, 계속 싸움을 진행 while (a.hp > 0 && b.hp > 0) { // 1/2 확률로 공격/수비 결정 Hero attacker, defender; if (Math.random() < 0.5) { // Math.random은 0.0~0.9999..사이값을 무작위로 뽑는다 attacker = a; defender = b; } else { attacker = b; defender = a; } // 대상을 공격 attacker.punch(defender); } } } ``` #### INPUT ``` ``` #### OUPUT ``` [아서스]의 펀치 레오나: 20/30 [레오나]의 펀치 아서스: 20/30 [아서스]의 펀치 레오나: 10/30 [레오나]의 펀치 아서스: 10/30 [아서스]의 펀치 레오나: 0/30 ```
## 객체 생성 Hero attacker, defender; 이렇게 하는 것도 객체를 형성하는 방식인가요? - Hero attacker, defender; 이는 Hero 객체 타입의 변수를 선언한것 입니다. - 객체는 new 를 통해서만 생성할수 있습니다. 여기 부분에서요 if( Math.random() < 0.5 ) { a = attacker; b = defender; } else { b = attacker; a = defender; } 이렇게 코드를 바꿔서 했는데 안되더군요. 왜 안되는 건가요?? - 위의 질문과 같은 원리 입니다. - 객체를 생성할때 객체타입 변수 = new 객체(); 이런식으로 생성합니다. - 즉 , 변수가 new 를 사용하여 생성한 객체를 바라보는 것 입니다. - 따라서 attacker = a; - defender = b; 가 되어야 합니다.
## 레퍼런스 변수와 객체 생성된 객체와 이를 가리키는 변수는 다릅니다. 생성된 객체를 사용하려면 해당 객체를 가리키는 변수가 필요한데요. 이를 레퍼런스 변수라 합니다. ``` // h1, h2는 레퍼런스 변수 Hero h1 = new Hero("아서스"); Hero h2 = new Hero("레오나"); ``` 레퍼런스 변수는 객체에 연결돼있지 않을 수도 있습니다. ``` Hero attacker = null; Hero defender = null; ``` 미리 만들어 놓고, 필요 객체를 연결할 수도 있죠. ``` attacker = h1; defender = h2; ``` 자세한 내용은 "자바 레퍼런스 변수와 객체" 정도로 구글링해보세요.