일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SpringMVC
- framework
- CSS
- 프로그레시브웹앱
- JavaScript 내장객체
- TIL
- tdd
- js
- sqldeveloper
- web
- TodayILearned
- mybatis
- javascript
- 국비지원
- Oracle
- 생활코딩
- 스프링
- 오라클
- 서브쿼리
- HTML
- 자바프로그래밍
- PWA
- springaop
- 메이븐
- 자바스크립트
- 프레임워크
- sql
- maven
- javaprogramming
- progressive web app
- Today
- Total
1cm
자바 프로그래밍_Day_20_제네릭스(Generics) 본문
2021.09.13
> 제네릭스(Generics)
-> JDK1.5부터 제공되는 기능이다.
-> 클래스나 메소드 내부에서 다룰 데이터의 클래스 타입을 지정하거나, 컬렉션이 다룰 클래스 타입을 제한하여 한 가지 종류의 클래스만 저장할 수 있게 한 기능이다.
> 제네릭스(Generics)를 사용하는 이유
-> 컴파일 단계에서 '잘못 된 타입을 사용할 수 있는 문제'를 제거하기 위해.
-> 컬렉션에 저장된 여러 종류의 객체를 꺼내서 사용할 때, 객체의 종류에 따라 매번 형 변환을 해야하기 때문에 코드가 복잡해진다.
-> 컬렉션, 람다식(함수적 인터페이스), 스트림, NIO에서 널리 사용한다.
-> API Document 해석에 어려움을 겪어 학습에 제한이 생기기 때문.
> 제네릭스(Generics) 장점
-> 컴파일 시 강한 타입 체크 가능 (실행 시, 컴파일 시 에러 방지)
-> 타입 변환 제거가 가능
-> 오브젝트 타입을 사용하면 모든 객체를 사용할 수 있다는 장점이 있지만 불러올 때 잘못된 형변환이 생길수 있으므로 성능 저하가 발생할 수 있다. -> 제네릭스를 사용하면 성능 향상에 장점이 있다.
> 제네릭스(Generics) 타입과 표현식
-> 타입을 파라미터로 가지는 클래스와 인터페이스 선언 시 클래스 또는 인터페이스 이름 뒤에 "< >"부호를 붙이고 사이에는 타입 파라미터가 위치한다.
1
2
3
4
5
6
7
|
[표현식]
클래스명<클래스 타입> 레퍼런스 = new 생성자<클래스타입>();
클래스명<클래스 타입> 레퍼런스 = new 생성자<>(); // JDK1.7부터 적용, 타입 추론
[사용예시]
ArrayList<Book> list1 = new ArrayList<Book>();
ArrayList<Book> list2 = new ArrayList< >();
|
cs |
-> <> : 다이아몬드 연산자
-> 클래스 또는 인터페이스 뒤에 파라미터 설정 -> 앞에 있는 타입을 보고 유추해서 자동으로 설정해준다.
> 제네릭스(Generics)가 설정된 레퍼런스를 인자로 넘기는 경우
-> 메소드 쪽에서 받아주는 매개 변수도 제네릭스가 적용되어야 한다.
1
2
3
4
5
6
7
8
9
|
예) ArrayList<Book> list = new ArrayList<Book>();
BookManager bm = new BookManager();
bm.printInformation(list);
// BookManager Class
public void printInformation(ArrayList<Book> list){
...
}
|
cs |
> 제네릭스(Generics)가 설정된 레퍼런스를 리턴하는 경우
-> 메소드의 반환형에도 제네릭스가 적용되어야 한다.
1
2
3
4
|
예) public ArrayList<Book> getInformation(){
ArrayList<Book> list = new ArrayList<Book>();
return list;
}
|
cs |
> 클래스에서 제네릭스(Generics) 사용
-> 예) class 클래스명<영문자> {
영문자 레퍼런스;
}
-> *영문자
-> 저장될 타입은 영문자로 지정, 일반적으로 대문자를 사용 (ex, T, E, K, V)
타입 | 설명 |
<T> | Type |
<E> | Element |
<K> | Key |
<V> | Value |
<N> | Number |
-> 클래스 타입이 미정인 경우, 객체 생성 시 정해지는 클래스 타입을 영문자가 받아 영문자 사용 위치에 적용된다.
-> 컴파일 시 타입 파라미터가 구체적인 클래스로 변경된다.
-> 필요한 시점에 타입을 지정할 수 있다.
> 멀티 타입 파라미터
-> 제네릭스 타입은 두 개 이상의 타입 파라미터 사용이 가능하며 각 타입 파라미터를 콤마로 구분한다.
-> 객체를 생성할 때 원하는 타입으로 변경이 된다.
> 제네릭스(Generics) 타입의 상속과 구현
-> 제네릭스 타입을 부모 클래스로 사용해야 할 경우 타입 파라미터는 자식 클래스에도 적어줘야 한다. (자식-부모 동일)
-> 추가적인 타입 파라미터를 가질 수 있다.
-> ex)
-> public class ChildProduct<T, M> extends Product<T, M>{ ... }
-> public class ChildProduct<T, M, C> extends Product<T, M>>{ ... }
-> 구체적인 타입 제한
-> 상속 및 구현 관계를 이용해 타입 제한이 가능하며, 상위 타입은 클래스 뿐 아니라 인터페이스도 가능하다.
-> public <T extends 상위 타입> 리턴타입 메소드(매개변수, ...){ ... }
-> 단, 중괄호 { } 안에서 타입 파라미터 변수로 사용 가능한 것은 상위타입의 멤버(필드, 메소드)로 제한되어, 하위 타입에만 있는 필드와 메소드는 사용이 불가능하다.
-> 구현하는 내용에 따라서는 구체적인 타입을 제한해야 될 수도 있다.
-> 메소드 안에서 사용될 데이터들의 자료형을 실행하는 시점을 지정할 수 있다.
> 제네릭스(Generics) 코드 실습과 출력 결과
> chap4.MyGenerics
> chap4.Application
'국비지원_Java > Java Programming_1' 카테고리의 다른 글
자바 프로그래밍_Day_22_스레드(Thread)2 (0) | 2021.09.25 |
---|---|
자바 프로그래밍_Day_21_네트워크(Network), 스레드(Thread) (0) | 2021.09.24 |
자바 프로그래밍_Day_19_컬렉션(Collection) (0) | 2021.09.21 |
자바 프로그래밍_Day_18_입출력(IO) (0) | 2021.09.21 |
자바 프로그래밍_Day_17_예외처리(Exception) (0) | 2021.09.19 |