본문 바로가기

자바

[JAVA] 제네릭 타입

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