본문 바로가기

신세계 국비과정/신세게 - Java 공부

2주차 배운점 느낀점 - 클래스, 인터페이스, 상속 (햄버거)

728x90
반응형

 

 

햄버거 키오스크

 

하루 한개 쓰려고했는데 정리하고 넘어가야할 것같아서 또 쓴다. 선생님이 빌더 설명해주시며 인터페이스, 추상클래스, 상속, 사용에 관한 클래스관계도를 보여주셨다. 햄버거 가게에서 버거와 음료를 주문하고 어떻게 포장(Wrapper, bottle) 되어있는지, 주문한것 (vegBuger, ChickenBurger, Coke, Pepsi) 각각 가격과 토탈 합 가격을 출력한다. 관계가 복잡해서 쉽게 이해가 되지않아 이 문제만 따로 정리하려고 한다.

 

배운점

 

인터페이스(interface)


다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미

 

 


주문담고 계산하고 영수증나오고 .. 루틴들의 정의.
Burger가 아이템 Implements함.
인터페이스인지 클래스인지관계 설정

 

‘+’ public 이란 의미
‘-’ private 이란 의미

 

 

Item 인터페이스


이름, (Packing클래스)packing, 가격 메소드를 갖는다.

 

public interface Item {
    //인터페이스라는 타입은 기능정의(메소드 정의)만 한다. ---> abstract method(추상메소드)
    public String name();
    public Packing packing();
    public float price();
}

 

 

Packing 인터페이스


pack() 메소드를 갖는다.

 

public interface Packing {
    public String pack();
}

 

 

Wrapper 클래스


pack() 메소드를 오버라이딩했다. "Wrapper"문자열을 리턴한다.
종이로 버거 쌀라면 종이가 먼저있어야지 rapper만들기

 

public class Wrapper implements Packing{
    @Override //
    public String pack() {
        return "Wrapper"; 
// 바디가 있다. 재정의됐다. 인터페이스에있던거 기능구현하겠다. 실체화ㅏ
    }
}

 

 

Bottle 클래스


pack 메소드를 오버라이딩 했다. "Bottle"문자열을 리턴한다.

 

public class Bottle implements Packing{
    @Override
    public String pack() {
        return "Bottle";
    }
}

 

 

Burger 클래스


추상클래스: 하나 이상의 추상 메소드를 포함하는 클래스를 가리켜 추상 클래스(abstract class)
추상메소드: 추상 메소드(abstract method)란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드

 

public abstract class Burger implements Item{ // 추상클래스
    public Packing packing(){
        return new Wrapper();
    }
    public abstract float price();
}

 

 

Item을 implements 했다.
packing 메소드를 오버라이딩해서 Wrapper 클래스를 생성한다.
price() 메소드를 추상메소드로 선언해줬다.

 

 

ColdDrink 클래스


Item을 implements 했다.
packing 메소드를 오버라이딩해서 Bottle 클래스를 만든다.
price() 메소드를 추상메소드로 선언해줬다.

 

public abstract class ColdDrink implements Item{
    public Packing packing(){
        return new Bottle();
    }
    public abstract float price();
}

 

 

VegBerger 클래스


Burger을 상속받았다. (extend)
(Item에 있던 name, price 를 implements한) Burger를 상속받아서
name()과 price()를 오버라이딩 했고 "vergBurger" 문자열, 10.5f를 반환한다.

 

public class VegBerger extends Burger {
    @Override
    public String name() {
        return "VegBurger";
    }
    @Override
    public float price() {
        return 10.5f;
    }
}

 

 

ChickenBurger 클래스


Burger를 상속받았다.
name()에서 "ChickenBurger"를 리턴
price()에서 10.1f를 리턴한다.

 

public class ChickenBurger extends Burger{
    @Override
    public String name() {
        return "ChickenBurger";
    }
    @Override
    public float price() {
        return 10.1f;
    }
}

 

 

Pepsi 클래스


ColdDrink를 상속받았다.
(Item에 있던 name, price 를 implements한) ColdDrink를 상속받아서
name()에서 "pepsi"를 price()에서 5.3f를 리턴받는다.

 

public class Pepsi extends ColdDrink{
    @Override
    public String name() {
        return "pepsi";
    }
    @Override
    public float price() {
        return 5.3f;
    }
}

 

 

Coke 클래스


ColdeDrink클래스를 상속받았다.(extends)
name() "Coke"를 반환한다.
price() 5.5f를 반환한다.

 

public class Coke extends ColdDrink{
    @Override
    public float price() {
        return 5.5f;
    }
    public String name(){
        return "Coke";
    }
}

 

 

Meal 클래스


리스트 istems 어레이리스트를 만든다.
additem 메소드: item타입 객체를 받아서 리스트에 .add() 한다.
getCost 메소드: item객체들의 .price()를 cost변수에 더해서 총가격을 리턴한다.
showItems 메소드: item 객체의 이름, 포장(packing), 가격을 출력한다.

 

import java.util.ArrayList;
import java.util.List;

public class Meal {
    // - (private 접근 제한자로 설정)
    private List<Item> items = new ArrayList<Item>();


    public void additem(Item item){
        items.add(item);
    }

    public float getCost(){
        float cost = 0.0f;
        for (Item item : items) { // iter 치셈
            cost += item.price();
        }
        return cost;
    }

    public void showItems(){
        for (Item item : items) {
            System.out.print("Item : "+item.name());
            System.out.print(", Packing : "+item.packing().pack());
            System.out.print(", Price : "+item.price());
        }
    }

}

 

 

MealBuilder 클래스


prepareVegMeal 메소드: Meal객체를 생성하고, VegBerger 객체와, Coke객체를 생성 해서 meal.additem 해준다. 만든 Meal 반환.
prepareNonVegMeal 메소드: Meal객체 생성하고, ChickenBurger 객체와, Pepsi객체 생성 해서 meal.add 해준다. 만든 Meal 반환.

 

public class MealBuilder {
    public Meal prepareVegMeal(){
        Meal meal = new Meal();
        meal.additem(new VegBerger());
        meal.additem(new Coke());
        return meal;
    }

    public Meal prepareNonVegMeal(){
        Meal meal = new Meal();
        meal.additem(new ChickenBurger());
        meal.additem(new Pepsi());
        return meal;
    }
}

 

 

BuilderPatternDemo 클래스 (main)


MealBuilder 클래스 객체생성
verBerger 랑 Coke가 있는 Meal생성 : (Meal)vegMeal =mealBuilder.prepareVegMeal()을 이용해
(Meal타입)vegMeal의 정보 출력: vegMeal.showItems();
(Meal타입)vegMeal의 총 가격 출력: vegMeal.getCost();

 

public class BuilderPatternDemo {
    public static void main(String[] args) {
        MealBuilder mealBuilder = new MealBuilder();
        Meal vegMeal = mealBuilder.prepareVegMeal();
        System.out.println("Veg Meal");
        vegMeal.showItems();
        System.out.println("Total Cost : "+vegMeal.getCost());

        Meal nonvegMeal = mealBuilder.prepareNonVegMeal();
        System.out.println("\n\nNonVeg Meal");
        nonvegMeal.showItems();
        System.out.println("Total Cost : "+nonvegMeal.getCost());
    }
}

 

 

Arraylist <제너릭>


객체 순서가 있는 자료구조:

결과:

 

 

 

 

회고

 

큰 구조의 프로그램이면 더 복잡할 것같다, 클라이언트의 요구사항에 따라 또 달라질 것이다. 이런 간단한 구조도 복잡해 보인다. 이러면 안된다. 인터페이스, 상속 등 개념을 더 공부해서 머릿속에 설계도가 그려졌으면 좋겠다. 화이팅이다.

반응형