Java

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

99duuk 2024. 12. 11. 11:47

파라미터 타입이 달라 코드 중복이 발생하는 문제"를 인터페이스를 통해 해결하는 것을 

간단한 예로 다시 정리해둔 것임...


Animal 인터페이스를 활용하여 공통 로직을 모듈화하고,

파라미터 타입이 달라도 하나의 메서드에서 처리할 수 있도록 ...


 

Dog, Cat, Bird와 같은 다양한 동물 객체가 있
각 동물 클래스는 공통적으로 이름(name)과 나이(age)를 가지고 있지만,
특정 동물마다 고유한 속성이 추가로 존재

 

공통 로직은 동물의 이름과 나이를 출력하는 작업
하지만 각 동물 클래스가 서로 다른 타입이기 때문에 코드 중복이 발생


클래스 구조 

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

    // Getter/Setter
}

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

    // Getter/Setter
}

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

    // Getter/Setter
}

기존 방식: 각 타입별로 별도 메서드 작성

각 동물의 이름과 나이를 출력하기 위해 별도의 메서드를 작성해야 했

public void printDogInfo(Dog dog) {
    System.out.println("Name: " + dog.getName());
    System.out.println("Age: " + dog.getAge());
}

public void printCatInfo(Cat cat) {
    System.out.println("Name: " + cat.getName());
    System.out.println("Age: " + cat.getAge());
}

public void printBirdInfo(Bird bird) {
    System.out.println("Name: " + bird.getName());
    System.out.println("Age: " + bird.getAge());
}

문제점

  • 코드 중복: 이름과 나이를 출력하는 로직은 공통되지만, 타입이 달라 중복 코드 발생.
  • 확장성 부족: 새로운 동물 클래스(Fish, Rabbit 등)가 추가되면 새로운 메서드를 계속 작성해야 함.

해결: 공통 인터페이스를 도입하여 모듈화

1. 공통 인터페이스 정의

모든 동물이 Animal 인터페이스를 구현하도록 설계:

public interface Animal {
    String getName();
    int getAge();
}

 

2. 각 동물 클래스가 Animal을 구현

모든 동물 클래스가 Animal을 구현하여 공통 메서드를 제공하게:

public class Dog implements Animal {
    private String name;
    private int age;
    private String breed;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getAge() {
        return age;
    }

    // Getter/Setter for breed
}

public class Cat implements Animal {
    private String name;
    private int age;
    private String furColor;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getAge() {
        return age;
    }

    // Getter/Setter for furColor
}

public class Bird implements Animal {
    private String name;
    private int age;
    private boolean canFly;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getAge() {
        return age;
    }

    // Getter/Setter for canFly
}

 

3. 공통 메서드로 로직 통합

이제 공통 인터페이스를 활용해 하나의 메서드로 통합할 수 있:

public void printAnimalInfo(Animal animal) {
    System.out.println("Name: " + animal.getName());
    System.out.println("Age: " + animal.getAge());
}

사용예

Dog dog = new Dog();
dog.setName("Buddy");
dog.setAge(3);

Cat cat = new Cat();
cat.setName("Whiskers");
cat.setAge(2);

Bird bird = new Bird();
bird.setName("Tweety");
bird.setAge(1);

printAnimalInfo(dog); // Dog 객체 처리
printAnimalInfo(cat); // Cat 객체 처리
printAnimalInfo(bird); // Bird 객체 처리

결과

  • 코드 중복 제거: printAnimalInfo 메서드 하나로 모든 동물 객체를 처리 가능.
  • 확장성 향상: 새로운 동물 클래스(Fish, Rabbit)가 추가되더라도,
    Animal 인터페이스만 구현하면 공통 메서드에서 처리 가능.
  • 타입 안정성 보장: Animal을 구현하지 않은 클래스는 사용할 수 없음.