제네릭이란?
제네릭은 자바의 타입 안정성을 보장하여 잘못된 타입 사용을 컴파일 과정에서 미리 방지해주는 기능입니다. 제네릭을 사용하면 불필요한 타입 변환을 없애주어 프로그램 성능도 향상됩니다. 예를 들어, 제네릭을 사용하지 않는 코드에서는 List에서 값을 가져올 때마다 타입 변환이 필요하지만, 제네릭을 사용하면 특정 타입을 지정해 타입 변환을 생략할 수 있습니다.
// 제네릭을 사용하지 않을 경우
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0);
// 제네릭을 사용할 경우
List<String> list = new ArrayList<String>();
list.add("hello");
Stirng str = list.get(0);
클래스에서의 제네릭 사용
다음과 같은 Box 클래스가 있다고 가정해 보겠습니다.
public class Box {
private Object object;
public void set(Object object) {
this.object = object;
}
public Object get() {
return obejct;
}
}
위 Box 클래스의 필드 타입을 Object로 선언했는데 Object 클래스는 모든 자바 클래스의 최상위 부모 클래스이기 때문에 어떤 타입이든 담을 수 있습니다. 위 클래스에서도 set메소드로 모든 타입을 저장할 수 있게 했는데 문제는 get 메소드를 사용할 때 발생합니다.
public class BoxExample {
public static void main(String[] args) {
Box box = new Box();
box.set("홍길동");
String name = (String) box.get();
}
}
제네릭을 설명할 때 제네릭을 사용하지 않으면 리스트에서 값을 조회하면서 타입 변환을 해줬어야 했는데 위 코드에서 저장할때 String 타입으로 저장했지만 조회해올 때 다시 String 타입으로 타입변환 해준 것을 확인할 수 있습니다. 이렇게 되면 저장할 때와 조회해올 때 모두 타입 변환이 일어나기 때문에 전체 프로그램에 악영향을 미칠 수 있습니다.
수정된 코드
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
public class BoxExample {
public static void main(String[] args) {
Box<String> box = new Box<String>();
box.set("홍길동");
String name = box.get();
}
}
수정된 코드에서 타입 파라미터 T를 사용하여 Object 타입을 모두 T로 대체 했습니다. 이렇게 제네릭 타입을 사용해서 구현하면 main 메소드에서 Box 객체를 생성할 때 String 타입으로 선언할 수 있어 저장할 때와 조회해올 때 모두 타입 변환이 발생하지 않습니다.
멀티 타입 파라미터
클래스에서 제네릭 타입을 지정할 때 아래와 같이 각 타입 파라미터를 콤마(,)로 구분해서 지정하면 두 개 이상의 멀티 타입 파라미터를 사용할 수 있습니다.
@Getter
@Setter
public class Product<T, M> {
private T kind;
private M model
}
Product<Tv, String> product = new Product<>();
메서드에서의 제네릭 사용
제네릭 메서드는 리턴 타입이나 매개변수 타입에 타입 파라미터를 사용하는 메서드입니다. 리턴 타입 앞에 <T>를 명시하여 타입 파라미터를 선언합니다.
public <T> Box<T> boxing(T t) {
Box<T> box = new Box<>();
box.set(t);
return box;
}
이와 같이 제네릭을 사용하면 코드의 재사용성이 높아지고 타입 안정성을 확보할 수 있습니다.
'Java' 카테고리의 다른 글
[Java] Java 예외 처리: 체크 예외와 언체크 예외, 예외와 에러의 차이 (2) | 2024.11.05 |
---|---|
[Java] 스트림(Stream)이란 (0) | 2024.11.04 |
[Java] final 필드, 메소드, 클래스 (0) | 2024.10.30 |
[Java] 인터페이스란 무엇인가? (0) | 2024.10.30 |
[Java] 추상 클래스란 무엇인가? (0) | 2024.10.30 |