C# Generic, interface, 확장메서드

장현태입니다·2025년 3월 26일
post-thumbnail

Generic(일반화)

Generic은 다양한 데이터의 형식을 다룰 수 있게 해주는 방법이다.
비슷한 방법으로 object가 있는데 object의 경우 최상위계층으로 모든 type의 상속 받는 형식으로 사용 가능하다

object를 자세히 살펴보자면 박싱과 언박싱으로 정의된다
박싱을 실행할경우 데이터타입 메모리에 저장된 값을 힙의 영역에 저장하여 참조형식으로 변형해서 정의된다.

와 같은 형식으로 박싱, 언박싱을 사용한다.
object를 사용하여 형변환을 한다면 힙영역의 부담과 효율성이 떨어지고 산술연산,비교연산,논리연산이 불가능하고 대입연산만 가능하기 때문에 실용성도 떨어진다. 이로인해 형변환이 필요한경우 대부분 generic을 사용하는것이 좋다.

generic : 형의 선언을 연기하여 클래스와 메서드를 디자인 하는 방법이다.

일반화클래스

<일반화 자료형 제약>

  • 클래스에 필요한 자료형을 일반화하여 구현
  • 자료형을 선언할 때 제약조건을 선언하여사용 당시 쓸 수 있는 자료형을 제한하여 사용한다 (where T : Something)

where T : struct를 사용해 struct 제약조건을 걸어준 뒤 Test함수를 실행할 때 struct의 Item형변환을 시킨 후 함수를 실행한다.

class도 똑같은 형식으로 작성해서 일반화를 진행한다

이러한 형식으로 클래스를 제약시킨 후 상속받은 클래스를 사용할 수도 있다.

제약의경우 해당 클래스의 내용만 함수에 작성할 수 있으며 함수안에 클래스의 특징적인 내용을 담아서 작성가능하다.

원래 일반화에서 비교연산이 불가능하지만 특정 조건을 주었을때 가능하다. IComparable에 조건을 생성하고 CompareTo를 사용했을 때 비교연산이 가능하다.

위의 Item class에 IComparable을 상속 받게되면 return 값으로 사전 순서대로 name을 정리할 수도 있다.

Interface

먼저 인터페이스를 설명하기 이전에 클래스의 상속을 알아봐야한다 상속을 받을경우 C#에서는 하나의 상속만을 받을 수 있는데 그 이유는

다음 그림과 같이 최상위 클래스 부모클래스의 부모클래스에서
move를 상속받은 부모 클래스에서 각각 move 함수를 재정의하고 그 밑에 자식클래스에 move함수를 상속받게되면 정말 모호한 결과를 보게된다 이로인해 C#에서는 다중 상속을 허용하지 않는다.

이를 대안으로 인터페이스가 존재한다(다중 상속 가능).

인터페이스 :

  • 인터페이스는 메서드 속성 이벤트 등을 갖지만 직접
    구현하진 않음
  • 행동에 대한 정의만 갖는 추상클래스
  • 인터페이스를 상속받은 클래스는 인터페이스의 함수를
    꼭 구현 해야한다

다중 상속을 이용해 interface에서는 함수를 추상적으로 정의하고 Bike,Horse 함수에서 추상화된 함수를 구체적으로 작성해서 class를 정의했다 그 후 Human class에서 각 인터페이스를 매개변수로 받아 메소드를 정의한 후 main함수에서 인스턴스를 진행하고 Human class의 함수를 실행시켜 결과를 출력했다.

위의 코드에서 알 수 있는 사실은 인터페이스로 다중 상속이 가능하며, Human class에서 함수를 정의할 때 매개변수로 각 인터페이스를 받아 출력시 사용할 때 인스턴스된 클래스를 사용하면 각각의 구체적으로 정의된 함수를 도출 할 수 있는것을 볼 수 있다.

그러면 추상화라고 했었을 때 상속에도 비슷한 abstract 추상클래스가 있는데 인터페이스와 추상클래스의 차이점은 뭐가 있을까??

인터페이스 - 추상클래스

공통점:

  • 인터페이스는 추상클래스의 일종으로 특징이 동일하다.
  • 함수에 대한 선언만 정의하고 포함하는 클래스에서
    구체화하여 사용한다.

차이점:
추상클래스 :

  • (설계도) 변수, 함수의 구현 포함 가능 / 다중상속 X
  • A is B : 학교는 건물이다.
  • 건물에 전기를 들여오면 학교에도 전기를 들이기가능하다.
  • 상속해서 구체화를 통해 실체화시킴

인터페이스 :

  • (계약서) 변수, 함수의 구현 포함 불가/ 다중포함 O
  • A Can B: 문은 열수있다, 던전은 들어갈 수있다.

이러한 형식으로 논리적인 상황으로 접근한다면 추상클래스와 인터페이스의 차이를 볼 수 있다.

다음은 다형성과 인터페이스를 같이 사용할 경우의 예제를 조금만 살펴보겠다.

NPC는 상호작용을 한다.
상점 NPC는 상호작용을 하고 상점을 연다.

위의 코드에서 주석처리를 없애면 다중상속 StoreNPC 클래스를 사용하면 다형성을 이용한 상속으로 다양한 방법으로 상속을 사용하거나 인터페이스를 사용가능하다 이는 프로그래머의 상황과 작성법에 따라 달라지므로 정답은 없다.

확장 메서드

기존 클래스를 건드리지 않고, 기능을 추가할 수 있는 기능
class가 static 이어야하고, class 함수의 확장을 원하는 매개변수에 this키워드를 넣어줘야한다.

다음과같은 형식으로 원하는 함수를 만들어 실행결과를 얻을 수 있다.

0개의 댓글