-
제네릭(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 <T extends 상위 타입> 리턴타입 메소드명(매개변수, ...) { ... }- 타입 파라미터로 설정한 상위 타입 또는 그 자식 객체만 가능하다.
와일드카드 타입파라미터
- 타입 파라미터를 제한하는 다른 방법(방향이 존재)
- 제네릭 타입을 매개 값이나 리턴 타입으로 사용할 때 타입 파라미터로 ?(와일드카드)를 사용할 수 있다.
- ?는 범위에 있는 모든 타입으로 대체 가능하다는 의미.
- 타입 파라미터의 대체 타입으로 해당 클래스와 자식 클래스만 가능
리턴타입 메소드명(제네릭타입<? extends 참조타입> 변수) { ... }- 대체 타입으로 해당 클래스와 부모 클래스만 가능
리턴타입 메소드명(제네릭타입<? spuer 참조타입> 변수) { ... }- 어떤 타입이든 가능 (권장하지 않음)
리턴타입 메소드명(제네릭타입<?> 변수) { ... }
제네릭 메소드
- 타입 파라미터를 가지는 메소드
- 포괄적으로 타입이 지정되어 있는 메소드
public <A, B, ...> 리턴타입 메소드명(매개변수, ...) { ... }'JAVA' 카테고리의 다른 글
Object 클래스 (0) 2023.03.13 중첩 클래스(Nested Class)와 중첩 인터페이스(Nested Interface) (0) 2023.03.10 컬렉션 자료구조(Collection Data Structure) (0) 2023.03.02 Java 표준 라이브러리 (0) 2023.03.02 예외 처리(Exception) (0) 2023.03.02 - 어떤 타입을 결정하지 않고 설계