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

코딩초보님의 프로필 이미지
코딩초보

작성한 질문수

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

퀴즈 #7

안녕하세요. 퀴즈 7번 질문있습니다.

작성

·

374

·

수정됨

0

안녕하세요!!

제가 코딩을 시작한지 일주일 조금 넘어서..기본 개념이 헷갈리는게 많아서 질문이 많습니다 ㅠㅠ

 

퀴즈 7번에서 class HamBurger 만들고 생성자 만들때

public HamBurger(){
this("햄버거");}//매개변수가 없는 생성자와 

public HamBurger(String name){
this.name = name;}//매개변수 넣은 생성자 

이렇게 두 개 만드셨는데 그 이유가 잘 이해가 안 가서요,, this와 this()의 개념에 대해서는 어느정도 이해를 한 것 같은데 실제 코드를 짤 때 생성자를 하나가 아닌 두개 만드는 이유가 궁금합니다..! 생성자 하나로는 안되는걸까요?

 

나도 코딩 선생님 강의를 유튜브에서 처음 듣고 인프런으로 넘어왔는데 늘 좋은 강의 감사한 마음으로 듣고 있습니다. 질문이 많아도 이해해주세요ㅠㅠ

미리 감사합니다!

답변 1

1

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?

Hamburger 클래스에는 다음과 같이 2개의 생성자가 있습니다.

1. 기본 생성자

public HamBurger() {
    this("햄버거");
}

2. 매개변수를 받는 생성자

public HamBurger(String name) {
    this.name = name;
}

먼저 기본 생성자에서는 this() 를 이용하여 매개변수를 받는 생성자를 호출합니다. 그러면서 "햄버거" 라는 이름을 넘겨주므로 매개변수를 받는 받는 생성자 내에서는 this.name 이라는 변수에 "햄버거" 를 대입하게 되는 것이죠.

메인 메소드에서 객체를 만들 때 "햄버거"라는 이름이 자동으로 설정되게 하려면 이렇게 할 수 있어요.

HamBurger hamburger = new HamBurger(); // 기본 생성자

만약 이름이 "햄버거"가 아닌 "나만의 버거"라고 지어주고 싶다면 이렇게 할 수 있습니다.

HamBurger hamburger = new HamBurger("나만의 버거"); // 매개변수를 받는 생성자

그런데 우리 퀴즈에서는 종류별 버거 객체를 만들 때 이름을 따로 넘겨주지 않으므로 클래스 내에서 이름을 직접 설정해줘야하지요. 그러려면 기본 생성자를 이용해야겠네요.

사실 기본 생성자를 다음과 같이 만들면 의문이 생기지 않으셨을 것 같아요.

public HamBurger() {
    this.name = "햄버거";
}

그리고 이렇게 하게 되면 치즈버거나 새우버거에서도 생성자를 이런 식으로 만들어줘야겠네요.

class CheeseBurger extends HamBurger {
    public CheeseBurger() {
        // super("치즈버거");
        this.name = "치즈버거";
    }
}

class ShrimpBurger extends HamBurger{
    public ShrimpBurger() {
        // super("새우버거");
	this.name = "새우버거";
    }
}

이렇게 해도 문제는 없습니다. 어쩌면 코드 양이 더 줄어들 수도 있겠어요. 다만 저는 매개변수를 받는 생성자를 이용하여 name 변수를 설정하는 코드를 이미 HamBurger 에 정의하였으므로 이를 활용하기 위해 HamBurger 를 상속하는 클래스에서는 편리하게 super("버거 이름"); 를 이용하여 이름을 설정하도록 했으며, HamBurger 클래스 내에서는 this("햄버거"); 를 이용하여 역시 동일한 방법으로 HamBurger 클래스에 정의된 매개변수를 받는 생성자를 이용하도록 하였습니다.

코드를 다시 적어보면 이렇게 돼요.

// 햄버거 클래스
public HamBurger() {
    this("햄버거"); // 매개변수를 받는 생성자를 호출하면서 "햄버거" 전달
}

// 모든 클래스에서 이용하는 매개변수를 받는 생성자
public HamBurger(String name) {
    this.name = name;
}

// 치즈버거 클래스
public CheeseBurger() {
    super("치즈버거"); // 매개변수를 받는 생성자를 호출하면서 "치즈버거" 전달
}

// 새우버거 클래스
public ShrimpBurger() {
    super("새우버거"); // 매개변수를 받는 생성자를 호출하면서 "새우버거" 전달
}

그리고 앞서 설명드린 것처럼 각 클래스의 기본 생성자 내에서 이름을 설정하려면 이렇게 됩니다.

// 햄버거 클래스
public HamBurger() {
    this.name = "햄버거";
}

// 치즈버거 클래스
public CheeseBurger() {
    this.name = "치즈버거";
}

// 새우버거 클래스
public ShrimpBurger() {
    this.name = "새우버거";
}

그런데 만약에 각 버거에 번(Bun)이라는 새로운 값을 설정해야 하면 어떨까요?

클래스 내에 이렇게 새로운 변수를 정의해볼게요.

public String bun;

기본 값은 모두 "오리지널 번" 으로 설정한다고 해볼게요.

그러면 각 생성자에서 직접 이름을 설정하는 방식으로 했을 때는 이렇게 3군데를 직접 추가해야 할 겁니다.

// 햄버거 클래스
public HamBurger() {
    this.name = "햄버거";
    this.bun = "오리지널 번"; // 추가된 부분 #1
}

// 치즈버거 클래스
public CheeseBurger() {
    this.name = "치즈버거";
    this.bun = "오리지널 번"; // 추가된 부분 #2
}

// 새우버거 클래스
public ShrimpBurger() {
    this.name = "새우버거";
    this.bun = "오리지널 번"; // 추가된 부분 #3
}

하지만 매개변수를 받는 생성자를 이용하면 이렇게 딱 1군데만 추가하면 되지요.

// 햄버거 클래스
public HamBurger() {
    this("햄버거");
}

// 모든 클래스에서 이용하는 매개변수를 받는 생성자
public HamBurger(String name) {
    this.name = name;
    this.bun = "오리지널 번"; // 추가된 부분 #1
}

// 치즈버거 클래스
public CheeseBurger() {
    super("치즈버거");
}

// 새우버거 클래스
public ShrimpBurger() {
    super("새우버거");
}

어쩌면 번 뿐만 아니라 공통적으로 작업이 필요한 부분이 더 늘어난다면 후자의 방식으로 하는 것이 보다 효율적일 것 같아요 😊 궁금증 해결에 도움되길 바라겠습니다.
감사합니다.

코딩초보님의 프로필 이미지
코딩초보
질문자

감사합니다!!

코딩초보님의 프로필 이미지
코딩초보

작성한 질문수

질문하기