즐거운프로그래밍

[자바] 추상 클래스(abstract), 밴딩머신 예제

수수께끼 고양이 2023. 10. 23. 10:32
728x90
반응형

 

추상 클래스는 인터페이스와 마찬가지로 하위 클래스를 구현 되어야 하는 기능을 선언하여 상속 받는 하위 클래스가 구현하도록 하지만 인터페이스보다 느슨한 추상화를 제공한다.

인터페이슨느 상수와 추상 메서드만을 포함하지만

추상 클래스는 구현된 메서드와 멤버변수를 포함할 수 있기 때문이다.

 

1. Main 클래스

public class Main {
    public static void main(String[] args) {
//        VendingMachineControl vmc = new CoffeeMachine();
//        vmc.on();
//        vmc.insertMoney();
//        vmc = new CarMachine()
//        useVM(new vmc);
//        vmc = new CarMachine();
        useVM(new CoffeeMachine()); // VendingMachineControl vmc=new CoffeeMachine()
        useVM(new CarMachine()); // VendingMachineControl vmc=new CarMachine()
        useVM(new CoffeeMachine_v2()); // VendingMachineControl vmc=new CoffeeMachine_v2()
        useVM(new CarMachine_v2());
        useVM(new VMA() { // 클래스 없이(로컬 클래스:함수 내에서 사용하는 클래스) 특별히 여기서만 사용할 방식

            @Override
            public void insertMoney() {
                System.out.println("Money");
            }

            @Override
            public void returnItem() {
                System.out.println("토끼인형");
            }
        });
    }
    
       public static void useVM(VendingMachineControl vmc) {
        vmc.on();
        vmc.off();
        vmc.insertMoney();
        vmc.returnItem();
    }
}

 

2. Interface

interface VendingMachineControl {
    void on();
    void off();
    void insertMoney();
    void returnItem();
}

 

3. 하위 클래스와 추상클래스(abstract)

class CoffeeMachine implements VendingMachineControl {

    @Override
    public void on() {
        System.out.println("on");
    }

    @Override
    public void off() {
        System.out.println("off");
    }

    @Override
    public void insertMoney() {
        System.out.println("Coin");
    }

    @Override
    public void returnItem() {
        System.out.println("Coffee");
    }
}

class CarMachine implements VendingMachineControl {

    @Override
    public void on() {
        System.out.println("on");
    }

    @Override
    public void off() {
        System.out.println("off");
    }

    @Override
    public void insertMoney() {
        System.out.println("Card");
    }

    @Override
    public void returnItem() {
        System.out.println("Car");
    }
}

abstract class VMA implements VendingMachineControl {
    public void on() {
        System.out.println("on");
    }
    public void off() {
        System.out.println("off");
    }
    public abstract void insertMoney();
    public abstract void returnItem();
}
class CoffeeMachine_v2 extends VMA { // class와 class 사이여서 extends 사용
    @Override
    public void insertMoney() {
        System.out.println("Coin");
    }

    @Override
    public void returnItem() {
        System.out.println("Americano");
    }
}

class CarMachine_v2 extends VMA {

    @Override
    public void insertMoney() {
        System.out.println("Card");
    }

    @Override
    public void returnItem() {
        System.out.println("Car");
    }
}

 

 

- 전체 코딩

public class Main {
    public static void main(String[] args) {
//        VendingMachineControl vmc = new CoffeeMachine();
//        vmc.on();
//        vmc.insertMoney();
//        vmc = new CarMachine()
//        useVM(new vmc);
//        vmc = new CarMachine();
        useVM(new CoffeeMachine()); // VendingMachineControl vmc=new CoffeeMachine()
        useVM(new CarMachine()); // VendingMachineControl vmc=new CarMachine()
        useVM(new CoffeeMachine_v2()); // VendingMachineControl vmc=new CoffeeMachine_v2()
        useVM(new CarMachine_v2());
        useVM(new VMA() { // 클래스 없이(로컬 클래스:함수 내에서 사용하는 클래스) 특별히 여기서만 사용할 방식

            @Override
            public void insertMoney() {
                System.out.println("Money");
            }

            @Override
            public void returnItem() {
                System.out.println("토끼인형");
            }
        });
    }

    public static void useVM(VendingMachineControl vmc) {
        vmc.on();
        vmc.off();
        vmc.insertMoney();
        vmc.returnItem();
    }
}

interface VendingMachineControl {
    void on();
    void off();
    void insertMoney();
    void returnItem();
}
class CoffeeMachine implements VendingMachineControl {

    @Override
    public void on() {
        System.out.println("on");
    }

    @Override
    public void off() {
        System.out.println("off");
    }

    @Override
    public void insertMoney() {
        System.out.println("Coin");
    }

    @Override
    public void returnItem() {
        System.out.println("Coffee");
    }
}

class CarMachine implements VendingMachineControl {

    @Override
    public void on() {
        System.out.println("on");
    }

    @Override
    public void off() {
        System.out.println("off");
    }

    @Override
    public void insertMoney() {
        System.out.println("Card");
    }

    @Override
    public void returnItem() {
        System.out.println("Car");
    }
}

abstract class VMA implements VendingMachineControl {
    public void on() {
        System.out.println("on");
    }
    public void off() {
        System.out.println("off");
    }
    public abstract void insertMoney();
    public abstract void returnItem();
}
class CoffeeMachine_v2 extends VMA { // class와 class 사이여서 extends 사용
    @Override
    public void insertMoney() {
        System.out.println("Coin");
    }

    @Override
    public void returnItem() {
        System.out.println("Americano");
    }
}

class CarMachine_v2 extends VMA {

    @Override
    public void insertMoney() {
        System.out.println("Card");
    }

    @Override
    public void returnItem() {
        System.out.println("Car");
    }
}

 

 

 

728x90
반응형