Java

파라미터 타입이 다른 공통 로직 모듈화 - 제네릭

99duuk 2024. 12. 11. 12:06

파라미터 타입이 다른 공통 로직 모듈화 -

2024.12.11 - [Java] - 파라미터 타입이 다른 공통 로직 모듈화 - 인터페이스

 

파라미터 타입이 다른 공통 로직 모듈화 - 인터페이스

파라미터 타입이 달라 코드 중복이 발생하는 문제"를 인터페이스를 통해 해결하는 것을 간단한 예로 다시 정리해둔 것임...Animal 인터페이스를 활용하여 공통 로직을 모듈화하고,파라미터 타입

99duuk.tistory.com

 이어서..

 

 


모든 클래스가 공통 부모 클래스(Auth)를 상속받고 있을 경우,

인터페이스 없이 제네릭을 활용해 공통 로직 처리 ..

public class Dog extends Auth{
    private String name;
    private int age;
    private String breed; // 고유 속성: 품종

    // Getter/Setter
}

public class Cat extends Auth {
    private String name;
    private int age;
    private String furColor; // 고유 속성: 털 색깔

    // Getter/Setter
}

public class Bird extends Auth{
    private String name;
    private int age;
    private boolean canFly; // 고유 속성: 나는 여부

    // Getter/Setter
}
public class Auth {
     private Authority authority;
}

 

라면


제네릭으로 해결하는 방식

1. 제네릭 메서드 정의

Auth를 상속받는 모든 클래스에 대해 공통 로직을 처리할 수 있도록 제네릭 메서드를 작성

public <T extends Auth> void printAnimalAuth(T animal) {
    System.out.println("Auth: " + animal.getAuthority());
}

<T extends Auth>는 "Auth을 구현하거나 Auth을 상속받은 모든 클래스만 T로 사용 가능하다."

라는 뜻임...

 

 

2. 사용 예시

Dog, Cat, Bird는 모두 Auth를 상속받으므로, 이 메서드를 그대로 사용할 수 있음..

Dog dog = new Dog();
dog.setAuthority(new Authority("Dog Authority"));

Cat cat = new Cat();
cat.setAuthority(new Authority("Cat Authority"));

Bird bird = new Bird();
bird.setAuthority(new Authority("Bird Authority"));

printAnimalAuth(dog); // "Auth: Dog Authority"
printAnimalAuth(cat); // "Auth: Cat Authority"
printAnimalAuth(bird); // "Auth: Bird Authority"

 


제네릭 방식의 장점

  1. 코드 중복 제거
    • printDogAuth, printCatAuth, printBirdAuth 같은 중복 메서드가 필요 없습니다.
    • 제네릭 메서드 하나로 처리 가능.
  2. 타입 안정성
    • T extends Auth를 선언했기 때문에, Auth를 상속하지 않은 클래스는 사용할 수 없습니다.
    • 컴파일 타임에 잘못된 타입 사용을 방지할 수 있습니다.
  3. 유연성과 확장성
    • 새로운 클래스(Fish, Rabbit 등)가 추가되더라도, Auth를 상속받기만 하면 동일한 메서드에서 처리 가능합니다.
  4. 인터페이스 없이도 동작 가능
    • Auth를 부모 클래스로 사용하기 때문에 인터페이스를 추가로 정의하지 않아도 됩니다.


Auth라는 공통 부모 클래스가 이미 존재하기 때문에 굳이 인터페이스를 추가하지 않아도 되고,

제네릭을 통해 간결하고 타입 안전한 구현 ㄱㄴ

 

제네릭 방식과 인터페이스 방식은 설계 의도와 코드 구조에 따라 선택...

  • 부모 클래스가 없는 경우: 인터페이스 사용
  • 부모 클래스가 있는 경우: 제네릭 사용