제네릭
클래스를 정의할때 클래스 안에서 사용되는 자료형 (타입)을 구체적으로 명시하지 않고 T와 같이 타입 매개변수를 이용하는 클래스
-> 따로 타입별로 클래스를 다시 만들어주지 않아도 제네릭 클래스만 선언하면 모든 타입 가져와서 쓸 수 있음
class Box <T> { //T: Stirng, Double, Integer
private T t;
public T getT() {
return t;
}
public T setT(T t) {
this.t = t;
}
}
//제네릭 클래스: 타입을 매개변수화
//<>: 타입 파라미터
public class BoxTest {
public static void main(String[] args) {
Box<Integer> intBox = new Box<Integer>(); //int만 들어갈 수 있는 box
intBox.setT(11);
int num = intBox.getT(); //꺼낼때 형변환할 필요X
Box<String> strBox = new Box<String>(); //str만 들어갈 수 있는 box
strBox.setT("Hi");
String str = strBox.getT();
}
}
타입 파라미터
T: reference Type
E: Element
K: Key
V: Value
변수와 생성 쪽의 타입은 반드시 일치해야함 (상속관계도 마찬가지)
추정 가능한 경우 타입 생략 가능
구체적인 타입의 제한이 필요할 때 extends 키워드 사용
class Box<T extends Number>
//Number의 자손만 타입으로 올 수 있음
& 사용 가능extends 뒤에 클래스 대신 인터페이스가 올 수 있음<?> : 타입에 제한X
<? extends T> : T와 T를 상속받은 타입들만 사용 가능
<? super T> : T와 T의 조상 타입만 사용 가능
Comparable
class Student implements Comparable<Student> {
int age; // 나이
int classNumber; // 학급
Student(int age, int classNumber) {
this.age = age;
this.classNumber = classNumber;
}
@Override
public int compareTo(Student o) {
// 자기자신의 age가 o의 age보다 크다면 양수
if(this.age > o.age) {
return 1;
}
// 자기 자신의 age와 o의 age가 같다면 0
else if(this.age == o.age) {
return 0;
}
// 자기 자신의 age가 o의 age보다 작다면 음수
else {
return -1;
}
}
}
Student : 자기 자신compareTo : 객체를 비교할 기준을 정의해주는 부분파라미터 o : 비교할 객체 -> 자기 자신을 기준으로 상대방과의 차이 값을 비교하여 반환
Comparator
import java.util.Comparator; // import 필요
class Student implements Comparator<Student> {
int age; // 나이
int classNumber; // 학급
Student(int age, int classNumber) {
this.age = age;
this.classNumber = classNumber;
}
@Override
public int compare(Student o1, Student o2) {
// o1의 학급이 o2의 학급보다 크다면 양수
if(o1.classNumber > o2.classNumber) {
return 1;
}
// o1의 학급이 o2의 학급과 같다면 0
else if(o1.classNumber == o2.classNumber) {
return 0;
}
// o1의 학급이 o2의 학급보다 작다면 음수
else {
return -1;
}
}
}