728x90
자바의 제네릭에 대해 배워보겠다. (이것이 자바다 에서 참조)
/* 쓰는 이유 */
1. 컴파일 시 강한 타입체크를 할 수 있다. 그러므로 타입변환 관련 에러를 사전에 방지할 수 있다.
2. 위랑 비슷한 내용으로 타입 변환을 제거한다. 강제 타입 변환을 쓰는 경우에는 에러를 피할 수는 있지만 성능 저하를 불러일으킨다.
/* 제네릭 예시 1 (기본 형식) */
public class Box<T> {
public T content; // 제네릭 타입을 T로 사용
}
public class CheckBox {
public static void main(String[] args){
Box<String> box1 = new Box<>(); // Box 타입을 String으로 변경
Box<Integer> box2 = new Box<>(); // Box 타입을 Integer으로 변경
bo1.content = "Hello Generic!";
box2.content = 21;
System.out.println(bo1.content); // Hello Generic!
System.out.println(bo2.content); // 21
}
}
/* 제네릭 예시 2 (제네릭 타입이 객체인 경우) */
public class Table<K,V>{
private K key;
private V value;
public K getKey(){
return this.key;
}
public V getValue(){
return this.value;
}
public void setKey(K key){
this.key = key;
}
public void setValue(V value){
this.value = value;
}
}
public class SettingTable {
class RoundTable{}
class SquareTable{}
public static void main(String[] args){
Table<RoundTable, Integer> table1 = new Table<>(); //K는 RoundTable 객체타입
table1.setKey(new RoundTable());
table1.setValue("RoundTable");
RoundTable roundTable = table1.getKey(); //리턴값은 RoundTable.
}
}
/* 제네릭 예시 3 (제네릭 메소드) */
public class checkBox{
public static <T> Box<T> boxing(T t){ //제네릭 메소드 boxing 선언
Box<T> box = new Box<T>();
box.set(t);
return box;
}
public static void main(String[] args){
Box<String> box = boxing("This is box");
}
}
/* 제네릭 예시 4 (타입을 사전에 제한) */
public <T extends Number> boolean compareNumber(T t1, T t2){
double d1 = t1.doubleValue();
double d2 = t2.doubleValue();
return (d1==d2);
}
// 타입 T를 Number타입과 자식클래스(Integer, Double ...)로 제한
/* 제네릭 예시 4 (와일드카드 타입 패러미터) */
이 내용을 설명하기 전, 다음과 같은 상속관계를 정의해보겠다.
부모 객체 -- Person
Person의 자식 객체 -- Worker, Student
Student의 자식 객체 -- HighStudent, MiddleStudent
그럼 이와 같이 설정 가능하겠다.
public class Person {}
class Worker extends Person{} // Worker -- Person
class Student extends Person{} // Student -- Person
class HighStudent extends Student {} // HighStudent -- Student
class MiddleStudent extends Student {} //Middle Student -- Student
public class Applicant<T> {
public T kind;
public Applicant(T kind){
this.kind = kind;
}
}
이 객체들을 이용해 와일드카드 타입 패러미터를 적용시켜보겠다.
public class Course {
/* 모든 객체가 등록할 수 있다 */
public static void registerCourse1 (Applicant<?> applicant){
System.out.println(applicant.kind.getClass().getSimepleName());
}
/* 학생만 등록할 수 있다 (즉, MiddleStudent와 HighStudent도 등록가능) */
public static void registerCourse2 (Applicant<? extends Student> applicant){
System.out.println(applicant.kind.getClass().getSimepleName());
}
/* 직장인 및 일반인만 등록 가능 */
public static void registerCourse1 (Applicant<? super Worker> applicant){
System.out.println(applicant.kind.getClass().getSimepleName());
}
728x90
'자바' 카테고리의 다른 글
[JAVA] 컬렉션 - LinkedList (0) | 2024.02.07 |
---|---|
[JAVA] 벡터 Vector (0) | 2024.02.06 |
[JAVA] 컬렉션 - ArrayList (0) | 2024.02.05 |
[Java] Predicate 인터페이스 (1) | 2023.12.20 |
[JAVA] 람다식 (Lambda Expression) (0) | 2023.11.23 |