이 시리즈는 유니티에서 제공하는 튜토리얼을 정리해서 올린 것입니다.


----------------------------------------------------------------------------------------------

인터페이스


인터페이스는 기능에 대한 계약이라고 생각할 수 있다.

어떤 클래스든, 인터페이스를 구현한다면 해당 인터페이스가 가진 모든 메서드와 속성을 반드시 가지고 있어야 한다.


하지만 인터페이스는 클래스가 아니며, 인터페이스는 자체적으로 인스턴스를 가질 수 없다.


상속이 Is a 관계 (무엇은 무엇이다)인 반면

인터페이스는 Implement(무엇은 무엇을 구현한다) 관계이다.


----------------------------------------------------------------------------------------------


보통 인터페이스를 선언할때 대문자 I로 시작하고

그 뒤에 또다른 대문자로 시작하는 단어가 따라붙는다

인터페이스는 일반적으로 구현하는 클래스가 가질 특정 기능을 설명하므로

-able 접미사로 끝난다. 그러나 필수는 아니다.


24b0d121e09c28a8699fe8b115ef046c69f7214b


IKillable과 IDamageable 두 가지 인터페이스를 선언했다.


IKillable에는 반환형이 void이고 매개변수가 없는 Kill()이라는 메서드가 있다.

만약 클래스가 IKillable을 구현한다면 클래스는 Kill이라는 메서드를 반드시 구현해야한다.


IDamageable 인터페이스는 제네릭 타입 T를 갖는다. 이는 인터페이스 내의 모든 것이 제네릭 타입을 가질 수 있다는 의미이다.

Damage()함수는 T타입의 매개변수를 받는다. 제네릭 타입을 가진 인터페이스가 클래스에 구현될 때 해당 타입은 선택되어야 한다.


----------------------------------------------------------------------------------------------


인터페이스를 구현할 때 모든 메서드, 속성, 이벤트, 인덱스 등을 public으로 선언해야한다. 그렇지 않으면 오류가 발생한다.



24b0d121e09c28a8699fe8b115ef0469903afebd

Kill()메서드를 private로 선언하자 오류가 뜨는 모습을 볼 수 있다.


----------------------------------------------------------------------------------------------


인터페이스의 가장 큰 장점은 많은 클래스에 걸쳐있는 공통적인 기능을 정의할 수 있다는 것이다.

특히나 공통점이 거의 존재하지 않는 여러 클래스들의 공통 기능을 구현하고 싶을 때 빛을 발한다.


예를 들어 Wall이라는 클래스와 Car라는 두 클래스를 생각해보자.



24b0d121e09c28a8699fe8b115ef046f5a459899

두 클래스 모두 피해를 입을 수 있다는 공통점을 제외하면 거의 접점이 없어보인다.

그렇기에 상속으로 묶기에도 애매하다.

이럴때 IDamageable인터페이스를 통해 

Damage라는 기능만 구현해준다면 억지로 상속 관계로 묶을 필요없이

훨씬 더 유연하게 프로그래밍 할 수 있다.

----------------------------------------------------------------------------------------------