자바의 제네릭

mDev_97·2022년 1월 9일
0

Java

목록 보기
15/28

제네릭

제네릭(Generics)의 기본 개념

• 모든 종류의 데이터 타입을 다룰 수 있도록 함
• 일반화된 타입 매개 변수로 클래스 또는 메소드를 작성하는 기법

제네릭의 장점

• 컴파일 시에 타입이 결정
-> 프로그램 작성을 안전하게 할 수 있다.
• 런타입 타입 충돌을 방지할 수 있다.
• ClassCastException 방지

타입 매개 변수

• < E >, < K > , < V > 등 요소 타입을 일반화한 타입
• 타입 매개 변수는 나중에 실제 타입으로 구체화하여야 한다.
• < 과 > 사이에 하나의 대문자를 타입 매개 변수로 사용
E : element를 의미
T : Type를 의미
V : Value를 의미
K : Key를 의미
• 어떤 문자든지 타입 매개 변수로 사용 가능하다.
• 타입 매개 변수 타입의 객체를 생성 할 수 없다.

V value = new V(); // 오류!

제네릭 작성하기

• 클래스나 인터페이스 선언부에 일반화된 타입 추가

// 제네릭 클래스 선언
// 타입 매개 변수 T
public class GenericExClass<T> {
    T value;
    
    void set(T t) {
        value = t;
    } // T 타입의 값 t를 value로 대입하는 메소드
    
    T get() {
        return value;
    } // T 타입의 값 value를 리턴하는 메소드
|

구체화(Specialization)

• 제네릭으로 작성된 클래스에 구체적인 타입을 대입하여 객체를 생성
• 컴파일러에 의해 수행된다.

// 제네릭으로 클래스 작성
public class GenericExClass<T> {
    T value;
    void set(T t) {
        value = t;
    }
    
    T get() {
        return value;
    }
}

// 제네릭 객체 생성 - 구체화
GenericExClass<String> stringGeneric = new GenericExClass<String>();
// 타입 매개 변수에 String을 지정하여 구체화
stringGeneric.set("Java");
System.out.println(stringGeneric.get()); // "Java"를 출력

// 타입 매개 변수에 기본 타입은 사용할 수 없다.
GenericExClass<int> priType = new GenericExClass<int>();
// 컴파일 오류 발생!

제네릭과 배열

• 제네릭 클래스와 인터페이스의 배열을 허용하지 않는다.

GenericExClass<String>[] gec = new GenericExClass<String>[5];
// 허용 x

• 매개 뱐수 타입(제네릭 타입) 배열을 허용하지 않는다.

T[] t = new T[5];
// 허용 x

• 타입 매개 변수의 배열에 레퍼런스는 허용한다.

public void printArray(T[] t) {
    ....
}

제네릭 메소드(Generic Method)

• 제네릭 메소드를 호출할 때는 타입을 명시하지 않아도 된다.
-> 컴파일러가 메소드의 인자로 이미 타입을 알고 있기 때문!

// 제네릭 메소드 선언
class GenericMethodEx {
    static <T> void printArray(T[] t) {
        for(int i=0; i<t.length; i++) {
            System.out.println(t[i]);
        }
    }
}
profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글

관련 채용 정보