[Java 무작정 따라하기] 9. JAVA 제네릭, 자바 제네릭 클래스, 자바 제네릭 알아보기

 Java 무작정 따라하기 

9. JAVA 제네릭, 자바 제네릭 클래스, 자바 제네릭 알아보기

 

  • 제네릭 타입, 제네릭 클래스가 무엇인지
  • 제네릭 메소드 및 타입의 제한 등을 알아보자.

 

1. Java 제네릭 클래스

 

제네릭의 의미

  • 제네릭 클래스, 제네릭인터페이스, 제네릭 메소드
    • 클래스, 인터페이스, 메소드를정의할 때 타입매개변수 ( 타입 파라미터 ) 를 선언하고 사용할 수 있다.
  • 제네릭을 사용하는이유
    • 자료형을 한정함으로써 컴파일 시점에 자료형 검사가 가능하도록 하기 위해 사용한다.
      • 컴파일을 한 후, 실행 오류를 찾아 고치는 것이 어렵다.
    • 캐스트(형변환) 연산자의 사용이 불필요하다.
    • 여러 유형에 걸쳐 동작하는 일반화된 클래스/메소드를 정의할 수 있다.
  • ArrayList 클래스를 사용한 예제
    • 아래 예제의 <E> 부분이 타입매개변수 ( 타입 파라미터 ) 라고 보면 된다.
package test;

import java.util.List;

class ArrayList<E> implements List<E>{
	boolean add(E e) {}
	E get(int index) {}
	E remove(int index) {}
}
public class test_arraylist {

	public static void main(String[] args) {
		// 형변환 필요
		List list1 = new ArrayList();
		list1.add("hello");
		String s1 = (String) list1.get(0); 
		
		// 형변환 불필요
		List<String> list2 = new ArrayList<String>();
		list2.add("hello");
		String s2 = list2.get(0); 

	}

}

 

제네릭 클래스

  • 클래스 정의에서 타입 파라미터를 선언하여 만든 클래스를 제네릭 클래스라고 한다.
    • 클래스를 사용할 때는 타입을 명시해야 한다.
    • 필드의 자료형, 메소드 반환형, 인자의 자료형으로 사용할 수 있다.
  • 타입 파라미터는 참조형만 가능하다 ( 자료형 x )
  • 컴파일 할 때, 명확한 타입 검사를 수행할 수 있다.
    • 메소드 호출 시 인자의 유형이 맞는지 검사할 수 있고
    • 메소드 호출 결과를 사용할 때 유형이 맞는지 확인할 수 있다.
  • 자료형을 매개변수로 가지는 클래스와 인터페이스를 제네릭 타입 이라고 한다.

 

제네릭 클래스 정의 방법

  • 문법 :
    • class 클래스 이름 <T1,T2,T3......>{}
    • 클래스를 정의 할 때, 클래스명 오른편, 각 괄호 <> 안에 타입 파라미터를 표시한다.
    • 콤마(,)로 구분, 여러개의 타입 파라미터를 동시에 지정 가능하다.
    • 타입 파라미터는 타입을 전달 받기 위한 용도이다.
    • 타입 파라미터의 이름은 대중적으로 E,K,N,T 등으로 사용한다.
  • 제네릭 클래스 정의 예제
class Data{
// 일반 클래스
	private Object t;
	public void set(Object t) { this.t = t;}
	public Object get() { return t;}
}

class Data<T>{
// 제네릭 클래스
	private T t;
	public void set(T t) { this.t = t;}
	public T get() { return t;}
}

 

제네릭 클래스 사용 방법

  • 제네릭 타입을 사용하지 않으면 컴파일 시점에서 오류를 검출하지 못한다.
  • 의미가 명확한 생성자 호출 시에 괄호만 사용할 수 있다.
    • Data2<String> data = new Data2<>();

 

Raw 타입

  • 제네릭 타입을 일반 타입처럼 사용하는 경우에 지칭하는 용어를 Raw Type이라고 한다.
  • 예)
    • Data2 data = new Data2("hi");
    • Data2는 위에 제네릭 타입 Data2<T>의 raw type이다.
    • 자료형을 Object로 처리한다.

 

2. 제네릭 메소드

 

제네릭 메소드

  • 자료형을매개변수로 가지는 메소드를 제네릭메소드라고 한다.
  • 하나의 메소드 정의로 여러 유형의 데이터를 처리할 때 유용하게 사용된다.
  • 메소드 정의에서 반환형 왼편, 각 괄호<> 안에 타입 매개변수를 가진다.
    • 타입매개변수를 메소드의 반환형이나 메소드의 인자 타입으로도 사용이 가능하다.
    • 지역변수의 타입으로도 사용 할 수 있다.
  • 인스턴스 메소드와 정적(static) 메소드 모두 제네릭 메소드로 정의할 수 있다.
  • 제네릭 메소드를 호출할 때, 타입 명시하지 않아도 인자에 의해 추론가능한 경우 생략 가능하다.
public static <T> T getLast(T[] a){
	return a[a.length-1];
}

 

 

제네릭의 타입 제한

  • 자료형을 매개변수화 하여 클래스,인터페이스,메소드를 정의할 때 자료형에 제한을 두는 것이다.
  • <T extends Number> 와 같이 하면 T를 Number의 서브 클래스로 상한을 정할 수 있다.
class Data<T extends Number>{
	private T t;
}

public class DataTest{
	public static void main(String args[]){
   		// Number의 자식인 Integer로 해도 무방.
    	Data<Integer> data = new Data<Integer>(10);
        System.out.print(data.t);
    }
}

 

제네릭 타입 사용시 주의할 사항

  • 기본 자료형은 타입 매개변수로 지정할 수 없다.
    • Data<double> d = new Data<>(); // ERROR
  • 타입 매개변수로 객체 생성을 할 수 없다.
    • class Data<T> { private T t1 = new T(); } // ERROR
  • 타입 매개변수의 타입을 static 필드로 선언 할 수 없다.
    • class Data<T> { private static T t; } // ERROR
  • 제네릭 타입의 배열을 선언할 수 없다.
    • Data <Double>[] array_double; // ERROR

 

 

내용이 유익하셨다면 구독 및 좋아요 클릭 부탁드려요 :)

오늘 하루도 즐거운 하루 보내세요!