제네릭을 사용하는 이유
1. 중복되거나 필요없는 코드를 줄여주는 것
function plusReturnFunction(a, b) {
return a + b;
}
const a = 1;
const b = 2;
const c = 1.1;
const d = "hello";
plusReturnFunction(a + b); // 3
plusReturnFunction(a + c); // 2.1
plusReturnFunction(a + d); // 1hello
public class Generic {
public String plusReturnFunction(int a, int b) { ... }
public String plusReturnFunction(int a, long b) { ... }
public String plusReturnFunction(int a, String b) { ... }
}
코드가 길어질수록 더욱 시인성이 좋아진다.
2. 타입 안정성을 해치지 않는다
제네릭 문법 살펴보기
1. 용어 정리
public class Generic<T> { ... }
Generic<String> stringGeneric = new Generic<>();
- Generic<T>의 클래스처럼, 제네릭을 사용한 클래스를 제네릭 클래스라고 합니다.
- 제네릭에서 <>사이에 들어가는 변수명 T는 타입 변수라고 합니다.
- Generic 클래스를 원시 타입이라고 합니다.
2. 제네릭의 제한
static T get() { ... } // 에러
static void set(T t) { ... } // 에러
- 객체의 static멤버를 사용할 수 없다
- 타입 변수는 인스턴스 변수로 간주되고, 모든 객체에 동일하게 동작해야 하는 static 필드 특성상 사용 불가
- 제네릭 배열을 생성할 수 없다
3. 제네릭의 문법
- 다수의 타입 변수를 사용할 수 있다
public class Generic<T, U, E> {
public E multiTypeMethod(T t, U u) { ... }
}
Generic<Long, Integer, String> instance = new Generic();
instance.multiTypeMethod(longVal, intVal);
- 다형성 즉 상속과 타입의 관계는 그래도 적용
a. 대표적으로 부모 클래스를 제네릭 타입 변수로 지정하고, 그 안에 자식 클래스를 넘기는 것은 잘 동작합니다
- 와일드카드를 통해 제네릭의 제한을 구체적으로 정할 수 있다
public class ParkingLot<T extends Car> { ... }
ParkingLot<BMW> bmwParkingLot = new ParkingLot();
ParkingLot<Iphone> iphoneParkingLot = new ParkingLog(); // error!
a. <? extends T> : T와 그 자손들만 사용가능
b. <? super T> : T와 그 조상들만 가능
c. <?> : 제한 없음
4. 메소드를 스코프로 제네릭을 별도로 선언 할 수 있다
// 또는 ..
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
a. 이렇게 반환 타입 앞에 <> 제네릭을 사용한 경우, 해당 메서드에만 적용되는 제네릭 타입 변수를 선언할 수 있습니다.
b. 타입 변수를 클래스 내부의 인스턴스 변수 취급하기 때문에 제네릭 클래스의 타입 변수를 static 메서드에는 사용할 수 없었지만,
제네릭 메소드의 제네릭 타입 변수는 해당 메소드에만 적용되기 때문에 메소드 하나를 기준으로 선언하고 사용할 수 있습니다.
c. 같은 이름의 변수를 사용했다고 해도 제네릭 메소드의 타입 변수는 제네릭 클래스의 타입 변수와 다릅니다.
public class Generic<T, U, E> {
// Generic<T,U,E> 의 T와 아래의 T는 이름만 같을뿐 다른 변수
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
}
'내일배움캠프 > TIL' 카테고리의 다른 글
[JAVA] 키오스크 트레블 슈팅 Lv1~Lv2 (0) | 2025.01.16 |
---|---|
[JAVA]_클래스 기초 다시 익히기 (0) | 2025.01.14 |
[Java]_예외 인식과 처리 (0) | 2025.01.09 |
[Java] 클래스를 사용하여 기본연산 계산기 만들기 트러블슈팅 (0) | 2025.01.08 |
[Java] 클래스 없는 계산기 트러블슈팅 (0) | 2025.01.08 |