JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter5

제네릭(Generic) 프로그래밍

giggs 2022. 1. 13. 13:22

클래스에서 주로 사용하는 제네릭 프로그래밍

무엇이든 담을 수 있는 제네릭(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 클래스 잘 사용하면
클래스를 많이 만들어야하는 작업이 불필요하게 되고,
상속받은 클래스만 사용하게 함으로써 유지 - 관리도 더 체계적으로 할 수 있을 거 같다.