Generic
Updated:
List<Interger> list1 = new ArrayList<>();
List list2 = new ArrayList<>();
Map<String, String> map = new ArrayList<>();
우리는 위와같이 꺽쇠안에 클래스 타입이 명시된 패턴을 자주 발견할 수 있습니다.
이걸 제네릭(Generic) 이라고 부르며, 제네릭 파라미터는 꺽쇠안에 포함하여 전달합니다.
제네릭이 하는게 무엇이고, 왜 사용할까? 라는 물음에서 시작하되어 포스팅을 시작합니다.
Generic 이란?
> 제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미합니다.
한마디로 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입!
Generic 사용 이유
- 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거
- 메서드를 정의할 때 타입(type)을 파라미터(parameter)로 사용할 수 있도록 함
제네릭 장점
-
컴파일 시 강한 타입 체크를 함
( 실행 시 타입 에러가 나는 것보다는 컴파일 시에 미리 타입을 강하게 체크해서 에러를 사전에 방지 ) -
타입 변환(casting)을 제거함
(비제네릭 코드는 불필요한 타입 변환을 하기 때문에 프로그램 성능에 악영향을 미침)
List list = new ArrayList();
list.add("hello");
String str = (String)list.get(0); // 타입 변환함
List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0); // 타입 변환 하지 않음
제네릭 타입(class , interface )
제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말합니다.
클래스, 인터페이스 이름 뒤에 <> 부호가 붙고, 사이에 타입 파라미터가 위치합니다.
public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}
예제
// 비제네릭
public class ObjectType {
private Object object;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
// 제네릭
public class GenericType<T> {
private T genericType;
public T getGenericType() {
return genericType;
}
public void setGenericType(T genericType) {
this.genericType = genericType;
}
}
public class GenericExample {
public static void main(String[] args) {
//비제네릭
ObjectType ot = new ObjectType();
ot.setObject("비제네릭타입"); // String -> Object (자동 타입 변환)
String str0 = (String)ot.getObject(); // Object -> String (강제 타입 변환)
//제네릭
GenericType<String> gt = new GenericType<String>();
gt.setGenericType("제네릭타입");
String str1 = gt.getGenericType();
}
}
Object 타입을 사용하면 모든 객체를 저장할 수 있는 장점이 있지만, 저장할 때 타입 변환이 발생하고, 읽어 올 때에도 타입 변환이 발생합니다.
이런 타입 변환이 빈번하게 발생하면 프로그램 전체 성능에 좋지 못한 결과를 초래할 수 있습니다.
하지만 제네릭(Generic)은 클래스를 설계할 때 구체적인 타입을 명시하지 않고, 타입 파라미터로 대체했다가 실제 클래스가 사용될 때 구체적인 타입을 지정함으로써 타입 변환을 최소화시키는 것을 확인할 수 있습니다.
Leave a comment