티스토리 뷰

이전에 사전캠프에서 문법 톺아보기를 하면서 정리했었던 인터페이스를 더 자세하게 파고들어가 볼까 한다.

[기초 문법 톺아보기 - 2 URL: https://lsu0503.tistory.com/12]

 

(사전 캠프) C# 기초 문법 톺아보기 - 2

공부할 내용 [수업자료와 순서를 소폭 변경하여 구성하였습니다.]인터페이스난수 생성문자열 처리참조형 인수 [out / ref]자료형 확인 및 캐스팅 [is / as] 인터페이스(Interface)클래스나 구조체를 '

lsu0503.tistory.com

 

사용법은 위 글에 정리되어 있으니, 이 문서에는 활용법 위주로 작성한다.

 

1. 인터페이스는 다중 상속이 가능하다.

기초 문법 톺아보기에서도 나왔던 요소. 하지만, 생각 보다 훨씬 유용한 기능이었다.

단순히 인터페이스의 항목을 상속받는 것 이외에도 상속 받은 다른 인터페이스로 캐스팅이 가능하다는 점이 매우 유용하다. 더욱이 객체가 불명확한 변수 상태라고 해도 문제 없이 캐스팅이 된다.

[그냥 캐스팅 만 하면 노란 줄이 뜨는데, 그냥 캐스팅 대상이 null일 수도 있다는 경고다.]

interface InterfaceA {}
interface InterfaceB {}
class ABclass : InterfaceA, InterfaceB {}

internall main()
{
    InterfaceA a = new ABclass();
    (a as InterfaceB) ← 캐스팅 방법
}

 

특히 아이템 같이 같은 화면에 표시되기도 하면서 구분이 되어야 하는 항목에 사용하기가 좋은 특성.

아예 무기에도 사용 효과를 넣는 경우 아이템 기본 인터페이스[1], 무기 인터페이스[2], 사용 아이템 인터페이스[3]의 3개 상속으로 구현하고, 인벤토리에서는 [1]으로 저장하고, 무기 창에선 [2]로 캐스팅 하고, 아이템 사용 시에는 [3]으로 캐스팅 하는 방식도 유효하다.

 

더욱이 상단 코드에서 볼 수 있듯, 상속 받은 인터페이스라면 뭐든지 자료형으로 활용할 수 있기 때문에, 사실상 편한 방식으로 선언할 수 있다는 점 또한 소소한 포인트.

[다만, 어지간하면 가장 기본 형식에 해당하는 인터페이스를 자주 쓰게 될 것이다.]

 

2. 인터페이스에는 변수를 선언할 수 없다. 대신 프로퍼티를 이용한 접근 함수를 선언한다.

의외의 방식으로 유용한 특성 그 2. 이건 진짜로 의외의 방식으로 유용하다.

클래스는 기본적으로 선언할 때 이외에는 값을 할당하려면 관련 함수를 이용해야 한다.
[선언과 초기화를 따로 둘 경우 오류가 발생한다.]

때문에 클래스의 상속을 이용해서 작성할 경우, 각 변수의 초기화는 반드시 생성자를 통해서 진행해야 한다.

 

인터페이스는 역설적이게도 변수 접근을 인터페이스로 선언한 다음에 상속 받은 클래스에서 정의하는 구조이기 때문에 변수 선언 자체는 해당 클래스에서 직접 진행한다. 그렇다 보니 선언을 하면서 초기화할 수도 있다.

이 방식의 가장 큰 장점은 가독성. 클래스 상속을 이용한 경우에는 변수 선언과 변수 초기화가 따로 떨어져 있을 수 밖에 없어서 은근히 눈에 잘 안들어오는데, 이 방식으로는 눈에 꽤 잘 들어온다. 변수 타입이 색 변형되는 툴이라면 이 장점이 극대화된다.

 

다만, 반대로 변수 접근을 인터페이스로 작성하는 방식이기 때문에 이에 대해서 일일히 작성해야 한다는 난점은 있다.

거기다가 Unity는 인스펙터를 통한 값 할당도 가능하다 보니까 이런 특색이 좀 약해지긴 한다.

 

 

3. 인터페이스에서 선언한 함수의 세부 내용은 클래스에서 직접 작성해야 한다.

클래스 상속을 이용해서 함수를 상속할 경우, 자식 클래스에서 함수를 재 정의하면 virtual-override를 사용하지 않는 한 모호함 문제가 발생하게 되는데, 인터페이스는 이럴 일이 없다.

물론, virtual-override를 사용하면 되는 데다가, 딱히 재정의 하지 않아도 쓸 수 있는 클래스 상속과 비교하면 일장일단이라는 느낌이긴 하지만...

 

 

정리하며

사실, 인터페이스를 처음 배울 때에는 클래스 상속을 놔두고 이걸 왜 쓰는가 싶었다. 정확히는 클래스 상속이 인터페이스 보다 상위 개념으로 보였었다. 아무래도 Unity에 인스펙터가 있다 보니 제대로 못 봤던 거 아닌가 싶다.

다만, 실제로 써 보니까 저런 특성들 덕분에 용도가 완전히 다른 것이었다는 것을 알게 되었다. 비유하자면, 상속이 가지 치기(자르는 거 말고 늘리는 거)라면 인터페이스는 양식을 복사하는 것 같은 느낌이었다.

물론 비슷하게 쓸 수야 있겠지만, 이런 차이점을 보고 나니까 확실히 유용한 기능인 거 같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함