Generics :
<Type>
。타입 안정성( type safety )을 제공하기위해타입 형 변환에서 발생할 수 있는 문제점을 사전에 없애기 위해 구축됨
▶type이 일치하지않아 발생하는자료형문제로부터 자유롭고 안전함
。Class를 서로 다른Type에도 재사용 가능한 코딩을 수행하기 위해 사용.
▶List<Integer>처럼Type을 강제하는것을Generics이라고 한다.
▶Type이 일치하지 않는 데이터를 추가 시문법 오류를 발생시켜타입 안정성을 보장
。처리대상의 자료형에 의존하지 않으면서Class또는Interface를 구현할 수 있다.
▶ 자료형에 의존하지 않으므로 범용(generic)으로 활용가능.
。casting과boxing / unboxing에 따른 성능 저하를 없앰
。placeholder(<>) 라는template활용
▶<>안에 아무런 문자가 들어가도 상관 없으나 관습적으로T를 사용.public class Stack<T> { T[] data = new T[5]; } public class Program { static void Main(string[] args) { Stack<int> s1 = new Stack<int>(); // 정수형 설정. Stack<string> s2 = new Stack<string>(); // 문자열 설정. } }
- 매개변수를 쉼표로 구분 시 여러개를 지정 가능
class 클래스이름 < 매개변수1, 매개변수2 , .... >class TwoGen<T,V> { T ob1; V ob2; public TwoGen(T ob1, V ob2) { this.ob1 = ob1; this.ob2 = ob2; } public T OB1 { get { return ob1; } } public V OB2 { get { return ob2; } } } internal class Program { static void Main(string[] args) { TwoGen<int, string> t1 = new TwoGen<int, string>(150,"hello"); Console.WriteLine(t1.OB1 + t1.OB2) ; } }
Generictype의 명명규칙
。place holder에서 정의하는 규칙
▶ 규칙을 지켜야컴파일이 되거나 하는건 아니지만 통일성을 위해 규칙을 따르는게 좋다.
。<E>: 요소 ( Element )
Collection에서 주로 사용
ex )ArrayList<E>
。<K>: Key
。<V>: Value
。<N>: 숫자
。<T>: Type
。<S>,<U>,<V>: 2 , 3 , 4번째에 선언된 Type.
Type Wildcard :
<?>
。어떤 타입이든 올 수 있다는 의미의unknown type
▶Generic의placeholder에 지정.
。List<?>: 모든type의List를 의미.
▶List<?> list1 = new ArrayList<String>();와일드카드 종류
- Unbounded Wildcard (
<?>) :
。아무 타입이나 상관없이 사용 가능.
ex )List<?>
- 상한 제한 Wildcard (
<? extends T>) :
。T또는T의 하위 type만 허용
。읽기 전용으로 주로 활용
▶ 값을 읽을 수 있어도 구체적인 type을 모르므로 요소 추가는 불가능
ex )List<? extends Number> list = new ArrayList<Integer>();:
。Number의 하위Type인Number,Integer,Double,Float를 허용.
- 하한 제한 Wildcard (
<? super T>) :
。T또는T의 상위 type만 허용
。쓰기 위주로 주로 사용
▶ 요소 값 추가가 가능
ex )List<? super Integer> list = new ArrayList<Number>();:
。Integer의 상위Type인Integer,Number,Object를 허용Producer extends, Consumer super 법칙
。<? extends T>: 데이터 읽기용도로 활용
。<? super T>: 데이터 쓰기용도로 활용
ex )Comparator<? super T>는 비교용도로 활용하므로super사용