작성
·
221
·
수정됨
0
안녕하세요! 정말 감사한 마음으로 강의 수강 중인 대학생입니다
퀴즈 7번에 관해서 2가지 질문있습니다.
처음에 아래와 같이 System.out.println(this.name + "를 만듭니다. "); 를 cook 메소드에 넣지 않고 HamBurger 메소드에 넣어서 틀렸습니다. 이외에 모든 코드는 선생님것과 동일합니다
class HamBurger{
public String name;
HamBurger() { //생성자
this("햄버거");
System.out.println(this.name + "를 만듭니다. ");
}
HamBurger(String name) { //매개변수를 받는 생성자
this.name = name;
}
void cook(){
System.out.println("빵 사이에 들어가는 재료는?");
System.out.println("> 양상추 ");
System.out.println("+ 패티 ");
System.out.println("+ 피클 ");
}
}
왜 HamBurger()에 system.out.println(this.name + "를 만듭니다. ");를 작성하면 안되나요?
혹시 그 이유가 생성자와 void메소드는 반환값이 없다고 했는데요,
제가 작성한 HamBurger()는 System.out.println(this.name + "를 만듭니다. ");라는 반환값을 만든 것이기 때문인가요?
그러면 cook 메소드는 void가 있는데 값을 반환하는 것은 어찌된 것일까요.... 모르겠습니다 흑흑
2. public class Quiz07 에서 cook만 호출했기 때문에 Hamburger메소드에 작성한 System.out.println(this.name + "를 만듭니다. ");가 뜨면 안된다고 생각했는데
햄버거를 만듭니다.
주문하신 메뉴를 만듭니다.
-------------------
빵 사이에 들어가는 재료는?
> 양상추
+ 패티
+ 피클
...
"햄버거를 만듭니다" 가 for반복문이 실행되기도 전에 처음에 한번 떴습니다. 호출하지 않았는데 왜 출력된건가요??
도와주세요!!
답변 1
0
안녕하세요?
먼저 이 정도로 훌륭하게 퀴즈를 잘 풀어보셨다는 점에 대해 큰 격려의 박수를 드립니다 🙌
너무나 잘 해주셨어요 😍
궁금한 점에 대해 답변을 드려볼게요.
생성자는 클래스로부터 객체가 만들어질 때 자동으로 실행이 되는 부분입니다.
바로 이 부분인데요.
hamBurgers[0] = new HamBurger();
그래서 HamBurger 생성자 안에 println() 출력구문을 두게 되면 위 코드가 실행될 때 HamBurger() 에 의해서 매개변수를 받지 않는 기본 생성자가 호출되어 println() 의 내용도 출력되는 것입니다.
퀴즈에서는 각 버거를 만들 때 "~를 만듭니다." 문장에 출력되길 원했기 때문에 cook() { } 메소드에 위 문장이 들어가는 게 더 좋은 접근입니다.
어쩌면 매개변수를 받는 생성자에 출력구문을 넣어볼 수도 있을텐데요.
HamBurger(String name) { //매개변수를 받는 생성자
this.name = name;
System.out.println(this.name + "를 만듭니다. ");
}
이렇게 하게 되면 치즈버거나 새우버거 또한 super(name) 를 통해 위 생성자를 이용하게 되는데 이렇게 하는 경우라면 햄버거 객체를 하나 생성하고 cook() 메소드를 호출하고, 치즈버거 객체를 하나 생성하고 cook() 메소드를 호출하고, 이런 식으로 각각 생성과 호출을 반복해줘야 원하는 결과를 얻을 수 있습니다. 그러면 반복문을 활용할 수 없기 때문에 코드가 많이 길어지는 문제가 생길 수 있어요.
(각각 생성과 호출을 반복한 코드)
HamBurger[] hamBurgers = new HamBurger[3];
System.out.println("주문하신 메뉴를 만듭니다.");
System.out.println("-------------");
hamBurgers[0] = new HamBurger(); // 생성
hamBurgers[0].cook(); //호출
System.out.println("-------------");
hamBurgers[1] = new CheeseBurger(); // 생성
hamBurgers[1].cook(); // 호출
System.out.println("-------------");
hamBurgers[2] = new ShrimpBurger(); // 생성
hamBurgers[2].cook(); // 호출
System.out.println("-------------");
System.out.println("메뉴 준비가 완료되었습니다.");
또한 위처럼 생성과 호출을 반복하지 않으면 이렇게 한번에 모든 내용이 출력되어 원하는 결과를 얻을 수 없게 됩니다.
(실행결과)
햄버거를 만듭니다.
치즈버거를 만듭니다.
새우버거를 만듭니다.
주문하신 메뉴를 만듭니다.
-------------
... 생략 ...
질문주신 것처럼 반환값 존재 여부와는 관련이 없습니다. 다만 생성자의 호출 시점에 따른 문제에요. 객체 생성과 동시에 실행되어야 하는 구문이라면 생성자에 넣는 게 맞지만, 생성을 하고 나서 나중에 어딘가에서 실행되어야 하는 구문이라면 생성자에 넣지 않는 게 맞습니다.
그리고 반환형에 void 라고 적혀 있으면 반환값이 없는 메소드에요. cook 메소드 또한 void 로 정의되었으므로 별다른 값을 반환하지 않는다는 점 주의해주세요!
public void cook() {
...
}
궁금증 해결에 도움되길 바라겠습니다 😊
감사합니다.