#28 인터페이스

국기웅·2024년 5월 27일

Interface - C# 참조

코드중에 어려운 부분이 있었다.

public interface IDamageable
{
    void TakePhysicalDamage(int damage);
}
.
.중략
.

List<IDamageable> things = new List<IDamageable>(); 
.
.중략
.
    private void OnTriggerEnter(Collider other)
    {
        if(other.TryGetComponent(out IDamageable damageable))
        {
            things.Add(damageable);
        }
    }
.
.중략
.
    
    private void DealDamage()
    {
        for(int i = 0; i < things.Count; i++)
        {
            things[i].TakePhysicalDamage(damage);
        }
    }

IDamageable은 인터페이스형인데 리스트에 들어가고 심지어 함수까지 실행 가능하다는 것이 와닿지 않았다. 이 부분에 대해 조금 정리해보려고 한다.

'인터페이스는 계약을 정의한다. 해당 계약을 구현하는 class는 인터페이스에 정의된 구성원의 구현을 제공해야 합니다.

  1. 인터페이스는 클래스의 설계도처럼 어떠한 메소드가 들어가야하는지 사전에 고지하는 역할을 하고있다. 이런 점은 여러명이서 작업할때, 메서드명의 통일을 하게 만들고, 프로그램 작동 시에 메서드명의 변경으로 인한 오류를 피할 수 있다.

인터페이스는 다음이 포함된다.
상수
연산자
정적 생성자
중첩형식
정적필드, 메서드, 속성, 인덱서 및 이벤트
명시적 인터페이스 구현 구문을 사용한 구성원 선언
평시적 엑세스 한정자(기본 public)

  1. 위에 작성된 것과 같이 여러 부분들을 사전에 선언해둘수 있다. 선언한 부분을 구현하지 않으면 오류가 발생한다.

명시적 인터페이스 구현(C# 프로그래밍 가이드)

클래스가 시그니처가 동일안 멤버를 포함하는 두 인터페이스를 구현하는 경우, 해당 멤버를 클래스에 구현하면 양쪽 인터페이스 모두가 해당 멤버를 구현에 사용한다.

  1. 다른 인터페이스가 같은 이름의 메서드를 포함한 경우, 해당 인터페이스들을 모두 상속받은 클래스가 메서드를 호출하면,
    그 메서드는 둘다 실행된다는 의미이다

.
.
위에 작성된 코드를 다시 봐보면, "어떠한 메서드를 지닌"인터페이스의 부분만을 떼서 그걸 List화 한것으로 생각하면 편할 것 같다
즉, 인터페이스에서 사전에 구현한 메서드만 가진 클래스의 집합이다.
그렇기에 반복문(3번째 코드)에서 interface에서 정의한 메서드를 실행할 수 있는것이다. 그리고 객체 단위로 따지면, 객체마다 가진 해당 클래스들을 리스트화시키고, 그걸 실행한다고 보면 된다.

객체들마다 가진 메서드를 실행시키려면 각각 getcomponent를 하거나.. 아무튼 복잡해질 것 같은데 인터페이스로 우아하게 잘 표현할 수 있는 것 같다.

"비슷한 행동을 하는 객체는 인터페이스로 정의하고, 상속하기!"

profile
게임개발호소인

1개의 댓글

comment-user-thumbnail
2024년 5월 28일

인터페이스 조금 복잡하죠 ㅠㅠ 수고하셨습니다!

답글 달기