자바(Java) 제네릭

유필선·2024년 3월 8일
0

자바(Java)

목록 보기
10/20

제네릭(Generic)

<> 제네릭 : 리스트의 제약사항을 만들어줌 -> 굳이 형변환을 하지 않아도 된다.(무조건 한 종류의 타입만 사용 가능)
클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법
1. 데이터의 타입(data type)을 일반화(genaralize) 한다는 의미이다.
2. 클래스나 메서드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다.
3. 이렇게 컴파일 시에 미리 타입 검사(type check)를 수행하면 다음과 같은 장점이 있다.

제네릭의 장점

  • 클래스나 메서드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다.
  • 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.
  • 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
  • 비슷한 기능을 지원하는 경우 코드의 재사용성을 높일 수 있다.

제네릭은 배열의 타입을 지정하듯이 리스트 자료형 같은 컬렉션 클래스나 메서드에서 사용할 내부 데이터 타입(type)을 파라미터(parameter) 주듯이 외부에서 지정하는 타입을 변수화 한 기능이라고 이해하면 된다.

다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스는 어떤 자료를 담을지 알 수 없기 때문에 최상위 객체인 Object 타입으로 저장, 관리된다. 이 경우 의도치 않은 자료형이 담겨 실행 시에 오류가 발생할 수 있는데, 해당 오류는 컴파일 시에는 알 수 없는 오류지만 제네릭(Generic) 타입을 지정하면 컴파일 시 오류를 확인할 수 있게 된다.

"제네릭 사용"

// 클래스
public class 클래스이름 <T> { ... }

// 인터페이스
public Interface 인터페이스이름 <T> { ... }

// 제네릭 타입을 두 개 이상 사용하는 경우
public class 두_개_이상 <K, V> { ... }

제네릭의 선언 및 생성

  • 클래스, 인터페이스 또는 메서드에 선언할 수 있다.
  • 동시에 여러 타입을 선언할 수 있다.
  • 와일드 카드를 이용하여 타입에 대하여 유연한 처리를 가능하게 한다.
  • 제네릭 선언 및 정의시에 타입의 상속 관계를 지정할 수 있다.

아래 표의 타입들이 가장 많이 사용 됨.

class Array<T> {
	T element;
    void setElement(T element);
}

타입 파라미터는 정해진 규칙은 없지만 일반적으로 대문자 알파벳으로 표현한다.

제네릭 클래스

클래스를 설계할 때 구체적인 타입을 명시하지 않고 타입 파라미터로 넣어두었다가 실제 설계한 클래스가 사용되어질 때 구체적인 타입을 ㅌ지정하면서 사용하면 타입 변환을 지정하면서 사용하면 타입 변환을 최소화 할 수 있다.

클래스 인스턴스화 시점에서 제네릭 파라미터를 통해 타입 전달.

제네릭 메서드

제네릭은 클래스 레벨에서만 사용할 수 있는게 아니라 메서드 레벨에서도 사용할 수 있다.
제네릭 메서드는 메서드의 선언 부에 적은 제네릭으로 리턴 타입, 파라미터의 타입이 정해지는 메서드이다.

public <T> T 메서드Name(T object) {	
		...
}
 
[접근 제어자] <제네릭타입> [반환타입] [메소드명]([제네릭타입] [파라미터]) {
		...	
}

위 예시에서 볼 수 있는 것처럼 제네릭 메서드의 타입 매개변수를 선언할 때 타입 매개변수의 위치는 메서드의 접근 지시자와 반환 타입 사이가 됩니다.

제네릭 특징

  • 제네릭 메서드를 정의할 때 중요한 것은 리턴 타입이 무엇인지와는 상관없이 해당 메서드가 제네릭 메서드라는 것을 컴파일러에게 알려주는 것이다. 그러기 위해서 리턴 타입을 정의하기 전 에 제네릭 타입에 대한 정의가 반드시 필요하다.
  • 제네릭 클래스가 아닌 일반 클래스 내부에서도 제네릭 메서드를 정의할 수 있다. 클래스에 지정된 타입 파라미터와 제네릭 메서드에 지정된 타입 파라미터는 상관이 없다는 것이다.


위에서는 클래스의 제네릭 <T>에서 설정된 타입을 받아와 반환 타입으로 사용할 뿐인 일반 메서드라면, 제네릭 메서드는 직접 메서드에 <T>제네릭을 설정함으로서 동적으로 타입을 받와야 사용할 수 있는 독립적으로 운용 가능한 제네릭 메서드라고 한다.제네릭 메서드의 제네릭 타입 선언 위치는 메서드 반환 타입 바로 앞이다.

제네릭 와일드카드

제네릭 간의 형변환을 성립되게 하기 위해 제네릭에서 제공하는 와일드 카드 '?' 문법을 이용하여야 한다.

  • -<?> : Unbounded Wildcards (제한 없음)
    → 타입 파라미터를 대치하는 구체적인 타입으로 모든 클래스나 인터페이스 타입이 올 수 있다.
  • -<? extends 상위타입> : Upper Bounded Wildcards (상위 클래스 제한)
    → 타입 파라미터를 대치하는 구체적인 타입으로 상위 타입이나 상위 타입의 하위 타입만 올 수 있다.
  • -<? super 하위타입> : Lower Bounded Wildcards (하위 클래스 제한)
    → 타입 파라미터를 대치하는 구체적인 타입으로 하위 타입이나 하위 타입의 상위 타입만 올 수 있다.

<참고자료>
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
이해해버려라!

0개의 댓글