inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

퀴즈 #7

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

430

코딩초보

작성한 질문수 3

0

안녕하세요!!

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

 

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

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

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

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

 

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

미리 감사합니다!

java 객체지향

답변 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("새우버거");
}

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

0

코딩초보

감사합니다!!

자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?

1

146

2

static이 뭐였는지 기억이 안나요 ㅜㅜ

0

119

2

Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의

0

70

1

사고력 키우는 법이 어떤게 있나요?

0

93

2

getter setter

0

103

2

섹션9. 66 메소드 오버로딩 시 질문이 있습니다.

0

80

1

안녕하세요 갑자기 프로그램 에러가 떠서 안되네요

0

76

2

변수 이름짓는법

0

114

2

intelli J 실행오류

0

115

2

혹시 이건 수학적 사고가 부족한 걸까요?

0

152

2

영상이 재생이 안됩니다.

0

167

3

이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.

0

117

2

응용이 어렵습니다.

0

206

2

IntelliJ가 보이지 않습니다.

0

186

3

JDK 버전 문의

0

129

2

BlackBox 파일 내에서 메소드 정의

0

136

1

동기화

0

121

2

Iterator 문의

0

105

1

코드 순서 문의

0

142

1

클래스 메소드

0

149

2

Quiz_05 관련 질문드립니다 !

0

118

2

다운로드가 안됩니다

0

165

2

다형성

0

120

2

HashMap

0

80

2