제네릭(Generic)
미리 사용할 타입을 결정한 뒤, 컴파일 시점에서 사용될 데이터 타입을 체크하는 것
클래스 정의 시 클래스명 뒤에 <> 기호 사이에 가상의 임시 자료형을 지정
(= 보통 영문 대문자 1글자 지정)
지정된 타입은 클래스 내에서 임시 데이터타입으로 사용되며
인스턴스 생성 시점에서 특정데이터타입을 지정하여 해당 타입으로 교체
=> 제네릭 타입 지정 시 반드시 클래스 타입만 지정 가능 ( 기본형X )
코드의 안정성이 향상되며, 형변환 연산자 등을 생략할 수 있으므로 코드가 절감됨
Object 타입 변수에 데이터를 저장할 경우 모든 타입 저장이 가능하므로
데이터 저장 시 매우 편리하나, 데이터를 사용할 때 문제가 발생할 수 있다.
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
32
33
|
제네릭을 적용한 GenericBox 클래스 정의
클래스명 뒤에 <> 기호를 쓰고, 사이에 ㅕㅇ문 대문자 1글자 지정
이 때, 지정한 영문 대문자는 클래스내에서 임시 데이터 타입으로 사용 가능
클래스 정의 시점에서는 어떤 데이터타입이 될 지 알 수 없으며,
인스턴스 생성 시점에서 데이터타입을 명시하게 됨(해당 데이터타입으로 교체됨)
class GenericBox<T> {
private T some;
public T getSome() {
return some;
}
public void setSome(T some) {
this.some =some;
}
}
class Toy {}
class Grocery {}
GenericBox<Toy) gb1 = new GenericBox<Toy>();
gb1.setSome(new Toy());
// gb1.setSome(new Grocery()); // 컴파일 에러 발생! Toy 타입 외의 객체는 전달 불가
// 제네릭을 적용하면 => 오류를 발견하는 시점이 컴파일(번역) 시점이 된다!
// 제네릭이 적용 되면 Getter 리턴타입이 Toy , Setter 파라미터값이 Toy 로 바뀌어으므로
// 타입 체크(instanceof)나 형변환 연산자가 필요 없음
// 제네릭 타입 지정을 생략할 경우 T -> Object 로 변경된다
GenericBox<int> // 불가능! 기본형 데이터타입은 제네릭에 지정불가
GenericBox<Integer> // 정수를 지정할땐 인티저! 클래스를
|
cs |
제네릭을 적용한 자바의 API
- Collection 프레임워크 등에서 기본적으로 제네릭을 적용하여 클래스를 정의
====> ArrayList, HashSet, HashMap 등에 제네릭 사용 가능
- 가상의 자료형으로 인스턴스 생성 불가!
- instanceof 피연산자로 타입 파라미터에 사용 불가!
- static 은 로딩시점이 더빠르기 때문에 사용 불가!
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
class BoardDTO {
int idx;
String title;
String content;
public BoardDTO(int idx, String title, String content) {
super();
this.idx = idx;
this.title = title;
this.content = content;
}
public int getIdx() {
return idx;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
public void setIdx(int idx) {
this.idx = idx;
}
public void setTitle(String title) {
this.title = title;
}
public void setContent(String content) {
this.content = content;
}
}
ArrayList<Integer> list =new ArrayList<Integer>();
list.add(1);
// list.add(3.14); 컴파일 오류 발생! (Integer 타입 필수)!
ArrayList<Double> list =new ArrayList<Double>();
// list.add(1); 컴파일 오류 발생! (Double타입 필수)!
list.add(3.14);
// DB 작업에 사용되는 DTO 클래스( 자바빈 객체) 도 제네릭 타입으로 지정 가능
ArrayList<BoardDTO> boardList = new ArrayList<BoardDTO>();
BoardDTO dto = new BoardDTO(1, "게시물제목", "게시물내용");
BoardDTO dto2 = new BoardDTO(2, "게시물제목2", "게시물내용2");
boardList.add(dto);
boardList.add(dto2);
for(BoarddDtO dto : boardList) {
System.out.println(board.getIdx());
System.out.println(board.getTitle());
System.out.println(board.getContent());
}
1
게시물 제목
게시물 내용
2
게시물 제목2
게시물 내용2
|
cs |
'Language > Java' 카테고리의 다른 글
StringTokenizer~format (0) | 2020.07.06 |
---|---|
시간 관련 클래스 및 패키지 (0) | 2020.06.25 |
Stack(스택) vs Queue(큐) (0) | 2020.06.25 |
Map 인터페이스 - Collection 프레임워크 (0) | 2020.06.25 |
enum 타입(열거형 데이터 타입) (0) | 2020.06.24 |