제너릭은 모든 어떤 타입의 자료형을 사용하게 될지 불분명할 때 또는 자료형을 미리 지정하지 않고 사용하기 위해

JAVA5 부터 등장했다.

 

제너릭은 컬렉션, 람다식 등 수 많은 곳에서 사용할 수 있고 자료형을 미리 지정하지 않기에 많은 장점을 갖는다.

 

1. 제너릭의 장점

1). 폭 넓은 사용 범위

제너릭은 자료형을 미리 지정하지 않을 수 있어, 자료형을 사용하는 대부분의 위치는 제너릭으로 대체가 가능하다.

자료형을 사용하는 위치는 클래스, 인터페이스, 메소드 파라미터 등을 말한다.

 

2) 강력한 컴파일 진행

자바 컴파일러는 코드상에서 잘못 사용된 타입의 사용으로 발생하는 에러(버그)에 대해 강하게 컴파일을 진행한다.

따라서 프로그램을 구현하는데 자료형 사용에 대한 안정성이 높아진다.

 

3) 형변환(Casting)이 필요없다.

형변환의 과정은 처리속도를 저하시킨다. 하지만 제너릭을 사용하면 형변환이 필요없기에 처리 속도가 향상된다. 또한 형변환으로 인해 발생하는 런타임 에러를 사전에 예방이 가능하다.

 

2. 제너릭 클래스(인터페이스)

제너릭 타입을 파라미터로 가지는 클래스와 인터페이스를 의미한다. 타입이란 < > 사이에 위치한 파라미터이다.

public class ClassName <T>
interface InterfaceName <T>
 

코드에서 <T> 가 타입 파라미터이며 제너릭을 사용한 클래스 또는 인터페이스임을 나타낸다. 이렇게 제너릭으로

선언된 클래스는 어떤 자료형이 들어오면 자동으로 들어온 자료에 맞는 자료형으로 변환된다.

 

<제너릭을 사용한 Box 클래스 선언>

public class Box <T> {
	private T tdata;	// T : Type Parameter

	public T getTdata() {
		return tdata;
	}

	public void setTdata(T tdata) {
		this.tdata = tdata;
	}
	
}
 

먼저 Box<T> 클래스를 보면 제너릭을 사용한 클래스라는 것을 볼 수 있다. 또한 어떤 자료형인지는 모르지만

T 라는 단어가 각 메소드에서 자료형을 들어갈 자리를 차지한 것을 볼 수 있다.

이제 main 을 살펴보자.

 

<Box 클래스를 사용하는 main 클래스>

public class CFClass {

	public static void main(String[] args) {
		GenericMethod();
  }
        public static void GenericMethod() {
		
		 Box<Integer> b1 = new Box<Integer>();
		 b1.setTdata(10);
		 System.out.println("<Integer> : " + b1.getTdata());
		 
		 Box<Float>b2 = new Box<Float>();
		 b2.setTdata(3.14f);
		 System.out.println("<Float> : " + b2.getTdata());
	}
}
 

 

main 에서 GenericMethod() 를 보면 Box<Integer> 또는 Box<Float> 가 들어간 것을 볼 수 있다.

이제 실행 결과를 보면 정상적으로 입력해준 정수와 실수가 출력된 것을 볼 수 있다.

이는 <T> 가 때로는 정수형 자료형이 되기도 하며 실수형 자료형이 되기도 한다는 것을 알 수 있다.

즉, T는 '어떤' 자료형에 대한 대표 이름이며 제너릭 클래스의 인스턴스를 만들 때 정확한 형태가 정해지는 것이다.

 

3. 제너릭 타입 파라미터 명명 규칙

타입 명명 규칙은 일반적으로 변수를 만드는 방법과 같은 규칙을 갖는다. 하지만 암묵적으로 자주 사용하는 이름은

다음과 같다.

1) E : element (컬렉션 프레임워크에서 사용)

2) K: Key(데이터베이스 키값 등에서 사용)

3) N: Number

4) T: Type (자료형)

5) V: Value (값)

 

'JAVA' 카테고리의 다른 글

BufferedInputStream  (0) 2022.08.28
BigDecimal  (0) 2022.08.28
Wrapper 클래스  (0) 2022.08.28
StringBuffer  (0) 2022.08.28
String 클래스 문자열 메소드  (0) 2022.08.28

+ Recent posts