[해결] public에 대해 몰랐었음
[해결] 레퍼런스 변수 걍 셋팅하는 방법
① Hero attacker;
② Hero attacker = null;
[질문-1] public에 대한 질문 => 수업시간에 설명해주셔도 됩니다
[질문-2] Hero attacker, defender;
변수를 초기 셋팅할 때, 아래와 같이 하잖아요
String name = " ";
int price = 0;
그럼 Hero 타입의 변수를 기본 셋팅할 때, 아래와 같이 하면 될 거 같은데, 왜 안 될까요?
Hero attacker = new Hero(); => 에러 발생
Hero attacker; => 왜이것만 정상 작동할까요? (이렇게 쓰는 이유는 이해 ok)
# 리얼 격투 게임
#### CODE <a class='btn btn-default' href='/codes/23204'>Link</a>
```
public class main{
public static void main (String[] args) {
Hero Leona = new Hero ("레오나", 30);
Hero Arthus = new Hero ("아서스", 30);
Hero.battle(Leona, Arthus);
}
}
class Hero{
String name;
int hp;
//왜 public?
public Hero(String n, int h){
name = n;
hp = h;
}
//public 안 썼는데도 작동함. why?
static void battle(Hero L, Hero A){
while(L.hp > 0 && A.hp > 0){
Hero attacker, defender;
// Hero attacker = new Hero();
// Hero defender = new Hero();
// 걍 변수만 기본 셋팅하는 건데, 이렇게 하면 왜 안 되지?
if(Math.random() < 0.5){
attacker = L;
defender = A;
} else {
attacker = A;
defender = L;
}
//이거를 반복할 거임
attacker.punch(defender);
}
}
//public 안 썼는데도 작동함. why?
void punch(Hero d) {
System.out.printf("[%s]의 펀치\n", name);
d.hp -= 10;
System.out.printf(" %s: %d/30\n", d.name, d.hp);
}
}
```
#### INPUT
```
```
#### OUPUT
```
[레오나]의 펀치
아서스: 20/30
[레오나]의 펀치
아서스: 10/30
[아서스]의 펀치
레오나: 20/30
[레오나]의 펀치
아서스: 0/30
```
tkgksw님의 답변
```
Hero attacker = new Hero(); => 에러 발생
public Hero(String n, int h){
name = n;
hp = h;
}
```
에러가 발생하는 이유는 Hero클래스에 선언된 생성자는 name과 hp를 전달값으로 가지는 생성자입니다.
하지만 Hero attacker = new Hero(); 이때는 전달값이 없는 생성자가 호출되는데 현재 Hero클래스에 기본생성자가 선언되어져 있지 않습니다.
즉, Hero 클래스에는 name, hp를 전달값으로 가지는 생성자가 선언되어져 있는데 Hero attacker = new Hero(); 가 호출되는경우 Hero클래스에 기본생성자가 선언되어져 있지 않기때문에 에러가 발생합니다.
기본생성자를 사용하려면 Hero클래스에 기본생성자를 선언하고 생성자 안에서 name 과 hp 변수의 값을 직접 초기화 하는 방법이 있습니다.
Hero attacker; => 왜이것만 정상 작동할까요?
정상 작동하는 이유는 attacker멤버변수는 전달값으로 name 과 hp를 가지는 new Hero ("레오나", 30); 인스턴스를 참조하고 있습니다.
new Hero ("레오나", 30); 이부분이 실행되면 전달값으로 name과 hp를 가지는 생성자가 호출이 됩니다.
현재 Hero클래스에는 전달값으로 name과 hp 를 가지는 생성자가 선언되어져 있기 때문에 에러가 발생하지 않는것 입니다.
sehongpark님의 답변
# 레퍼런스 변수의 초기화
String, int 등의 초기화는 아래와 같았습니다.
```
String name = "";
int price = 0;
```
레퍼런스 변수만 생성시에는, null 값으로 초기화합니다.
```
Hero attacker = null;
Hero defender = null;
```
null은 "아무것도 가리키지 않는 상태"를 의미 합니다.
## PS.
아래와 같이 초기화 할 수도 있겠으나, 사용하지 않는 객체이기에, 처음부터 만들지 않는 것이 좋습니다.
```
Hero attacker = new Hero("", 0);
```