Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- javascript
- 자바의정석
- 항해99
- generic class
- python
- DB
- 코딩테스트준비
- data structure
- 암호학
- 크루스칼
- BFS
- Algorithm
- 코테
- 알고리즘
- 가상컴퓨팅
- dbms
- 공개키 암호화
- js
- Java
- 문자열
- 자료구조
- 생성자
- dfs
- spring
- 개발자취업
- JPA
- sql
- jsp
- 코딩테스트
- Queue
Archives
- Today
- Total
PLOD
[Java] 제네릭 클래스(Generic Class) 본문
제네릭 클래스
제네릭은 다양한 타입의 객체들을 다루는 메서드나 컬레션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다.
public class GenericTest{
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add("30");
Integer i = (integer)list.get(2); // 컴파일 OK but console 출력시 Error(형변환)
System.out.println(list);
}
}
위 코드를 실행하면 코드 상으로는 에러가 발생하지 않지만 , 컴파일 시, 오류가 발생한다 .이는 2번째 원소를 출력할 때 데이터 타입이 String 타입이어서 형변환에 오류가 발생해서 그렇다. 그렇기 때문에 <> 안의 타입 규칙에 맞는 데이터 타입 기준에 맞춰 데이터를 출력해야 한다. 위와 같이 String 타입도 지원하고 싶고 Integer 타입도 지원하고 싶은 것처럼 많은 타입을 지원하고 싶다면 제네릭을 사용해야 한다.
제네릭은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다. 제네릭 타입은 사용자가 제네릭 클래스<T>를 만들어 필요에 의해 지정할 수 있도록 하는 일반 타입이다.
제네릭스는 컴파일 시 타입을 체크해 주는 기능을 제공한다. 제네릭스를 사용하면 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여준다. 걀과적으로 제네릭스 덕분에 타입 체크가 강화되었다.
제네릭 클래스를 사용할 시 장점
Ⅰ) 타입 안정성을 제공한다.
Ⅱ) 타입 체크와 형 변환을 생략할 수 있으므로 코드가 간결해진다.
타입변수
제네릭 클래스를 작성할 때, 일반 클래스 Object 타입 대신 타입 변수(E)를 선언해서 사용한다.
위의 코드에서 객체를 생성시, 타입 변수(E) 대신 실제 타입(TV)을 지정해서 넣어준다.
ArrayList<TV> tvList = new ArrayList<TV>(); // <>안에 타입을 맞춰줘야 함
제네릭스를 사용하여 타입 변수 대신 실제 타입이 생성되면, 형변환 생략이 가능하다.
※ 제네릭스 용어
Box<T> - 지네릭 클래스 , T의 Box 또는 T Box라고 읽는다
T - 타입 변수 또는 타입 매개변수(T는 타입 문자)
Box - 원시 타입(Raw type)
예시 코드
class Ex12_1{
public static void main(String[] args){
ArrayList<Product> productList = new ArrayList<Product>();
ArrayList<TV> tvList = new ArrayList<TV>();
// ArrayList<Product> tvList = new ArrayList<TV>();
// List<TV> tvList = new ArrayList<TV>(); // 다형성 OK
productList.add(new TV());
productList.add(new Audio());
tvList.add(new TV());
tvList.add(new TV());
// tvList.add(new Audio()); // 에러
printAll(ProductList);
// prinAll(tvList); // 컴파일 에러
}
}
제네릭 클래스의 제약
1. 타입 변수에 대입은 인스턴스 별로 다르게 가능하다
2. static 멤버에 타입 변수 사용 불가
3. 배열 생성 할 때 타입변수 사용 불가 타입변수로 배열 선언은 가능
와일드 카드 <?>
1. <? extends T> : 와일드 카드의 상한 제한 , T와 그 자손들만 가능
2. <? super T> 와일드 카드의 하한 제한, T와 그 조상들만 가능
3. <?> 제한 없음 , 모든 타입이 가능 = <extends Object>
제네릭 클래스
class ClassName<E> {
private E element; // 제네릭 타입 변수
void set(E element) { // 제네릭 파라미터 메소드
this.element = element;
}
E get() { // 제네릭 타입 반환 메소드
return element;
}
}
'개발 공부 > Java' 카테고리의 다른 글
[Java] String(문자열) (0) | 2024.11.26 |
---|---|
[Java] Java 주요 클래스 정리 (1) | 2024.07.20 |
[Java] 싱글톤 패턴(Singleton pattern) (0) | 2023.12.31 |
[Java] 연산자(Operator) (0) | 2023.09.12 |
[Java] 배열(array) (0) | 2023.09.04 |
Comments