제네릭

2023. 1. 27. 20:51스파르타 내일배움캠프/Java

자바 스터디 준비 자료

 

제네릭은 객체에 넣을 데이터의 타입이 다양할 수 있을 때 사용한다.(물론 파이썬처럼 요소들이 서로 다른 타입일 수 있다는 말이 아니다.)

제네릭을 사용하면 객체 필드/메소드 등에 어떤 타입의 데이터가 들어갈 지 결정하는 것을 선언할 때까지 미뤄둘 수 있다.

 

public class Gmethod <T> {
	public T content;
}

일반적으로 제네릭 타입은 T를 타입 파라미터로 쓴다. 하지만 A-Z까지 어떤 알파벳을 사용해도 좋다.

이 파라미터에 들어가는 타입은 클래스 또는 인터페이스이다. 따라서 자바의 기본 타입(int, long 등등)은 제네릭 타입으로 쓸 수 없다.

 

또 변수를 선언할 때 동일한 타입을 선언한다면 생성자에 타입을 명시하지 않고 <>만 붙일 수 있다.

 

// Address<String> addr = new Address<String>();
// 이 코드를 아래와 같이 바꿀 수 있다.

Address<String> addr = new Address<>();

 

제네릭 타입

클래스나 인터페이스에 제네릭 타입을 사용할 때는 아래와 같이 필요한 모든 타입(A,B, ...)을 작성해준다.

public class 클래스명<A,B, ..> {...}
public interface 인터페이스명<A,B, ...> {...}

 

구체적인 예시는 아래와 같다.

public class Container<K, V> {
	private K key;
    private V value;
    
    public void set(K key, V value) {
    	this.key = key;
        this.value = value;
    }
    public K getKey() {
    	return this.key;
    }
    public V getValue() {
    	return this.value;
    }
}
publi class ContainerExample {
	public static void main(String[] args) {
    	Container<String, String> container = new Container<>();
        container.set("나","한국");
        ...
	}
}

이와 같이 메소드/인터페이스에서 사용할 제네릭 타입을 갯수와 타입에 맞춰서 선언해준다.

 

또 타입 파라미터는 기본적으로 Object 타입으로 간주되므로 Object의 equals() 메소드를 호출하여 비교할 수 있다.

 

 

제네릭 메소드

public <T,A> Container<T> Gmethod(T t, A a) {
}

// 사용법
Container<Integer> cont = Gmethod(1, "가");

클래스나 인터페이스와 달리 필요한 제네릭 타입을 접근자 바로 뒤에 써준다.

 

타입 파라미터를 구체적인 타입으로 제한시킬 수도 있다.

예시로 숫자를 연산하는 제네릭 메소드는 Number 또는 자식 클래스(Byte, Short, Integer, Long, Double)로 제한시킬 수 있다.

public <T extends Number,A> Container<T> Gmethod(T t, A a) {
}

public interface GeInterface<T extends Number> {
}

클래스와 인터페이스에서도 사용할 수 있는데 인터페이스에서도 extends를 사용한다. (implements X)

 

 

와일드카드 타입 파라미터

범위에 있는 모든 타입으로 대체할 수 있는 파라미터

 

public class Course {
	public static void register(Applicant<? extends Student> {} // Student와 그 자식 클래스만 가능
    public static void register(Applicant<?> {} // 어떤 타입이든 가능
}

'스파르타 내일배움캠프 > Java' 카테고리의 다른 글

컬렉션 자료구조  (0) 2023.02.01
스레드  (0) 2023.02.01
예외 처리  (0) 2023.01.13
중첩/익명 클래스  (0) 2023.01.12
인터페이스  (0) 2023.01.11