안녕하세요. 퀴즈 7번 질문있습니다.
430
작성한 질문수 3
안녕하세요!!
제가 코딩을 시작한지 일주일 조금 넘어서..기본 개념이 헷갈리는게 많아서 질문이 많습니다 ㅠㅠ
퀴즈 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("새우버거");
}어쩌면 번 뿐만 아니라 공통적으로 작업이 필요한 부분이 더 늘어난다면 후자의 방식으로 하는 것이 보다 효율적일 것 같아요 😊 궁금증 해결에 도움되길 바라겠습니다.
감사합니다.
자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?
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





