[Java] 제네릭 프로그래밍
글 작성자: _rian
제네릭 프로그래밍(Generic Programming) 이란?
작성한 코드를 다양한 타입의 객체에 대해 재사용한다는 객체 지향 기법이다.
제네릭(Generic) : 클래스를 정의할 때 구체적인 타입을 적지 않고 변수 형태로 적어 놓는 것이다. 객체를 생성할 때 구체적인 타입을 기재한다.
제네릭 클래스 설계
선언
class 클래스이름<타입매개변수> {
// 메서드나 필드에 필요한 타입을 타입 매개변수로 나타낸다.
필드;
메서드;
}
타입 매개변수는 객체를 생성할 때 구체적인 타입으로 대체한다.
아래는 그 예시!
전형적인 타입 매개변수
타입 매개변수 | 설명 |
E | 원소 (Element) |
K | 키 (Key) |
N | 숫자 (Number) |
T | 타입 (Type) |
V | 값 (Value) |
제네릭 객체 생성
제네릭의 제약
- 기초 타입을 제네릭 인수로 사용 불가
- 정적 제너릭 타입 금지
- 제너릭 타입의 인스턴스화 금지. 즉, new T() 등 금지
- 제네릭 타입의 배열 생성 금지
- 실행 시간에 제네릭 타입 점검 금지
예를들어, a instance of ArrayList<String> - 제네릭 클래스의 객체는 예외로 던지거나 잡을 수 없다.
- 제네릭의 서브타입 허용 않음
제네릭 메소드
의미와 선언 방법
- 타입 매개변수를 사용하는 메서드
- 제네릭 클래스 뿐만아니라 일반 클래스의 멤버도 될 수 있음
- 제네릭 메서드를 정의할 때는 타입 매개변수를 반환 타입 앞에 위치
- 제네릭 메서드를 호출할 때는 구체적인 타입 생략 가능 -> 다이아몬드 연산자 : <>
- JDK 7과 JDK 8의 경우 익명 내부 클래스에서는 다이아몬드 연산자 사용 불허
- JDK 9부터는 익명 내부 클래스에서도 다이아몬드 연산자 사용 가능
정의와 호출 방법
제네릭 메소드와 둘 이상의 자료형
제한된 타입의 제네릭 메소드
제네릭 타입에 대한 범위 제한
1. 사용 방법
T가 상속 또는 구현하는 클래스의 자료형이 되어야 함을 명시함.
주의 : 부모 인터페이스인 경우도 implements가 아니라 extends 사용
제한된 메소드와 배열
제네릭 메소드로의 배열 전달
1. 배열도 인스턴스 이므로 제네릭 매개변수에 전달 가능.
하지만 이렇게 전달을 하면 다음과 같은 문장을 쓸 수 없음
2. 다음과 같이 매개변수를 선언하면, 매개변수에 전달되는 참조값을 배열 인스턴스의 참조값으로 제한할 수 있음
3. 이렇게 선언하면 참조 값을 배열 인스턴스의 참조값임이 100% 보장되므로 [] 연산을 허용함
와일드카드 타입
1. 제네릭 타입 <?> : Unbounded wildcards (제한 없음)
2. 제네릭타입 <? extends 상위타입>
- Upper Bounded Wildcards (상위 클래스 제한)
- 상위 타입을 상속하는 클래스의 인스턴스라면 무엇이든지 참조 가능
3. 제네릭타입 <? super 하위타입>
- Lower Bounded Wildcards (하위 클래스 제한)
- 하위 타입이 상속하는 클래스의 인스턴스라면 무엇이든지 참조 가능
제네릭 클래스의 상속
제네릭 타입을 부모 클래스로 사용할 경우..
1. 타입 파라미터는 자식 클래스에도 기술해야 함
- 인스턴스 생성 시 자료형 지정
2. 추가적인 타입 파라미터를 가질 수 있음
3. 제네릭 클래스의 자료형을 결정해서 상속하는 것도 가능
제네릭 타입의 구현
제네릭 인터페이스를 구현할 경우, 제네릭 인터페이스를 구현한 클래스도 제네릭
'Computer Engineering > Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map (0) | 2019.12.16 |
---|---|
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류 (0) | 2019.12.15 |
[Java] 중첩 클래스와 람다식 (0) | 2019.12.11 |
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends (0) | 2019.12.11 |
[Java] 추상클래스와 인터페이스 (0) | 2019.11.22 |
댓글
이 글 공유하기
다른 글
-
[Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map
[Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map
2019.12.16 -
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류
2019.12.15 -
[Java] 중첩 클래스와 람다식
[Java] 중첩 클래스와 람다식
2019.12.11 -
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends
2019.12.11