인프런 커뮤니티 질문&답변

yyw_0404님의 프로필 이미지
yyw_0404

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

퀴즈 7번에 관하여 질문있습니다!

작성

·

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("+ 피클 ");
	}
	
}
  1. 왜 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() { 
    ... 
}

궁금증 해결에 도움되길 바라겠습니다 😊
감사합니다.

yyw_0404님의 프로필 이미지
yyw_0404

작성한 질문수

질문하기