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