# 리얼 격투 게임
<질문 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
```
goodlife1359님의 답변
## 객체 생성
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; 가 되어야 합니다.
sehongpark님의 답변
## 레퍼런스 변수와 객체
생성된 객체와 이를 가리키는 변수는 다릅니다.
생성된 객체를 사용하려면 해당 객체를 가리키는 변수가 필요한데요. 이를 레퍼런스 변수라 합니다.
```
// h1, h2는 레퍼런스 변수
Hero h1 = new Hero("아서스");
Hero h2 = new Hero("레오나");
```
레퍼런스 변수는 객체에 연결돼있지 않을 수도 있습니다.
```
Hero attacker = null;
Hero defender = null;
```
미리 만들어 놓고, 필요 객체를 연결할 수도 있죠.
```
attacker = h1;
defender = h2;
```
자세한 내용은 "자바 레퍼런스 변수와 객체" 정도로 구글링해보세요.