- 미리 사용할 타입을 결정한 뒤, 컴파일 시점에 사용될 데이터 타입을 체크하는 것
- 지정된 타입은 클래스 내에서 임시 데이터 타입으로 사용되며
인스턴스 생성 시점에서 특정 데이터 타입을 지정하여 해당 타입으로 교체
- 코드의 안정성이 향상되며 형 변환 연산자 등을 생략할 수 있으므로 코드가 절감된다
★ 클래스 정의 시 클래스 명 뒤에 <>기호 사이에 가상의 임시 자료형을 지정
(보통 영문 대문자 1글자를 지정)
public class Array<E>{}
→ <>이 부분이 바로 파라미터 선언
→ 일반적으로 파라미터는 상징성을 나타내는 알파벳 하나를 사용
· <T>_참조 타입
· <E>_요소
· <V>_값
· <K>_키
ArrayList<int> list=new ArrayList<int>();
제네릭 타입 지정이 클래스 타입만 가능, 기본 타입형은 안된다!!!!!
ArrayList<Integer> list=new ArrayList<Integer>();
Object 타입으로 변수를 선언하면 모든 데이터 타입을 전달받을 수 있어 저장 시 편리함
하지만 데이터를 사용할 때 문제가 발생할 수 있다
오류가 발생하지 않지만.. 코드를 실행할 때 오류가 뜬다
그래서 제네릭을 사용하면
컴파일 시점에서 사용할 수 있는 객체의 타입을 체크하기 때문에
프로그램의 안전성이 획기적으로 향상되고 코드도 줄어든다
클래스 명 뒤에 <>를 쓰고 사이에 영문 대문자 1글자를 지정한다
이때 지정한 영문 대문자는 클래스 내에서 임시 데이터 타입으로 사용 가능
(클래스 내에서만 유효한 가상의 임시 데이터 타입)
클래스 정의 시점에서는 어떤 데이터 타입이 될지 알 수 없으며,
인스턴스 생성 시점에 데이터 타입을 명시하게 됨(해당 데이터 타입으로 교체됨)
GenericBox 인스턴스 생성 시 제네릭 타입을 Toy 타입으로 고정
클래스 내의 가상의 자료형 T -> Toy로 모두 변경됨
GenericBox<Toy> gb1 = new GenericBox<Toy>();
gb1.setSome(new Toy());
gb1.setSome(new Grocery()); ==>컴파일 에러 발생! Toy 타입 외의 객체 전달 불가
제네릭을 적용하면 오류를 발견하는 시점이 컴파일(번역) 시점이 된다
Getter 메서드 리턴 타입이 Toy로 바뀌었으므로
타입 체크(instanceof)나 형변환 연산자가 필요 없음! (코드 절감)
Toy toy = gb1.getSome();
Getter 메서드 리턴 타입이 Toy로 바뀌었으므로
타입 체크(instanceof)나 형변환연산자가 필요 없음!
(코드 절감)
Toy toy = gb1.getSome();
컬렉션 프레임워크 등에서 기본적으로 제네릭을 적용하여 클래스를 정의
=> ArrayList, HashSet, HashMap 등에 제네릭 사용 가능
DB 작업에 사용되는 DTO 클래스(자바빈 객체)도 제네릭 타입으로 지정 가능
ArrayList<BoardDTO> boardList = new ArrayList<BoardDTO>();
BoardDTO dto = new BoardDTO(1, "게시물 제목", "게시물 내용");
boardList.add(dto);
BoardDTO dto3 = new BoardDTO(2, "게시물 제목 2", "게시물 내용 2");
boardList.add(dto3);
ArrayList 객체에 저장된 BoardDTO 객체 꺼내서 메서드 호출
BoardDTO 타입으로 꺼내올 때 타입 판별이나 형변환 등 필요 없음
(1) 일반 for 문
for(int i = 0; i < boardList.size(); i++) {
BoardDTO board = boardList.get(i);
System.out.println(board.getTitle() + ", " + board.getContent());
}
(2) 향상된 for 문
for(BoardDTO board : boardList) {
System.out.println(board.getTitle() + ", " + board.getContent());
}
★ static이 붙은 멤버에는 타입 파라미터를 적용할 수 없다
타입 파라미터를 이용해서 객체를 생성할 수 없다
(new 연산자는 컴파일 타입에 정확한 타입을 알아야 하는데
클래스 내부에서 파라미터만 보아서는 타입을 알 길이 없기 때문)
★ instanceof의 피연산자로 타입 파라미터가 사용될 수 없다
♬사용 가능한 파라미터 타입의 제한
class Number<T extends Number>{}
T는 자식, Number는 부모
그래서 T는 Number 클래스 이하여야 한다
- Number 안에는 Interger, Double,,,,, 등
- Object도 안된다. String은 Number의 하위 클래스가 아니다
ㅣ읽느라 수고 많으셨어요~ㅣ
부족한 글을 읽어주셔서 감사드립니다
아직 부족한 게 많으니
틀린 곳이 있다면
조언의 말씀 꼭 부탁드립니다!!!!
[자바] java 클래스 메소드 정의/멤버 변수 초기화/객체(인스턴스) 생성/ 메소드 호출_실제예제보며 공부 (0) | 2020.07.29 |
---|---|
[java]자바_StringTokenizer클래스를 통한 문자열 분리 /split차이점 (0) | 2020.07.28 |
[자바]Stack(스택)FILO,LIFO vs Queue(큐)/ 데이터저장 구조(data) (0) | 2020.07.26 |
자바로 구구단 구하기 (중첩 for문) (0) | 2020.07.25 |
[java]자바_Annotation(애노테이션/어노테이션) (0) | 2020.07.24 |