제네릭
제네릭이란 무엇입니까?
- 다른 형식의 개체를 처리하는 메서드 또는 컬렉션 클래스에 대한 컴파일 타임 형식 검사.하는 기능
- 유형 안정성 보장그래서 지정된 유형 이외의 입력을 방지할 수 있습니다.
- 유형 검사 및 캐스팅 건너뛰기그래서 코드가 짧다
예
예 1
제네릭 의약품을 사용하기 전에
package javaStandard.chapter12;
public class _01_Generics {
public static void main(String() args) {
// 제네릭스
Integer() iArray = {1, 2, 3, 4, 5};
Double() dArray = {1.0, 2.0, 3.0, 4.0};
String() sArray = {"A", "B", "C", "D", "E"};
printIntegerArray(iArray);
printDoubleArray(dArray);
printStringArray(sArray);
}
private static void printIntegerArray(Integer() iArray) {
for (Integer i : iArray) {
System.out.println(i + " ");
}
System.out.println();
}
private static void printDoubleArray(Double() dArray) {
for (Double i : dArray) {
System.out.println(i + " ");
}
System.out.println();
}
private static void printStringArray(String() sArray) {
for (String i : sArray) {
System.out.println(i + " ");
}
System.out.println();
}
}
제네릭 의약품을 사용한 후
package javaStandard.chapter12;
public class _01_Generics {
public static void main(String() args) {
// 제네릭스
Integer() iArray = {1, 2, 3, 4, 5};
Double() dArray = {1.0, 2.0, 3.0, 4.0};
String() sArray = {"A", "B", "C", "D", "E"};
printAnyArray(iArray);
printAnyArray(dArray);
printAnyArray(sArray);
}
private static <T> void printAnyArray(T() array) {
for (T t : array) {
System.out.println(t + " ");
}
System.out.println();
}
}
- 제네릭을 사용하기 전에 인쇄하려는 형식에 적합한 메서드를 선언해야 했습니다.
- 하지만 이 과정은 너무 길고 번거롭기 때문에 제네릭으로 메서드를 선언하면 간결하게 표현할 수 있습니다.
- 제네릭을 사용하는 경우 type에 관계없이 printAnyArray를 통해 출력되는지 확인할 수 있습니다.
Type의 첫 글자인 T를 사용하므로 철자가 어떤 식으로든 상관 없습니다.
예 2
package javaStandard.chapter12.coffee;
public class Coffee<T> {
public T name;
public Coffee(T name) {
this.name = name;
}
public void ready() {
System.out.println("커피 준비 완료 : " + name);
}
}
package javaStandard.chapter12;
import javaStandard.chapter12.coffee.*;
import javaStandard.chapter12.user.User;
import javaStandard.chapter12.user.VIPUSer;
public class _02_GenericClass {
public static void main(String() args) {
//제네릭스
Coffee<Integer> c5 = new Coffee<>(35);
c5.ready();
Coffee<String> c6 = new Coffee<>("조세호");
c6.ready();
}
}
결과
더보기
커피가 준비되었습니다: 35
커피가 준비됐다 : 조세호
- 커피 클래스에서는 모든 유형을 다음과 같이 분류했습니다.
표시되고 사용될 때 값에 대한 적절한 유형이 결정되었습니다. - 필요한 유형으로 코드를 작성할 수 있기 때문에 더 편리합니다.
예 3
package javaStandard.chapter12.coffee;
import javaStandard.chapter12.user.User;
public class CoffeeByUser <T extends User> {
public T user;
public CoffeeByUser(T user) {
this.user = user;
}
public void ready(){
System.out.println("커피 준비 완료 : " + user.name);
user.addPoint();
}
}
package javaStandard.chapter12.user;
public class User {
public String name;
public User(String name) {
this.name = name;
}
public void addPoint() {
System.out.println(this.name + "님, 포인트 적립되었씁니다.");
}
}
package javaStandard.chapter12;
import javaStandard.chapter12.coffee.*;
import javaStandard.chapter12.user.User;
import javaStandard.chapter12.user.VIPUSer;
public class _02_GenericClass {
public static void main(String() args) {
//제네릭스
CoffeeByUser<User> c7 = new CoffeeByUser<User>(new User("강호동"));
c7.ready();
CoffeeByUser<User> c8 = new CoffeeByUser<>(new VIPUSer("서장훈"));
c8.ready();
}
}
결과
더보기
커피가 준비됐다: 강호동
강호동, 포인트가 쌓였다.
커피가 준비됐다: 스페셜 서장훈
스페셜 서장훈, 포인트가 쌓였다.
- 공개 클래스 CoffeeByUser
{ // 어떤 타입이든 상관없지만 User 클래스에서 상속받은 T를 사용해야 한다는 뜻입니다.
청소
- 과거에는 서로 다른 타입을 다루는 메서드의 파라미터나 리턴 타입으로 객체 타입 참조 변수를 많이 사용했고, 타입 변환이 불가피했다.
- 이제 제네릭을 사용하고 개체 유형 대신 원하는 유형을 지정하기만 하면 됩니다!