본문 바로가기
JAVA

java 제네릭(Generic)이란?

by 자바비터 2022. 3. 26.

▶ 제네릭(Generic)이란?

: 클래스 내부에서 사용할 데이터의 타입을 외부에서 지정하는 기법.

즉, 클래스를 정의할 때 매개변수의 데이터 타입을 확정하지 않고, 인스턴스를 생성할 때 데이터 타입을 지정하는 기능이다.

  

  

▶ 제네릭(Generic)의 특정

1) 타입의 안정성, 코드의 간결화

-> 잘못된 타입 사용으로 일어날 수 있는 문제를 제거할 수 있다.

제네릭을 사용하면 구체적인 데이터 타입을 인스턴스에 따라 지정할 수 있어서 중복의 제거와 타입의 안정성을 동시에 추구할 수 있다.

 

2) 복수의 제네릭

-> class Person<T, S>

위와 같은 형식(쉼표로 구분)으로 복수의 제네릭을 사용할 수 있다.

 

3) 기본 데이터 타입과 제네릭

-> 제네릭은 참조 데이터 타입에서만 사용할 수 있다.

기본데이터 타입에서는 래퍼(Wrapper) 클래스를 사용해야 한다.

ex) Integer i = new Integer(10);

위와 같은 기본 데이터 타입인 int형을 써야된다면, int를 참조 데이터 타입으로 변환해주는 int의 래퍼클래스인 Integer를 사용할 수 있다.

 

4) 제네릭의 생략

-> 매개변수의 데이터 타입을 알고 있으면 (위에서 썼다면) 생략해도 된다.

 

5) 메소드에 적용

-> 클래스에서만 쓸 수 있는 것이 아니라, 메소드에서도 쓸 수 있다.

 

6) 제네릭의 제한(Extends)

-> 제네릭으로 올 수 있는 데이터 타입을 특정 클래스의 자식으로 제한할 수 있다.

class Person <T extends Info> {}

   

    

제네릭(Generic) 사용법

-> <>로 표현한다.

<T> : 전달 되는 객체가 클래스의 자료형(type)으로 사용되는 경우

<E> : 전달 되는 객체가 클래스의 요소(Element)로 사용되는 경우

<K> : 전달 되는 객체가 클래스의 키(Key)로 사용되는 경우

<V> : 전달 되는 객체가 클래스의 값(value)로 사용되는 경우

  

   

제네릭(Generic) 예제(1)

class SimplePair<T> { //클래스 옆에 <T>로 가상의 자료형 명시. 만약 <T>를 붙이지 않는다면 변수 선언시에
	//T와 같은 가상의 자료형을 붙이는 것이 불가능하다. 따라서 가상의 자료형을 명시할 경우
	//클래스명 옆에 <가상자료형명>을 입력해준다.
	private T data1;
	private T data2;
	
	public SimplePair(T data1, T data2) {
		this.data1 = data1;
		this.data2 = data2;
	}
	public T getFirst() {
		return data1;
	}
	public T getSecond() {
		return data2;
	}
	public void setFirst(T data1) {
		this.data1 = data1;
	}
	public void setSecond(T data2) {
		this.data2 = data2;
	}
}

public class Ex14 {
	public static void main(String[] args) {
		//객체 변수를 생성하고 데이터를 입력
        //SimplePair 객체 생성시 가상 자료형 String의 자료형 명시
		SimplePair<String> pair = new SimplePair<String>("apple", "tomato");
		//getter 메소드를 통해 데이터를 획득
		System.out.println(pair.getFirst());
		System.out.println(pair.getSecond());
	}
}

실행 결과 화면

   

   

 제네릭(Generic) 예제(2)

public class GenericEx1 <T> {
	T[] v;
	//클래스 옆에 <T>로 가상의 자료형 명시. 만약 <T>를 붙이지 않는다면 변수 선언시에
	//T와 같은 가상의 자료형을 붙이는 것이 불가능하다. 따라서 가상의 자료형을 명시할 경우
	//클래스명 옆에 <가상자료형명>을 입력해준다.
	
	//배열 타입의 인수가 주어졌으므로 매개변수도 배열로 주어져야 한다.
	public void set(T[] n) {
		v = n;
	}
	public void print() {
		//확장 for문을 활용해 데이터 출력
		for(T s : v) //T s -> 반복에 사용할 변수, v -> 배열이름
			System.out.println(s);
	}
}

public class Ex16 {

	public static void main(String[] args) {
		// 객체 생성, 자료형은 String
		GenericEx1<String> t = new GenericEx1<String> ();
		//GenericEx1 객체 생성시 가상 자료형 String의 자료형 명시
		
		//배열 변수 생성
		String[] ss = {"Ye~", "Ah~", "Seo"};
		//setter 메소드를 활용해 객체에 데이터 저장
		t.set(ss);
		//저장된 데이터 출력
		//제네릭 표현으로 인해 별도의 형변환이 필요가 없다.
		t.print();
		}
}

실행 결과 화면

댓글