[Java] 제네릭 (Generic)

2023. 1. 11. 19:28기술 창고/Java

728x90
반응형
SMALL

제네릭 (Generic)

제네릭은 데이터 형식에 얽매이지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법이다.

 

자바에서 ArrayList를 생성할 때 

ArrayList<String> arr1 = new ArrayList<>();

이런 식으로 생성을 하곤 한다.

 

여기서 <> 다이아 표기법으로 타입을 지정해준뒤 생성을 한다.

제네릭도 동일하게 <> 안에 포괄적인 데이터 형식을 지정해준 뒤 생성을 한다.

 

 

제네릭 필요성

어떠한 기능을 구현하여 어떠한 데이터를 지원하게하여 배포하려고 한다면, String 타입, Integer 타입 등등 수많은 타입을 지원하고 싶다면 일반적으로 String 형식 생성, Integer 형식 생성 이렇게 타입에 따라 일일히 하나씩 만들 것이다.

 

이러한 방법은 간단한 프로젝트나 기능 구현에 있어서는 괜찮을 수 있으나 복잡하고 엔터프라이즈급 프로젝트의 경우 비효율적일 수 있다.

제네릭은 이런 비효율적인 문제점을 해결하기 위한 방법이다.

 

제네릭은 클래스 내부에서 지정하는 것이 아니라 외부에서 사용자에 의해 지정되는 것을 뜻한다.

한마디로 타입을 미리 지정해주는 것이 아니라 필요해 의해 자동 지정될 수 있도록 하는 일반(Generic) 타입이라는 것이다.

 

 

제네릭 장점

1. 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.

2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.

3. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

 

 

제네릭 사용 방법

타입 설명
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number

일반적으로 <>안에 선언하는 타입들을 위의 표처럼 정해진 것처럼 표기하곤 하지만 반드시 저렇게 표기하지 않아도 된다.

<T> 가 아니라 <type> 이라고 적어도 되는것이다.

 

 

제네릭 사용 클래스 및 인터페이스 선언

public class ClassName <T> { ... }
public Interface InterfaceName <T> { ... }

클래스 이름 옆에 <T> 로 제네릭임을 명시하여 선언 생성한다.

해당 <T> 타입은 클래스 / 인터페이스의 { ... } 내부 까지 유효하다.

 

public class ClassName <T, K> { ... }
public Interface InterfaceName <T, K> { ... }

또한, HashMap 처럼 <>안에 key, value에 제네릭을 사용하여 선언할 수도 있다.

 

이런식으로 데이터 타입을 외부로부터 지정할 수 있도록 하는 것이다.

 

 

제네릭 클래스 사용

public class ClassName <T, K> { ... }
 
public class Main {
	public static void main(String[] args) {
		ClassName<String, Integer> a = new ClassName<String, Integer>();
	}
}

제네릭 타입의 클래스를 선언하고 각각 String, Integer 타입을 주입함으로서 해당 제네릭 클래스를 사용한다.

이 때 주의해야할 점은 <>안에 타입을 명시해줄 수 있는 것은 참조 타입 뿐이다.

즉, int, double, char 등과 같은 원시 타입(primitive type)은 넣을 수 없다.

int형, double형 과 같은 원시 타입의 경우 Integer, Double 과 같은 Wrapper 타입으로 명시하여 사용할 수 있다.

 

public class ClassName <T> { ... }
 
public class Student { ... }
 
public class Main {
	public static void main(String[] args) {
		ClassName<Student> a = new ClassName<Student>();
	}
}

참조 타입을 넣어서 사용할 수 있다는 것은 사용자가 만든 객체 타입을 넣어서 사용할 수도 있다는 뜻이다.

 

 

# 추가 정리 필요!

https://st-lab.tistory.com/153

 

728x90
반응형
LIST

'기술 창고 > Java' 카테고리의 다른 글

[Java] Stack / Heap  (0) 2023.01.12
[Java] 자바 컴파일 과정  (0) 2023.01.12
[Java] JVM (Java Virtual Machine)  (1) 2023.01.11
[Java] 동일성 (Identity) / 동등성 (equality)  (0) 2023.01.09
[Java] Java Map 내부 구현 파악  (0) 2023.01.06