본문 바로가기
개발언어/JAVA

[JAVA] 제네릭(Generic)이란? 제네릭 사용 방법과 예제 정리

by 코딩 시그널 2020. 8. 1.
반응형

제네릭(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 <T>, interface <T>)

 

  • 제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말함
  • 클래스, 인터페이스 이름 뒤에 <> 부호가 붙고, 사이에 타입 파라미터가 위치함
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)은 클래스를 설계할 때 구체적인 타입을 명시하지 않고, 타입 파라미터로 대체했다가 실제 클래스가 사용될 때 구체적인 타입을 지정함으로써 타입 변환을 최소화시키는 것을 확인할 수 있다.

 

댓글