[C#, 유니티] Unity3D_인터페이스

2022. 8. 11. 16:18코딩 2막 <C#개념편>

728x90

Interface?

C#문법과 같은 객체지향 프로그래밍에서

핵심요소인 인터페이스에 대해서 오늘 배우도록 하겠습니다

이해를 돕기 위해 자료를 준비했습니다

: :

다음과 같은 클래스가 있다고 하자


각 클래스들은 공통적으로 어떤 행동을 할 수 있을까

먼저 Chest와 Door의 경우 잠글수있다는 특징을 갖는다

상자와 문은 열고 닫힌다는 공통적인 속성을 가진다

그래서 Lock라는 부모클래스를 상속받게끔 표현한 것

 

그리고 Door와 Dungeon의 경우 들어간다는 공통적인 특성을 갖는다

 

그렇다면.. 다음과 같은 상황은 어떻게 될까?

C++은 다중상속을 허용한다

결론부터 이야기 하면

'C#에서는 다중상속을 허용하지 않는다'

 

C++에서는 다중상속이 되지만

왜 C#은 금지하는가? 문제가 있기 때문

 

C#의 컨셉은 애초에 객체지향 언어 중 잘못을 발생하지 않도록 여지를 두지않게 설계되었기 때문이다

C++은 직접적인 개발자 책임이 있다면 C#은 간접적으로 체험. 논란의 여지를 만들지 않음.

C#은 다중상속을 허용하지 않는다

이를 해결하기위해 만든것이 인터페이스

은 잠글수있는 존재이면서 들어갈수있는 행동에 대한 정의를 갖는 추상클래스


 

클래스가 뭐든 중요치 않다

중요한 것은 행동을 할수 있는지가 관건

결론


그럼 이제 인터페이스를 직접 구현해보자

  인터페이스는 기본적으로 재정의를 해줌(호환성 위주)
인터페이스는 변수를 쓰는 방식은 좋지 않기 때문에 막아둠

(하지만 프로퍼티를 써서 변수를 정의할수는 있다) 

 

코드의 재사용에 있어서 인터페이스는 별로 효과적이지 못한 단점이 있다.

결집력이 강한 상속의 경우 코드의 재사용에 유리하다.
    
  <상속과 인터페이스를 써야하는 상황은 다르다!!>

둘 관계는 확실한 장단이 있기 때문에 상황에 맞게 혼용해서 사용해야한다

    상위클래스로 묶지 못하는 클래스의 경우 인터페이스를 쓰면 되지만
그렇지 않고 묶을 수 있을 때는 상속을 써야한다 (예시 몬스터:IDamagable - 트롤, 오크, 슬라임)

상속

먼저 IDamagale이라는 맞을 수 있는 인터페이스를 하나 만들도록 하자

이 코드는 다음과 같다

 

그럼 맞을 수 있는 클래스로 플레이어와 몬스터를 만들어보겠습니다

플레이어와 몬스터는 IDamagable이라는 인터페이스를 갖도록 했습니다

 

맞을수있는 존재(IDamagable)라는 것의 인터페이스를 가진 플레이어
 IDamagale이라는 인터페이스가 있다면 반드시 그 함수(TakeHit)가 있다 (행동을 보장받는다)
   즉 새로운 클래스를 만들어도 그 함수로 동작받을 수 있다

플레이어 스크립트

  

맞을수있는 존재(IDamagable)라는 것의 인터페이스를 가진 몬스터

당연히 TakeHit을 갖는다

 

인터페이스 다형성

몬스터 스크립트

그리고 장애물을 추가하겠습니다

장애물은 플레이어가 때려도 맞지않고 피해간다는 설정으로

IDamagale을 받지 않겠습니다

장애물 스크립트

이제 플레이어가 타켓(몬스터, 장애물)들을 때릴 수 있도록

AttackController를 만들겠습니다

attackController 스크립트

결과

(매우중요!!!!!!!!!!!) 추상클래스와 인터페이스의 차이
두 관계는 겉으로 봤을땐 차이가 없다
왜냐하면
인터페이스는 추상클래스에 포함된다
도형으로 표현하면 인터페이스는 정사각형이라고 보면 추상클래스는 사각형이다


그럼 왜 인터페이스를 쓸까?

결론부터 말하면 클래스 설계단계에서 개발자는 '객체인가? 아니면 행동인가?' 의 구분부터 먼저 해야한다
클래스(객체)인것이 중요하면 추상클래스를 사용하고, 행동이 중요하면 인터페이스를 사용하면 된다
상속받아 추상클래스를 쓸때는 상위개념의 클래스(객체)의 의미가 중요한 경우이다
특정 행동에 보장을 받는 계약서의 의미가 강한 '인터페이스'냐, 설계도의 의미가 강한 '추상클래스'냐로 빗대어 볼 수 있다


공감해주셔서 감사합니다

728x90