클래스에서 주로 사용하는 제네릭 프로그래밍
무엇이든 담을 수 있는 제네릭(Generic) 프로그래밍
다양한 자료형이 쓰일 수 있는 변수 // 클래스 여러 개를 만들면 오버헤드
제네릭 자료형 정의
- 클래스에서 사용하는 변수의 자료형이 여러 개 일수 있고, 그 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정할 수 있도록 선언
- 실제 사용되는 자료형의 변환은 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식
- 컬렉션 프레임워크에서 많이 사용되고 있음
- 제네릭 타입을 사용하지 않는 경우의 예
Powder와 Plastic을 재료로 쓰는 3D 프린터 만들어 보기
Object 클래스로 여러가지 형 대입 | 제네릭 클래스로 여러가지 형 대입 |
재료 2개 클래스 만들고 | 재료 2개 클래스 만들고 |
각 재료를 이용해 만든 3D 프린터 클래스 2개 만들고 object클래스 1개 만들고 |
제네릭 클래스 만들고 |
테스트 클래스 ( 형 변환 - 다운캐스팅 필요 ) | 테스트 클래스 ( 형 변환 필요 X ) |
재료가 많아질수록 + 변수가 사용할 타입 형이 많아질 수록 원래의 방법으로 하면 클래스를 2배로 더 만들어야한다. 거기에 꺼내올때마다 형 변환 필요하다. |
①재료가 Powder인 경우 class 만들고
②재료가 Plastic인 경우 class 만들고
③powder 재료 - 쓰리디 프린터 1 class 생성
④plastic 재료 - 쓰리디 프린터 2 class 생성
⑤ 여러 자료 형 사용하기 위해 재료로 object 사용했다는 클래스 생성
⑥ test---
클래스가 너무 많아지고 - 오버헤드
꺼낼 때마다 형 변환이 필요하다 - 효율적이지 못함.
--> 제네릭 클래스 사용!
제네릭 클래스 정의
- 자료형 매개변수 T(type parameter) : 이 클래스를 사용하는 시점에 실제 사용할 자료형을 지정, static 변수는 사용할 수 없음
- GenericPrinter : 제네릭 자료형
- E : element, K: key, V : value 등 여러 알파벳을 의미에 따라 사용 가능
①② 번까지는 동일
③ 여러 가지 자료형을 가질 material에 대해 GenericPrinter <T> 클래스 생성
④ 테스트 클래스 - <T> 자리에 material이 사용할 자료형 써줌 - 컴파일러가 작업해 줌 - 꺼낼 때 형 변환 필요 X
3D 프린터가 사용할 재료가 늘어나면 그 재료에 대한 클래스만 추가해주면 됨! - 사용할 때 그 자료형 대입해주면 끝!
(기존 방식이었으면 재료 클래스와 그 재료로 만든 3d 프린터 클래스 필요+꺼내볼 때 형 변환)
GOOD :)
제네릭 클래스 사용하기
테스트할 때는 <T> 대신 사용할 자료형 써준다. ->
<>를 생략하면 object라고 인식 / 나중에 형 변환 필요 / 굳이 이렇게 사용 안 함
다이아몬드 연산자 < >
- ArrayList list = new ArrayList <>(); //다이아몬 든 연산자 내부에서 자료형은 생략 가능함
- 제네릭에서 자료형 추론(자바 10부터)
- ArrayList list = new ArrayList() => var list = new ArrayList();
<T extends 클래스> 사용하기
상위 클래스의 필요성
- T 자료형의 범위를 제한할 수 있음
- 상위 클래스에서 선언하거나 정의하는 메서드를 활용할 수 있음
- 상속을 받지 않는 경우 T는 Object로 변환되어 Object 클래스가 기본으로 제공하는 메서드만 사용 가능
T extends를 사용한 프로그래밍
- GenericPrinter에 material 변수의 자료형을 상속받아 구현
- T에 무작위 클래스가 들어갈 수 없게 Material 클래스를 상속받은 클래스로 한정
최상의 클래스 material 만들어 줌
-> 직접 쓸 일 없기 때문에 abstract로 주로 만듦 abstract matieral class
<T extends >
<T>에 대한 제한 // T 자리에 올 자료형들은 Material 상속받은 것이어야만 한다. -
<T>에 무작위 클래스가 들어갈 수 없게 Material 클래스를 상속받은 클래스로 한정
<T extends > 제한에 걸리지 않도록 사용할 자료형에 상속 처리 필요
powder와 plastic 클래스에 오류남 // T extends로 Material 상속받은 것들로만 제한해놨는데 아직 상속처리 안 해줌 //
-> 클래스 powder extends Matiral // 클래스 Plastic extends Material 해줌
test ----
<T extends >로
사용할 범위 제한 기능 /
공통으로 사용할 메서드 정의할 수 도 있고 /
상속 클래스에서 구현하라 가상 메서드도 가능 /
어떤 자료형이 들어와도 상관없다면 안 해줘도 된다.
GOOD :)
제네릭 메서드 활용하기
제네릭 메서드란?
- 자료형 매개변수를 메서드의 매개변수나 반환 값으로 가지는 메서드
- 자료형 매개 변수가 하나 이상인 경우도 있음
- 제네릭 클래스가 아니어도 내부에 제네릭 메서드는 구현하여 사용할 수 있음
- public <자료형 매개 변수> 반환형 메서드 이름(자료형 매개변수.....) { }
- T, V 타입 매개 변수로 만들 것이다. 어떤 타입으로도 리플레이스 가능하다
제네릭 메서드의 활용 예
- 두 점(top, bottom)을 기준으로 사각형을 만들 때 사각형의 너비를 구하는 메서드를 만들어 보자
- 두 점은 정수인 경우도 있고, 실수인 경우도 있으므로 제네릭 타입을 사용하여 구현한다.
점의 타입이 int 이거나 double 일 수 있음
한 점의 위치를 나타낼 때는 좌표 x, y 2가지 필요
한 점을 나타내는 코드 작성
제네릭 메서드 사용
- 제네릭 클래스가 아니어도 내부에 제네릭 메서드는 구현하여 사용할 수 있음
Test ---
Point로 점을 생성
제네릭 메서드 makeRectangle로 적용
review
제네릭 클래스 / <T extends > / 제네릭 메서드
하나의 변수에 여러 가지 자료형을 사용해야 되거나 어떤 자료형이 올지 모를 경우
제네릭 클래스 활용! 그 범위를 < T extends >로 제한할 수 있고, 변수가 사용할 자료형에 extends
제네릭 클래스가 아니어도 제네릭 메서드 사용 가능! 매개 변수 하나 이상인 경우도 사용 가능
Generic 클래스 잘 사용하면
클래스를 많이 만들어야하는 작업이 불필요하게 되고,
상속받은 클래스만 사용하게 함으로써 유지 - 관리도 더 체계적으로 할 수 있을 거 같다.
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter5' 카테고리의 다른 글
컬렉션 프레임 워크 - 자바에서 제공되는 자료구조 구현 클래스들 (0) | 2022.01.14 |
---|---|
ArrayList / LinkedList / Stack / Queue --- 구현하기 (0) | 2022.01.13 |
여러가지 자료구조 (Data Structure) (0) | 2022.01.12 |