인터페이스 왜 써야함?
-> 이 수준에서는 오히려 안쓰는게 편함

이런 종류에는 이런 메서드 필요하겠네
-> 이정도 생각 되면 인터페이스 쓰면 됨

c로 만들때는 그런거 없이도 잘 만들었는데?
-> c99까지만 와도 매크로랑 구조체 함수 포인터 등으로 비슷하게 사용했음
    c89 시절 틀딱이면 사용 안해도 됨

기획이 기억상실증있는지 매일 말이 달라짐
-> 인터페이스로 구조 잡아도 내일이면 달라질거임, 꼭 필요한곳에만 사용

-> 그 꼭 필요한 곳이 어딘지 모르면 그냥 안쓰면 됨


추가로 개인적으로 생각하는 인터페이스가 필요한 조건은
- 비슷한 동작을 하는 여러 구현체가 필요할 것이 확실할 때
- 그 구현체들이 공유하는 공통 작업이 있을 때
- 추가로 구현체간 의존성을 제거해야 할 명확한 이유가 있을 때

이 3 가지 다 만족하면 그때 만들 생각 하면 됨

비슷한 동작을 하는 여러 구현이 필요해도 공통 작업이 없으면 만들 이유가 없음
마찬가지로 공통 작업을 해도 여러곳에서 사용 안하면 만들 필요가 없고
의존성 제거가 필요없으면 상속으로 해결 가능함

위 3가지를 만족하는거랑 만족하지 않는 상황은 이런거임

바로 밑에있는 글에서 들고온건데

interface INamed {

    public string name {get;}

}


public class Item : INamed {

    public string name {get;}

}

이런건 보통 만드는 의미가 없음
하나하나 생각해보면

비슷한 행동의 여러 구현체 필요
ㄴ 있을수도 있지만 name 하나 들고있는게 필요할까?
공유하는 공통 작업이 있을 때
ㄴ name getter 하나만있어 공통 작업이라고 할 수 없음
구현체간 의존성을 제거해야 할 이유가 있을 때
ㄴ name 프로퍼티만으로 의존성을 제거할 이유가 없음


그럼 어떤상황에 필요할까? 
저걸 좀더 확장해서 툴팁을 표시한다고 해보자

interface ITooltipable {

    string name { get; }

    string description { get; }

    Sprite icon { get; }

    List<string> GetSubDescriptions();

}

public class Item : ITooltipable {

    public string name { get; }

    public string description { get; }

    public Sprite icon { get; }
    ....

    public List<string> GetSubDescriptions() {

        return new List<string> {

            $"공격력: +{attack}",

            $"방어력: +{defense}"

        };

    }

}

public class Skill : ITooltipable {
    public string name { get; }
    public string description { get; }
    public Sprite icon { get; }
    ....
    public List<string> GetSubDescriptions() {
        return new List<string> {
            $"마나 소모: {manaCost}",
            $"쿨타임: {cooldown}초",
            $"피해량: {damage}"
        };
    }
}

public class TooltipUI {
    public void Show(ITooltipable target) {
        // 대충 툴팁 표시 로직
    }
}

위 코드일때 생각해보자

비슷한 행동의 여러 구현체 필요
ㄴ Item, Skill등 각각 툴팁 표시 필요하고
나중에 npc 등 확장할 가능성도 있음

공유하는 공통 작업이 있을 때
ㄴ이름, 설명, 아이콘 데이터
하위 설명 목록 생성과 표시

구현체간 의존성을 제거해야 할 이유가 있을 때
ㄴ TooltipUI에서는 클래스 대신 인터페이스만 알면 됨
나중에 다른 툴팁 대상을 추가해도 ITooltipable 상속받고 넘겨주면 구현 가능

하지만 이런 상황에서도 기획이나 디자인등이 지주 달라지는 상황에는 의미가 없음

기획, 디자인 등 변경이 자주 일어나면 결국 인터페이스 구조 자체를 수정해야 하고
그러면 모든 구현체도 함께 수정 해야하고 그러다보면 인터페이스로 얻는 이점보다 유지보수 비용이 더 커질 수 있음