TIL

제네릭으로 중복 코드 줄이기

Gisungcu 2021. 3. 1. 12:32

예제는 백기선님 라이브에서 다뤘던 예제입니다.

 

기본 구조

  • Apple
  • Banana
  • AppleDao
  • BananDao
  • Store

제네릭을 사용하기 전의 구조로 

Apple.class
Banana.class
AppleDao.class

 

BananaDao.class

 

Store.class

Dao쪽에서 중복된 코드들이 발생한다.

상속을 이용한 방법도 있지만 제네릭을 사용해 중복을 줄여보자.

 

 

GenericDao 선언하기

GenericDao.class

E : 엔티티 , K : 키

엔티티는 임의의 타입이기에 getId()를 모르는 게 당연하다.

에러를 해결하기 위해 타입을 제한선을 걸어줘야한다.

 

Entity.class

상한선이 될 엔티티를 선언해 주고

Apple.class

Apple은 그 Entity를 상속을 받는다. 중복도 어느 정도 해결이 됐다.

GenericDao.class

이제 GenericDao에 extends를 걸어 상한선을 걸어준다.

Entity포함 그 밑의 클래스들만 올 수 있기에 E는 getId()를 사용할 수 있다.

하지만 Entity에서 id를 Integer로 선언했기에 타입 오류가 발생을 한다. (K로 타입 캐스팅을 여기서 하던가 -> 성능 저하, Entity를 제네릭하게 바꿔야 한다.)

Entitiy.class

Entity를 사용할 때 타입을 정해줘야 한다.

Apple.class

GenericDao도 바꿔주자

GenericDao.class

Entity 상한선에 사용되는 Entity는 제네릭을 사용하고 있다. getId의 리턴 타입은 그 제네릭 타입이다.

메소드들의 리턴 타입이나 매개변수도 제네릭으로 바꿔준다.

 

AppleDao.class

AppleDao은 GeneicDao를 상속받아 중복을 줄일 수 있다.

 

 

Store.class

main을 보면 AppleDao도 사용하지 않고 GenericDao를 통해 바로 사용이 가능하다.

그럼 AppleDao는 왜 남겨놓을까?

나중에 Apple만의 특화된 기능이 생길 수 있기 때문에 AppleDao를 삭제하지 않는 것이다.

 

결과물은 다음과 같다.

  • Apple
  • Banana
  • Entity
  • BananaDao
  • AppleDao
  • GenericDao
  • Store