[C#] 일반화(Generic) 프로그래밍

Doorbals·2022년 9월 7일
0

일반화(Generic) 프로그래밍

일반화의 장점

  • 일반화 대상 정의 시 <> 사이에 일반화 대상에 대해 작성 후 사용하므로 데이터 파악 용이
  • 박싱, 언박싱 과정에서 소모되는 불필요한 연산 하지 않아 연산 속도 빠름.
    int num1 = 31;
    object obj = num1;
    int num2 = (int)obj;
    • 위와 같이 object 형식을 이용하면 여러 데이터를 하나의 변수에 저장 가능하지만 박싱 및 언박싱 작업으로 인해 속도 저하, 데이터 형식 명확하게 파악 불가능 등의 단점 발생.

일반화 메소드

  • 데이터 형식에 T(형식, Type) 기호를 사용
  • 메소드 이름 뒤의 <> 사이에 T를 넣고, 메소드 호출 시 T 대신 사용할 데이터 형식 입력.
    => 메소드 내부의 모든 T가 해당 데이터 형식으로 변경됨.
    메소드 정의 시 : public void Attack<T>(T target)
    메소드 호출 시 : Attack<Slime>(slime);
    • 위와 같이 매개변수의 데이터 타입으로 T에 어떤 데이터 형식을 사용하는지 알기 때문에 형식 매개변수로의 인수 전달 생략 가능. 즉, Attack< Slime >(slime) == Attack(slime);

일반화 클래스

  • 클래스 선언 시 클래스 이름 뒤의 <>사이에 T 정의

  • 클래스 내부에 T 형식으로 사용할 변수, 반환 값 등을 설정

  • 클래스 객체 생성 시 T 대신 사용할 데이터 형식 입력하면 클래스 내부의 모든 T가 해당 데이터 형식으로 변경됨.

    public class Player<T>
    {
    	public T value;
    }
    
    public class GenericClass
    {
    	private void Awake()
    	{
    		Player<int> player1 = new Player<int>();
    		player1.value = 10;
    
    		Player<string> player2 = new Player<string>();
    		player1.value = "Hello";
    	}
    }
    • 위와 같이 형식 매개변수 T에 넣어준 데이터 형식에 따라 value 값의 형식도 변경된다.

특정 조건에만 대응하는 형식 매개변수

  • 형식 매개변수 T는 모든 데이터 형식을 대신할 수 있다.
  • 하지만 때로는 특정 조건을 갖춘 형식에만 대응하는 형식 매개변수가 필요.
  • 다음과 같은 방법으로 일반화 메소드, 클래스에 제약 적용 가능
    public void Method<T>(T value) where T : struct {...}
    public class Class<T> where T : class {...}
    • where T : struct / T는 값 형식이어야 한다.
    • where T : class / T는 참조 형식이어야 한다.
    • where T : new() / T는 반드시 매개변수가 없는 생성자가 있어야 한다.
    • where T : 기반클래스이름 / T는 명시한 기반 클래스의 파생클래스여야 한다.
    • where T : 인터페이스이름 / T는 명시한 인터페이스를 반드시 구현해야 한다.
    • where T : U / T는 또 다른 형식 매개변수 U로부터 상속받은 클래스여야 한다.

출처 : 고박사의 유니티 노트 - 일반화 프로그래밍 (링크)

profile
게임 클라이언트 개발자 지망생의 TIL

0개의 댓글