[Java] 제네릭

thingzoo·2023년 6월 16일
0

Java

목록 보기
13/20
post-thumbnail

제네릭(Generics)

컴파일 시 타입을 체크해주는 기능

  • 타입 안정성 제공
  • 타입체크와 형변환 생략으로 코드 간결

제네릭 클래스(Generic Class)

  • <>안에 Object타입 대신 타입변수(예: T, U, V, E) 사용
  • 참조변수, 생성자에 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);
    }
}

제네릭 문법

용어 정리

public class Generic<T> { ... }

Generic<String> stringGeneric = new Generic<>();
  • Generic<T>: 제네릭 클래스
  • T: 타입변수
  • Generic: 원시 타입

제네릭의 제약

  • static 멤버에 사용 불가능
    • 타입변수는 인스턴스 변수로 간주되므로, 모든 객체에 동일하게 사용 가능한 static 멤버에는 사용 불가
  • 제네릭 배열 생성 불가

제네릭 문법

  1. 다수의 타입변수 사용 가능
    public class Generic<T, U, E> {
    	public E multiTypeMethod(T t, U u) { ... }
    }
  2. 다형성 즉 상속과 타입의 관계는 그대로 적용
    • 두 제네릭 클래스가 상속관계이고 대입된 타입이 일치하면 OK
    • 부모클래스로 타입변수를 지정하고 그안에 자식클래스 대입도 OK
  3. 와일드 카드 "?"를 통해 제네릭의 제한을 구체적으로 지정
    • <? extends T> : T와 그 자손들만 사용 가능
    • <? super T> : T와 그 조상들만 가능
    • <?> : 제한 없음(<? extends Object>와 동일)
  4. 인터페이스의 경우에도 'implements' 대신 'extends' 사용
  5. 메소드를 스코프로 제네릭을 별도 선언 가능(제네릭 메소드)
    • 메소드 반환타입 앞에 타입변수 선언
    • 제네릭 메소드의 타입변수는 해당 메소드에만 적용되기 때문에 메소드 하나를 기준으로 선언하고 사용, 즉 static 메소드에도 사용 가능
    • 같은 이름의 변수를 사용했다고 해도 제네릭 메소드의 타입변수와 제네릭 클래스의 타입변수는 다름
    public class Generic<T, U, E> {
            // Generic<T,U,E> 의 T와 아래의 T는 이름만 같을뿐 다른 변수
        static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
    }

Reference

🔗 스파르타코딩클럽 Java 문법 종합반
🔗 자바의 정석

profile
공부한 내용은 바로바로 기록하자!

0개의 댓글