ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 제네릭(Generic)
    JAVA 2023. 3. 2. 21:50

    제네릭(Generic) : 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능.

    • 어떤 타입을 결정하지 않고 설계
      - 필드 생성, 생성자, 매개변수 등
      - 설계할 때는 구체적인 타입을 설정하지 않고, 실행할 때 설정하는 기능

    • Object 타입으로 선언하는 방법
      - 자바의 모든 객체를 저장할 수 있다. (자바의 모든 클래스는 Object의 자식 클래스이기 때문)
      - Object 객체에 저장된 것을 꺼내려고 할 때 실제 어떤 타입인지 알기 어렵기 때문에 원래대로 복원하는데 어려움이 있다.

    • 데이터 타입을 일반화. <>로 표시
    public class Box<T> {
       public T content;
    }

     

    • 단, 클래스를 선언할 때의 데이터 타입과 생성자를 호출할 때의 데이터 타입이 일치해야 한다.
    Box<String> box = new Box<String>();
    Box<String> box = new Box<>();    //생성자의 데이터 타입은 생략할 수 있다.

     

    • 강제 타입 변환이 일어나지 않는다.
    • int, double 등의 기본 타입은 올 수 없고, 참조 타입만 가능하다.
    • 제네릭 사용 시 구체적인 타입을 명시하지 않으면 Object 타입의 객체를 생성한다.

     


    제네릭 타입

    • 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스
    • <> 안의 타입을 타입 파라미터라고 한다.
    public class 클래스명<A, B, ...> { ,,, }
    public interface 인터페이스명<A, B, ...> { ,,, }

     

    • 타입 파라미터는 한 번에 여러 개 가질 수 있다.

    • 기본적으로 타입 파라미터는 Object 타입으로 간주되기 때문에 Object가 가지는 메소드(equals() 등)를 사용할 수 있다.

     


    제한된 타입 파라미터

    • 타입 파라미터는 기본적으로 Object 타입으로 간주하지만 Object 타입은 너무 포괄적이기 때문에 타입 파라미터를 대체하여 사용할 타입을 제한해서 사용할 수 있다.
      예) 숫자는 Number 또는 그 자식 클래스(Byte, Short, Integer 등)로 제한할 필요가 있다.

     

    public <extends 상위 타입> 리턴타입 메소드명(매개변수, ...) { ... }

     - 타입 파라미터로 설정한 상위 타입 또는 그 자식 객체만 가능하다.

     


    와일드카드 타입파라미터

    • 타입 파라미터를 제한하는 다른 방법(방향이 존재)
    • 제네릭 타입을 매개 값이나 리턴 타입으로 사용할 때 타입 파라미터로 ?(와일드카드)를 사용할 수 있다.
       - ?는 범위에 있는 모든 타입으로 대체 가능하다는 의미.

     

    • 타입 파라미터의 대체 타입으로 해당 클래스와 자식 클래스만 가능
    리턴타입 메소드명(제네릭타입<extends 참조타입> 변수) { ... }

     

    • 대체 타입으로 해당 클래스와 부모 클래스만 가능
    리턴타입 메소드명(제네릭타입<? spuer 참조타입> 변수) { ... }

     

    • 어떤 타입이든 가능 (권장하지 않음)
    리턴타입 메소드명(제네릭타입<?> 변수) { ... }

     


    제네릭 메소드

    • 타입 파라미터를 가지는 메소드
      - 포괄적으로 타입이 지정되어 있는 메소드
    public <A, B, ...> 리턴타입 메소드명(매개변수, ...) { ... }

     

Designed by Tistory.