[해결] 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 ```
``` 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 를 가지는 생성자가 선언되어져 있기 때문에 에러가 발생하지 않는것 입니다.
# 레퍼런스 변수의 초기화 String, int 등의 초기화는 아래와 같았습니다. ``` String name = ""; int price = 0; ``` 레퍼런스 변수만 생성시에는, null 값으로 초기화합니다. ``` Hero attacker = null; Hero defender = null; ``` null은 "아무것도 가리키지 않는 상태"를 의미 합니다. ## PS. 아래와 같이 초기화 할 수도 있겠으나, 사용하지 않는 객체이기에, 처음부터 만들지 않는 것이 좋습니다. ``` Hero attacker = new Hero("", 0); ```