1️⃣1️⃣ 인터페이스 – 행동의 규칙을 정의하자! 🔑💡

🎬 상상해봐

너는 여러 게임 캐릭터를 만들었어.
각각의 캐릭터는 공격을 할 수 있어야 해.
하지만 캐릭터마다 공격 방식이 다를 수 있지.

그럼 어떻게 공격을 통일된 방식으로 할 수 있을까?
인터페이스를 사용해서, 공격 방식에 대한 규칙을 만들면 돼!


🧑‍⚖️ 1. 인터페이스란?

인터페이스행동의 규칙을 정의하는 계약서야.
인터페이스 안에는 구현되지 않은 메서드만 들어가 있어.
그럼 클래스는 이 규칙을 반드시 지켜야 해.

public interface Attackable { // 인터페이스는 메서드만 선언, 구현하지 않음

	void attack();
}

Attackable공격할 수 있는 행동규정하는 인터페이스야.


🛠️ 2. 인터페이스 구현하기

인터페이스는 클래스가 구현해야 해.
클래스가 그 인터페이스를 구현한다고 선언하려면 implements 키워드를 사용해.

public class Hero implements Attackable {

    String name;

    public Hero(String name) {
        this.name = name;
    }
    
    @Override
    public void attack() {
        System.out.println(name + "이(가) 검으로 공격했다!");
    }
}

implements Attackable → Hero 클래스는 Attackable 인터페이스의 규칙을 따라 attack() 메서드를 구현해야 해!


🚀 3. 인터페이스 사용하기

public class Main {

    public static void main(String[] args) {
        Hero hero1 = new Hero("철수");
        hero1.attack(); // 철수가 검으로 공격했다!
    }
}

Hero 클래스는 이제 Attackable 인터페이스의 규칙에 따라 attack()을 구현했으므로, 공격할 수 있다!


🔄 4. 여러 클래스에서 인터페이스 사용하기

인터페이스는 여러 클래스에서 구현할 수 있어!
다른 클래스에서도 같은 규칙을 따라서 공격을 할 수 있게 되는 거야.

public class Dragon implements Attackable {

    String name;

    public Dragon(String name) {
        this.name = name;
    }

    @Override
    public void attack() {
        System.out.println(name + "이(가) 불을 뿜었다!");
    }
}
public class Main {

    public static void main(String[] args) {
        Hero hero1 = new Hero("철수");
        Dragon dragon1 = new Dragon("불사조");
        
        hero1.attack(); // 철수가 검으로 공격했다!
        dragon1.attack(); // 불사조가 불을 뿜었다!
    }
}

HeroDragon은 같은 Attackable 인터페이스를 구현했기 때문에, 공격하기라는 동일한 규칙을 따르면서도 각자 다른 방식으로 공격을 할 수 있어!


🧩 5. 다중 인터페이스 구현

하나의 클래스가 여러 개의 인터페이스를 동시에 구현할 수도 있어.

public interface Flyable {
	void fly();
}

public class FlyingDragon implements Attackable, Flyable {

    String name;
    public FlyingDragon(String name) {
        this.name = name;
    }

    @Override
    public void attack() {
        System.out.println(name + "이(가) 불을 뿜었다!");
    }

    @Override
    public void fly() {
        System.out.println(name + "이(가) 하늘을 난다!");
    }
}
public class Main {

    public static void main(String[] args) {
        FlyingDragon flyingDragon = new FlyingDragon("날아라 불사조");
        
        flyingDragon.attack(); // 날아라 불사조가 불을 뿜었다!
        flyingDragon.fly(); // 날아라 불사조가 하늘을 난다!
    }
}

FlyingDragonAttackableFlyable 두 인터페이스를 구현하여, 공격과 비행 두 가지 행동을 할 수 있어!


🧠 정리 타임

개념의미예시
인터페이스 구현해야 할 메서드의 규칙을 정의 public interface Attackable { void attack(); }
implements 클래스를 인터페이스의 규칙에 맞게 만든다 public class Hero implements Attackable { ... }
다중 인터페이스 하나의 클래스가 여러 인터페이스를 구현 public class FlyingDragon implements Attackable, Flyable { ... }

🎮 실전 미션 – 공격과 비행을 할 수 있는 캐릭터 만들기

public interface Attackable {
    void attack();
}

public interface Flyable {
    void fly();
}

public class SuperHero implements Attackable, Flyable {

    String name;
    public SuperHero(String name) {
    	this.name = name;
    }

    @Override
    public void attack() {
    	System.out.println(name + "이(가) 슈퍼 공격을 했다!");
    }

    @Override
    public void fly() {
        System.out.println(name + "이(가) 하늘을 날았다!");
    }
}
public class Main {

    public static void main(String[] args) {
        SuperHero superHero = new SuperHero("철수");
        
        superHero.attack(); // 철수가 슈퍼 공격을 했다!
        superHero.fly(); // 철수가 하늘을 날았다!
    }
}

✨ 마무리 요약

인터페이스를 사용하면, 여러 클래스가 공통적으로 해야 할 행동규정할 수 있어.
이제 각기 다른 클래스들이 동일한 규칙에 따라 행동하면서, 유연하고 확장성 있는 코드를 만들 수 있게 되었어!


다음 12단원에서는 다형성에 대해 배우게 될 거야.
다형성하나의 객체가 여러 형태로 변할 수 있는 능력이야.
이걸 배우면, 코드가 더욱 유연하고 강력해지지!