작성
·
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("새우버거");
}
어쩌면 번 뿐만 아니라 공통적으로 작업이 필요한 부분이 더 늘어난다면 후자의 방식으로 하는 것이 보다 효율적일 것 같아요 😊 궁금증 해결에 도움되길 바라겠습니다.
감사합니다.
감사합니다!!