IT 정보/Java

[Java]제네릭(Generic)

개발자 성장 기록 2022. 5. 16. 22:00
728x90
반응형

Generic 

제너릭을 사용하면 객체를 정의할 때 타입 매개변수를 선언하여 자유롭게 사용할 수 있다.

예시1)

class Generic<T> {
}

class Generic<T> {
	private T t;    
	public T get() { 
    return t; 
    }    
	public void set(T t) {
    this.t = t; 
    }
}


Generic<String> gc = new Generic<String>();

gc.set("choonsik");
System.out.println(gc.get()); 

Generic<Integer> gc2 = new Generic<Integer>();

gc.set(0227);
System.out.println(gc.get()); 

// choonsik
// 0227

위와 같이 generic 클래스를 만들면 객체생성할 때 원하는 타입 매개변수를 넣어 사용할 수 있다.  

 


다이아몬드 연산자<>

위 코드에서 15, 20번 째 줄에 있는 코드를 아래와 같이 사용할 수 있다. (자바 7버전부터 가능)

Generic<String> gc2 = new Generic<>();

Generic<Integer> gc2 = new Generic<>();

와일드 카드 (추후 공부 필요)

제네릭에서 ? 기호를 사용하여 제한을 두지 않는 기호로 의미한다. 

<?> //타입 매개변수에 모든 타입 사용
<? extends T> //T 타입과 T타입을 상속받는 하위 클래스 타입만 사용
<? super T> // T 타입과 T타입을 상속받은 상위 클래스 타입만 사용

이 부분은 아직 잘 모르겟으므로.. 추후에 사용하게 된다면 더 공부해봐야 겠다.


제네릭 메서드

제네릭 클래스는 객체를 생성할 때 타입을 지정한다. - 전역변수처럼 사용 됨
제네릭 메서드는 호출되는 시점에 제네릭 타입을 지정한다.  - 메서드 안에서 지역변수처럼 사용

 public <K, V> void getMethod(K k, V v) {
        System.out.println(k + v);
    }
}

제네릭 메서드 주의!!

제네릭 메서드는 호출되는 시점에 타입이 지정되기 때문에, 호출되기 이전에는 어떤 타입인지 알 수 없다. 
따라서 최상의 클래스인 Object클래스의 메서드만이 사용 가능하다.

제어자 및 타입 메서드 설명
Protected Object clone() 객체의 복제본 생성 후 반환
boolean equals(Object obj) 해당 객체와 전달받은 객체 같은지 확인
protected void finalize() 참조하지 않는 해당 객체를 가비지 컬렉터가 리소스 정리하기 위해 호출
Class <T> getClass 해당 객체의 클래스 타입 반환
int hashCode 해당 객체의 해시 코드값 반환
void notify() 해당 객체의 대기(wait)하고 있는 하나의 스레드를 다시 실행할 때 호출
void notifyAll() 해당 객체의 대기(wait)하고 있는 모든 스레드를 다시 실행할 때 호출
String  toString() 해당 객체의 정보를 문자열로 반환함

 

728x90
반응형