package p10;

public class App {
    public static void main(String[] args) {
        // 유닛은
        // 탱크(강력하고 비싼), SCV(전투에 능하지 않음), 마린(싸지만 빠르게 이동, 빠른 공격)이 존재한다.
        // 모든 유닛은 이동, 공격, 멈추기 기능이 있다.
        // 각 유닛은 자신만의 이동 알고리즘이 있고, 공격 알고리즘이 있다.
        // 유닛의 종류와 상관없이 6개의 유닛을 부대지정해서 한 번에 이동, 공격, 멈출 수 있다.
        Unit[] unitList = new Unit[6];
        unitList[0] = new Tank();
        unitList[1] = new Marine();
        unitList[2] = new SCV();
        unitList[3] = new Marine();
        unitList[4] = new Tank();
        unitList[5] = new SCV();

        // 아래가 핵심... 상속 - 다형성 - 오버라이딩
        // Runtime 시점에서 forEach문으로 분기된다. 
        for(Unit unit: unitList) {
            unit.move();
            unit.attack();
            unit.stop();
            System.out.println();
        }

    }
}

// abstract 추상 클래스, 상속만을 위한 정의
// 인스턴스 생성 불가능
abstract class Unit {
    int hp;
    int ap;
    int speed;
    
    abstract void move();
    abstract void attack();

    // 오버라이딩 불가능
    final void stop() {
        System.out.println("유닛의 로직으로 멈춥니다.");
    }
}

class Tank extends Unit{
    Tank() {
        hp = 100;
        ap = 20;
        speed = 10;
    }

    void move() {
        System.out.println("탱크만의 로직으로 " + speed + "만큼 이동합니다.");
    }
    void attack() {
        System.out.println("탱크만의 로직으로 " + ap + "만큼 공격합니다.");
    }
}

class Marine extends Unit{
    Marine() {
        hp = 50;
        ap = 5;
        speed = 5;
    }
    void move() {
        System.out.println("마린만의 로직으로 " + speed + "만큼 이동합니다.");
    }
    void attack() {
        System.out.println("마린만의 로직으로 " + ap + "만큼 공격합니다.");
    }
}

class SCV extends Unit{
    SCV() {
        hp = 30;
        ap = 1;
        speed = 1;
    }
    void move() {
        System.out.println("SCV만의 로직으로 " + speed + "만큼 이동합니다.");
    }
    void attack() {
        System.out.println("SCV만의 로직으로 " + ap + "만큼 공격합니다.");
    }
}

상속 - 다형성 - 오버라이딩 => 하나라도 모르면 전부 모르는 것 대표표현이 다형성 문법 의도: 결합도를 낮춘다. Decoupling => 컴포넌트를 조립으로 하자 저번 코드는 Controller와 Service의 결합도가 너무 높다. 상황에 따라 다른 Service를 사용한다면? 상속 - 다형성 - 오버라이딩 => 인터페이스(자바의 꽃)