본문 바로가기
Language/Java

제네릭(Generic)

by 태윤2 2020. 6. 25.

제네릭(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