[Java] Generics

Jeon817·2023년 4월 17일

Java

목록 보기
2/4

[제네릭 이란?]

  • 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능입니다.
  • 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어듭니다.
  • 제네릭은 클래스 또는 메서드에 사용 할 수 있습니다. 클래스 이름 뒤에 <> 문법 안에 들어가야 할 타입 변수를 지정합니다.

ex) 제네릭 클래스 선언

class Box<T> { 
	T item;
   
    void setItem(T item) {
    	this.item = item;
    }
   
    T getItem() {
    return item;
    }
}
// Box<T> -> 제네릭 클래스, 'T의 박스' 라고 읽는다.
// T -> 타입 변수 또는 타입 매개변수(자주 사용되는 변수명으로는 T,U,V,E 등이 있다)
// Box -> 원시 타입

[제네릭의 제한]
1) 객체의 static 멤버에 사용 할 수 없습니다.
2) 제네릭 배열을 생성 할 수 없습니다.

[제네릭 문법]
1) 다수의 타입변수를 사용 할 수 있습니다.
2) 다형성 즉, 상속과 타입의 관계는 그대로 적용됩니다.
3) 와일드 카드를 통해 제네릭의 제한을 구체적으로 정할 수 있습니다.

  • '<? extends T>' : T와 그 자손들만 사용 가능
  • '<? super T>' : T와 그 조상들만 가능
  • '<?>' : 제한 없음

[제네릭 사용 흐름]

// 1.
public class Generic<T> {
		// 2.
    private T t;
    // 3.
    public T get() {
        return this.t;
    }

    public void set(T t) {
        this.t = t;
    }

    public static void main(String[] args) {
				// 4.
        Generic<String> stringGeneric = new Generic<>();
				// 5.
        stringGeneric.set("Hello World");
				
        String tValueTurnOutWithString = stringGeneric.get();

        System.out.println(tValueTurnOutWithString);
    }
}

1) 제네릭은 클래스 또는 메서드에 사용 할 수 있습니다. 클래스 이름 뒤에 <> 문법 안에 들어가야 할 타입 변수를 지정합니다.

2) 선언 해둔 타입 변수는 해당 클래스 내에서 특정한 타입이 들어갈 자리에 대신 들어갈 수 있습니다. 2번에서는 private 프로퍼티인 t의 타입이 들어가야 할 자리에 들어갔습니다.

3) 메서드의 리턴타입에 들어가는 것 역시 마찬가지 입니다.

4) 여기부터는 제네릭을 통해 구현한 클래스를 사용하는 부분입니다, 클래스에 선언했기 때문에 인스턴스를 만들기 위해서 타입변수에 들어갈 실제 변수의 값을 넣어줘야 합니다. 여기서는 String입니다.

5) 아까 타입변수로 대체 해뒀던 곳에 String이 들어가있기 때문에, 이와 같이 사용 할 수 있습니다.

0개의 댓글