내일배움캠프 8일차 TIL : Java - 제네릭

김원기·2024년 4월 30일

TIL

목록 보기
11/42
post-thumbnail

내일배움캠프 8일차 TIL : Java - 제네릭

제네릭

왜 쓸까?

  1. 타입 언어에서 중복되거나 필요 없는 코드를 줄여주는 것
  2. 타입 안정성을 해치지 않는 것

자바는 타입을 지정해야 하는 타입 언어인데 생성자를 나 메서드 오버로딩을 위해 같은 로직을 여러번 구현하는 불편함이 있다.

이러한 불편함을 해결하기 위한 수단으로 하나의 함수를 구현하는 방식이다.

제네릭 용어

public class Generic<T> {...}

Generic<String> stringGeneric = new Generic<>;
  1. public class Generic<T> {...}
    -> 제네릭을 활용한 클래스를 제네릭 클래스라 하며 원시 타입이라고 한다.
  1. <> 사이에 들어가는 변수명 T는 타입 변수라 하며
    -> 여기서 String이 특정한 타입이 된다.

제네릭의 제한

  • static 멤버에 사용할 수 없다.
  • 제네릭 배열을 생성할 수 없다.

제네릭의 문법

// 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. 제네릭은 클래스 또는 메서드에 사용할 수 있다.
    -> 클래스 이름 뒤에 <> 안에 들어가야 할 타입 변수를 지정한다.
  1. 선언 해둔 타입변수는 해당 클래스 내에서 특정한 타입이 들어가야 할 자리에 대신 들어갈 수 있다.
  1. 메서드의 리턴 타입에도 들어갈 수 있다.
  1. 제네릭을 통해 구현한 클래스를 사용하는 부분.
    -> 클래스를 사용하기 위한 인스턴스 생성을 위해 실제로 변수 값을 넣아야 한다.
  1. 실제 타입 변수를 선언했기 때문에 사용이 가능하다.

상세 문법

  1. 다수의 타입 변수를 사용할 수 있다. (멀티 타입 파라미터)
public class Generic< T, U, V, E ...> { ... }
  1. 상속과 타입의 관계는 그대로 적용된다.
    -> 부모 클래스로 제네릭 타입 변수를 지정하고, 자식 클래스를 넘기는 것이 가능하다.
  1. 메서드를 스코프로 제네릭을 별도 선언이 가능하다.
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }

반환타입 앞에 <> 제네릭을 사용한 경우 해당 메서드에만 적용되는 제네릭 타입 변수를 선언할 수 있다.

타입 변수를 클래스 내부의 인스턴스 변수 취급하기 때문에 제네릭 클래스의 타입 변수를 static 메서드에서는 사용이 불가능 하지만,
제네릭 메서드의 제네릭 타입 변수는 해당 메서드에서만 적용되기 때문에 사용이 가능하다.

같은 이름의 변수를 사용했다고 해도 제네릭 메서드의 타입 변수는 제네릭 클래스의 타입 변수와 다르다.

  1. 와일드 카드를 통해 제네릭의 제한을 구체적으로 정할 수 있다.

와일드 카드

와일드 카드를 알기 전에 공변과 불공변에 대해 알아야 한다.

공변 : A가 B의 하위 타입일 때 T<A>T<B>의 하위 타입이면 T는 공변
불공변 : A가 B의 하위 타입일 때 T<A>T<B>의 하위 타입이 아니면 T는 불공변

제네릭은 불공변이다.

모든 타입을 대신할 수 있는 와일드카드 타입 <?> 가 추가되면서 와일드 카드는 정해지지 않은 타입이기 때문에 모든 타입에 대해 호출이 가능해졌다.

하지만 단순히 <?>로 사용하면 Object타입과 다름이 없으므로 제네릭 타입 한정 연산자와 함쎄 사용된다.

와일드 카드의 타입 범위를 제한하는 extends, super 가 있다.

  1. <? extends T> : T와 자손만 사용 가능
  2. <? super T> : T와 조상만 사용 가능

끝!

후기1. 제네릭은 복습좀 많이 해야할듯... 기본적인 개념은 어렵지 않은거 같은데...

참고

제네릭 : https://blog.naver.com/zzang9ha/222059024135
와일드카드 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%99%80%EC%9D%BC%EB%93%9C-%EC%B9%B4%EB%93%9C-extends-super-T-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4#

profile
혼자 공부하는 블로그라 부족함이 많아요 https://www.notion.so/18067a27ac7e4f4790dde645fb3bf3d3?pvs=4

0개의 댓글