///////
Search
👩🏻

Java Generic에 대해서 설명해 주세요.

핵심
Java Generic은 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 Java 프로그래밍 언어의 기능이다.
특정 타입이 아닌 모든 타입에 함께 작동할 수 있는 클래스, 인터페이스 및 메서드를 만들 수 있어 코드의 재사용성을 높일 수 있다는 장점이 있다.

제네릭이란?

제네릭(Generic)은
클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미
특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것
ArrayList<Integer> list1 = new ArrayList<Integer>(); ArrayList<String> list2 = new ArrayList<String>(); LinkedList<Double> list3 = new LinkedList<Double>(): LinkedList<Character> list4 = new LinkedList<Character>();
Java
복사

Box라는 클래스를 선언하고 내용물에 content 필드를 선언하려고 할 때,

타입을 무엇으로 해야 할까?

Box에는 다양한 내용물을 넣을 예정이라 특정 클래스 타입이 아닌 Object로 선언해보자.
public class box { public Object content; }
Java
복사
→ 모든 객체는 부모 타입으로 자동 타입 변환이 되므로 cotent 필드에는 어떤 객체든 대입이 가능하다.
하지만 문제는 Box 안의 내용물을 얻을 때이다.
content는 Object 타입이므로 어떤 객체가 대입되어 있는지 확실치 않아 얻을 때 마다 강제 타입 변환을 해야한다.
String content = (String) box.content;
Java
복사
이러한 문제점을 어떻게 해결할 수 있을까?
우리는 Box를 생성하기 전에 어떤 내용물을 넣을지 이미 알고 있다. 따라서 Box를 생성할 때 저장할 내용물의 타입을 미리 알려주면 되지 않을까?
→ 제네릭 등장!
위 관점에서 제네릭이란, 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능이다.
public class Box <T> { public T content; } public static void main(String[] args) { Box<String> box = new Box<String>(); box.content = "안녕하세요"; String content = box.content; // 강제 타입 변환 없이 값을 바로 얻음! }
Java
복사

장점 및 활용점

타입 안정성
잘못된 타입이 들어오는 것을 컴파일 단계에서 인지하고 에러 발생시켜 실행 중에 일어나는 에러(RuntimeException)을 방지한다
타입 변환(casting)을 제거
프로그램 성능에 좋지 않은 강제형변환 불필요
코드의 재사용성

특징

클래스, 인터페이스, 메소드를 정의할 때 타입을 파라미터로 사용할 수 있다.
단, 타입 파라미터로 명시할 수 있는 것은 참조 타입(Reference Type)만 가능.
→ int, double, char 같은 primitive type은 올 수 없다.
제네릭 타입을 사용하여 객체를 생성하는 것은 불가능
참조
이것이 자바다 - 책