제네릭 타입을 이용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 되었다.
제네릭은 클래스, 인터페이스, 메소드를 정의할 때 타입을 파라미터로 사용할 수 있도록 한다. 파라미터는 코드 작성 시 구체적인 타입으로 대체되어 다양한 코드를 생성하도록 해준다.
제네릭은 컴파일 시에 타입을 체크하는데 이것은 실행 시 타입 에러가 나는 것보다 컴파일 시에 미리 타입을 체크해서 에러를 방지하는 것이 좋기 때문이다.
또한 제네릭을 사용하면 타입 변환을 제거한다.
// 제네릭을 사용하지 않은 경우.
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0); // list에 있는 문자열을 가져오기 위해서 강제 타입 변환을 해야한다.
// 제네릭을 사용하는 경우.
List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0); // list에 저장되는 값을 String으로 제한하기 때문에 요소를 찾아올 때 타입 변환을 할 필요가 없다.
제네릭 타입
제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.
다음은 제네릭을 이용해서 모든 종류의 객체를 저장할 수 있으면서 타입 변환이 발생하지 않는 코드이다.
// Box.java
public class Box<T> {
private T t;
public void set(T t) {
this.t = t
}
public T get() {
return t;
}
}
T는 Box 클래스로 객체를 생성할 때 구체적인 타입으로 변경된다.
// BoxExam.java
public class BoxExam() {
public static void main(String[] args) {
Box<String> box1 = new Box<String>;
box1.set("Hello");
String str = box1.get();
Box<Integer> box2 = new Box<Integer>;
box2.set(10);
int val = box2.get();
}
}
이런식으로 만들면 Box 객체를 만들 때, Box 클래스 내부에서 T가 String, Integer로 바뀌어서 적용되기 때문에 타입 변환을 최소화 시킨다.
이와 같이 제네릭은 클래스를 설계할 때 구체적인 타입을 명시하지 않고, 타입 파라미터로 대체했다가 실제 클래스가 사용이 될 때 구체적인 타입을 지정한다.
멀티 타입 파라미터
제네릭 타입은 두 개 이상의 멀티 타입 파라미터를 사용할 수 있다.
// product.java
public class Product<T, M> {
private T kind;
private M model;
public void setT(T kind) {
this.kind = kind;
}
public void setM(M model) {
this.model = model;
}
public T getKind() {
return kind;
}
public M getModel() {
return model;
}
}
// productExam.java
public class ProductExam {
public static void main(String[] args) {
Product<Tv, String> product1 = new Product<Tv, String>();
product1.setKind(new Tv());
product1.setModel("smart TV");
Tv tv = product1.getKind();
String tvModel = product1.getModel();
product<Car, String> product2 = new Product<Car, String>();
product2.setKind(new Car());
product2.setModel("hybrid");
Car car = product2.getKind();
String carModel = product2.getModel();
}
}
'개발 관련 지식 > JAVA' 카테고리의 다른 글
제한된 타입 파라미터 (0) | 2020.04.06 |
---|---|
제네릭 메소드 (0) | 2020.04.06 |
멀티 스레드 개념 (0) | 2020.04.04 |
예외 처리 (0) | 2020.04.03 |
인터페이스에서 디폴트 메소드 (0) | 2020.04.02 |