제네릭 프로그래밍
- 다양한 자료형이 적용될 수 있는 클래스를 만드는 것
- 선언 시 클래스의 자료형을 명시하지 않음
→ 추후 해당 클래스를 인스턴스화(new)할 때 자료형이 정해짐 (.class 파일도 이 시점에 생성됨)
⇒ 변수의 이름과 기능이 동일하면서, 자료형만 달라지는 변수들을 사용할 때 고려
- 컬렉션 프레임워크에서 많이 사용됨
: 알고리즘을 활용해서 보다 빠르게 자료 구조를 검색하고, 데이터를 삽입할 수 있는 프레임워크
# 장점
- 인스턴스화할 때, 다이아몬드 연산자(< >) 사이에 자료형을 명시함
→ 가독성을 높임
- 자료형을 잘못 사용했을 때, 컴파일 시점 오류가 발생함
→ 자료형의 변환이 컴파일러에 의해 검증되므로, 안정성이 높음
- java 파일의 수를 줄일 수 있음
ex) double result, int result, float result
이 세 가지 변수를 생성하려면 a.java, b.java, c.java 각 파일로 따로 만들어야 함
→ 제네릭을 사용하면 파일 하나로 생성할 수 있음
- 메서드의 반환 자료형에 제네릭을 넣으면, 하나의 메서드만 만들어도
상황에 따라 다른 자료형을 리턴할 수 있게 됨
Object 클래스를 사용할 때와 비교
- 최상위 클래스 Object를 사용하는 경우에도 제네릭과 비슷한 효과가 있음
(다형성을 이용하여 Object 타입으로 바라봄)
→ 그러나, 이 방법을 사용하면 하위 클래스의 메서드/멤버변수를 호출할 때마다
다운 캐스팅을 해야 하기 때문에 번거로움
제네릭 프로그래밍 방법
// 클래스 파일 : 선언 방법 //
public class 클래스명<T> { // T : 대체문자
// 제네릭 자료형 선언 :: T 자료형으로 선언한 변수
private T 변수명;
// 제네릭 메서드 정의 :: T 자료형을 반환하는 메서드
public T 메서드명(매개변수) {
...
}
// 제네릭 메서드 정의 2 :: T 자료형 변수를 매개변수로 받는 메서드
public 반환자료형 메서드명(T 변수) {
...
}
} // end of class
-----------------------------------------
// 메인 함수 파일 : 사용 방법 //
public static void main(String[] args) {
// 사용할 자료형 인스턴스화
자료형a 참조변수a = new 자료형a();
// 제네릭 인스턴스화
클래스명<자료형a> 참조변수 = new 클래스명<>();
// 다운 캐스팅을 하지 않아도 자료형a로 사용할 수 있음
} // end of main
# <대체문자>
- 아무 문자를 사용해도 문제가 발생하지 않으나, 가급적 의미가 있는 약자로 사용하는 것이 좋음
T | E | K | V |
Type | Element | Key | Value |
특정 클래스를 상속받은 자식 클래스만 허용
// 클래스 파일의 선언부 //
public class 클래스명<T extends 부모클래스> {
// 그 외 문법은 동일함
- 상속을 이용하여 T 자료형의 범위를 제한할 수 있음
→ 부모 클래스를 상속받지 않은 클래스가 제네릭 자료형으로 접근하려고 하면 컴파일 오류
- 부모 클래스는 추상 메서드로 구현
'Java' 카테고리의 다른 글
[Java] Thread - 은행 계좌 입출금에 대한 동기화 기능 구현 (0) | 2023.02.19 |
---|---|
[Java] 쓰레드 (Thread) (0) | 2023.02.19 |
[Java Swing] 메서드 및 함수 모음 (1) | 2023.02.17 |
[Java Swing] 이벤트 리스너 (Event Listener) (0) | 2023.02.17 |
[Java] 내부 클래스와 익명 클래스 (0) | 2023.02.16 |
댓글