[JAVA] 제네릭, Comparable, Comparator 정리

sua·2024년 2월 13일

제네릭

여러 타입의 클래스에서 타입을 파라미터처럼 사용 - 타입을 일반화

제네릭 클래스

클래스를 정의할때 클래스 안에서 사용되는 자료형 (타입)을 구체적으로 명시하지 않고 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 뒤에 클래스 대신 인터페이스가 올 수 있음

와일드 카드

  • generic type에서 구체적인 타입 대신 사용
  • 변수로 쓸때 사용

<?> : 타입에 제한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;
		}
	}
}

참고 블로그

profile
뼛속 문과생의 개발로그

0개의 댓글