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

Ambition님의 프로필 이미지
Ambition

작성한 질문수

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

퀴즈 #7

나도코딩님! 퀴즈 7번을 다음과 같이 풀어봤는데, 피드백 부탁드립니다 😄

작성

·

377

·

수정됨

1

 package chap_07;

public class _Quiz_07 {
    public static void main(String[] args) {
        HamBurger[] hamBurgers = new HamBurger[3];
        hamBurgers[0] = new HamBurger();
        hamBurgers[1] = new CheeseBurger();
        hamBurgers[2] = new ShrimpBurger();

        System.out.println("주문하신 메뉴를 만듭니다.");
        System.out.println("---------------");
        for (HamBurger hamBurger : hamBurgers) {
            hamBurger.cook();
            System.out.println("-----------------");
        }
        System.out.println("메뉴 준비가 완료되었습니다.");
    }
}
    class HamBurger{
        public String name;
        public String[] ingredients = {"양상추", "패티", "피클"}; // 기본 재료를 배열로 초기화
        public HamBurger(){
            this("햄버거"); // 다른 클래스를 호출
        }

        public HamBurger(String name){
            this.name = name;
        }
        public void cook(){
            System.out.println(this.name + "를 만듭니다.");
            System.out.println("빵 사이에 들어가는 재료는?");
            System.out.println(" > " + ingredients[0]);
            for (int i = 1; i < ingredients.length; i++) {
                System.out.println(" + " + ingredients[i]);
            }
        }
    }
    
    class CheeseBurger extends HamBurger{
        private String ingre = "치즈";
        public CheeseBurger(){
            super("치즈버거"); // 부모클래스를 호출하여 "치즈버거"로 name 초기화
        }

        public void cook() {
            super.cook();
            System.out.println(" + " + getIngre() );
        }

        public String getIngre() {
            return ingre;
        }
    }

     class ShrimpBurger extends HamBurger{
        private String ingre = "새우"; // 새우 재료를 은닉

         public ShrimpBurger(){
             super("새우버거");
         }

        public void cook(){
            super.cook();
            System.out.println(" + " + getIngre());
         }

         public String getIngre() {
             return ingre;
         }
     }

사실 저는, this()와 super()로 다른 클래스를 호출하는 방법을 잘 몰라서, 클래스마다 this.name = "str"; 으로 다 초기화했거든요 😅
"양상추", "패티", "피클" 이 기본재료라서 배열로 초기화해줬고, 여기서 애로사항이 for-each문으로 출력을 하려고 했는데, " < " 와 " + " 부분이 달라서 그냥 for문으로 위와 같이 출력했습니다.
제가 궁금한 점은 첫째로, 만약 저렇게 재료들을 배열에 초기화시켰다면, 자식클래스에서 부모클래스의 배열에 접근해서 요소들을 추가할 수 있나요??
둘째로, 자식클래스의 재료들을 private으로 데이터은닉을 시킨다음에 getter함수로 출력을 해도 괜찮나요?

P.S: 항상 양질의 강의를 제공해주셔서 감사합니다! 퀴즈덕분에 고민하는데 시간이 오래걸렸지만, 제가 모르는 부분도 수정할 수 있어서 좋은 것 같아요!!

답변 1

1

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

안녕하세요?
퀴즈 풀이를 정말 잘 해주셨네요 😉
작성하신 코드에서 앞에 > 또는 + 를 붙이는 부분만 다음처럼 변경해보았습니다.

public void cook(){
    System.out.println(this.name + "를 만듭니다.");
    System.out.println("빵 사이에 들어가는 재료는?");

    for (int i = 0; i < ingredients.length; i++) {
        String prefix = i == 0 ? " > " : " + ";
        System.out.println(prefix + ingredients[i]);
    }
}

부모 클래스에 배열을 정의하고 자식 클래스에서 요소를 추가하는 것은 가능하지만 Hamburger 클래스처럼 배열을 만들게 되면 값이 3개로 고정되기 때문에 추가를 할 수는 없어요. 이런 경우에는 리스트를 사용하거나 또는 최대값이 정해진 경우라면 배열의 크기를 정의하는 식으로 풀어볼 수 있습니다. 단, Hamburger 클래스의 cook() 메소드 내에서는 3개의 값만 있을 것이기 때문에 반복 조건문을 주의해주셔야 해요.

앞서 설명드린 방식으로 변경하려면 이렇게 할 수 있습니다.
먼저 Hamburger 클래스는 이렇게 바꿔보았구요.

class HamBurger{
    public String name;
    public String[] ingredients;
    public HamBurger(){
        this("햄버거"); // 다른 클래스를 호출
    }

    public HamBurger(String name){
        this.name = name;
        this.ingredients = new String[4];
        this.ingredients[0] = "양상추";
        this.ingredients[1] = "패티";
        this.ingredients[2] = "피클";
    }
    
    public void cook(){
        System.out.println(this.name + "를 만듭니다.");
        System.out.println("빵 사이에 들어가는 재료는?");

        for (int i = 0; i < ingredients.length - 1; i++) { // 반복 조건 주의
            String prefix = i == 0 ? " > " : " + ";
            System.out.println(prefix + ingredients[i]);
        }
    }
}

CheeseBurger 와 ShirmpBurger 의 생성자를 이렇게 바꾸었습니다.

class CheeseBurger extends HamBurger{
    ...
    public CheeseBurger(){
        super("치즈버거"); // 부모클래스를 호출하여 "치즈버거"로 name 초기화
        this.ingredients[3] = ingre;
    }
    ...
}
class ShrimpBurger extends HamBurger{
    ...
    public ShrimpBurger(){
        super("새우버거");
        this.ingredients[3] = ingre;
    }
    ...
}

자식클래스의 재료들을 private 으로 만들고 getter() 로 출력하는 것은 아주 잘 하셨습니다 👏👏👏
궁금증 해결에 도움되시길 바래요 😊
감사합니다.

Ambition님의 프로필 이미지
Ambition
질문자

아하! 삼항 연산자를 사용하면 됬었군요!! String prefix = i == 0 ? " > " : " + ";
와 같이 삼항 연산자를 변수 선언과 동시에 대입하는 경우는 처음봐서 그리고 자주 사용하지 않아서 그 방법을 몰랐었네요 😭 그리고 String[] ingredients로 배열을 선언한 다음, 값의 변경을 위해 요소들을 new로 추가하는 것도 이 참에 새로 배웠습니다! 감사합니다 😄

Ambition님의 프로필 이미지
Ambition

작성한 질문수

질문하기