Generic 타입 사용하는 이유와 사용법

야부엉·2024년 12월 2일

java

목록 보기
1/1
post-thumbnail

1.Generic 사용하는 이유

  • 예를 들면 여러 타입의 변수를 사용 하기 위해서는 아래와 같이 타입별로 클래스를 만드는 방법이 있다.
// IntegerBox.java
public class IntegerBox {

	private Integer value;

	public void set(Integer value) {
		this.value = value;
	}

	public Integer get(){
		return this.value;
	}
}

// StringBox.java 

public class StringBox {

	public String value;

	public void set(String value) {
		this.value = value;
	}

	public String get() {
		return this.value;
	}
}
  • 위와 같이 타입별로 Box를 만든다면, 많은 클래스가 생성되는 문제가 있다. 이러한 문제를 해결하기 위해 가장 먼저 생각나는 방법은 모든 타입의 부모인 Object 타입을 사용하는 것이다. 즉 다형성(다형적 참조)를 사용하면 아래와 같이 하나의 클래스로 정의가 가능하다.
// ObjectBox.java
public class ObjectBox {

	private Object value;

	public void set(Object value) {
		this.value = value;
	}

	public Object get() {
		return this.value;
	}
}
  • 위와 같이 해결 시에 단점이 있는데, 데이터를 사용시에 직접 다운 캐스팅이 해야하는 것과 String 타입으로 Set했지만, Get을 했을 시에, Integer로 캐스팅하는 등 잘못된 타입의 인수를 전달 시에 문제가 발생할 수 있다.
  • 즉, 기존 코드와 같이 타입별로 클래스를 만들 경우에는 타입 안정성이 높지만, 코드 재사용성이 낮고, Object를 사용하면 코드 재사용성이 높지만, 타입 안정성이 낮은 문제가 발생한다.
  • 두 마리의 토끼를 잡기 위해 생겨난게 Generic이다.

2. Generic 개념 및 사용법

  • Generic의 사용법은 아래와 같이 Generic 타입의 클래스를 만들고,

public class GenericBox<T> {

	private T value;

	public void set(T value) {
		this.value =value;
	}

	public T get() {
		return value;
	}
}
  • 아래 코드처럼 사용하면 된다.
	public static void main(String[] args) {
		GenericBox<Integer> integerBox = new GenericBox<>();
		integerBox.set(10);
		// integerBox.set("문자100"); -> 문제 발생 
		Integer integer = integerBox.get();
		System.out.println("integer = " + integer);
}
  • 사용 코드를 보면 타입을 받아서 생성되는 것을 볼 수 있는데, 이는 자바 컴파일러가 입력한 타입 정보 기반으로 이런 코드가 있다는 가정하에 컴파일 과정에 타입 정보를 변경하기 때문이다.

1. Generic 용어 정리

  • Generic의 용어를 간단히 정리하자면, Method랑 비슷하다고 생각하면 편하다.

public void method1(String param){
	System.out.println(param); 
}

public static void main(String[] args){
	String a = "test";
    method1(a);
}
  • param 이라는 것은 method에서 매개변수라고 하고,String a 는 인수, 인자라고 불린다.
  • 위와 비슷하게 제네릭 클래스는 GenericBox<T> 에서의 T가 타입 매개변수이고, GenericBox<Integer> 에서 Integer가 타입 인자라고 부른다.
  • 메서드의 매개변수는 사용할 값에 대한 결정을 나중으로 미루는 것 이고, 제네릭의 타입 매개변수는 사용할 타입에 대한 결정을 나중으로 미루는 것이다.

Generic(제너릭) : 일반적인 , 범용적이라는 영어 뜻으로 여러 타입을 범용적으로 사용할 수 있다.
Generic Type(제너릭 타입) : 타입 매개변수를 가지는 클래스, 인터페이스 등 모두 합쳐서 부르는 말


출처

김영한의 실전 자바 - 중급 2편

profile
밤낮없는개발자

0개의 댓글