Switch 문은 태생적으로 작게, 한가지 작업만 하게 만들기 힘듦.
다형성을 이용해서 Switch문을 한번만 사용하거나 사용하지 않을 수 있음.
동물의 종류에 따라 다른 행동을 하는 경우의 예시.
class Animal {
String type;
void act() {
switch (type) {
case "Dog":
// Dog의 행동을 정의
break;
case "Cat":
// Cat의 행동을 정의
break;
// ... 추가적인 동물 종류
default:
// 기본 행동
break;
}
}
}
이런 방식으로 코드를 작성하면, 새로운 동물 종류가 추가될 때마다 switch 문을 수정해야하고, 동일한 행동 코드가 여러 곳에서 반복될 수 있음.
다형성을 이용한 switch 문 숨기기
다형성을 이용하면 switch 문을 저차원 클래스에 숨길 수 있음. 이 방법은 코드 반복을 방지하고, switch 문이 한 가지 작업만 하게 만들 수 있음.
예를 들면, 동물의 종류에 따라 다른 행동을 하는 경우를 생각해보자. 동물 클래스를 만들고, 각 동물 종류를 나타내는 서브클래스를 만들 수 있다. 각 서브클래스는 동물 클래스의 '행동' 메소드를 오버라이드하여 해당 종류의 동물이 특정 행동을 어떻게 하는지 정의할 수 있다.
abstract class Animal {
abstract void act();
}
class Dog extends Animal {
void act() {
// Dog의 행동을 정의
}
}
class Cat extends Animal {
void act() {
// Cat의 행동을 정의
}
}
이렇게 하면, Animal 타입의 객체를 사용할 때는 각 동물의 특정 행동을 알 필요 없이 'act' 메소드를 호출하면 된다.
Animal myPet = new Dog();
myPet.act(); // Dog의 행동을 실행
이런 방식으로 switch 문을 다형성을 이용해 숨기면, 각 동물 종류에 따른 행동 코드를 한 곳에서 관리할 수 있고, 코드의 반복을 줄일 수 있다.
추상팩토리 패턴을 사용해서 switch문 숨기기
<aside> 💡 해당 부분은 필자의 지식 부족으로 gpt의 도움을 받았습니다 🥲
</aside>
먼저 제품 인터페이스를 정의합니다.
public interface Animal {
void act();
}
구체적인 제품 클래스들을 정의합니다.
public class Dog implements Animal {
@Override
public void act() {
System.out.println("Dog is acting.");
}
}
public class Cat implements Animal {
@Override
public void act() {
System.out.println("Cat is acting.");
}
}
추상 팩토리 인터페이스를 정의합니다.
public interface AnimalFactory {
Animal createAnimal();
}
구체적인 팩토리 클래스들을 정의합니다.
public class DogFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog();
}
}
public class CatFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Cat();
}
}
클라이언트 코드는 추상 팩토리 인터페이스를 통해 동물을 생성합니다.
public class Client {
public static void main(String[] args) {
AnimalFactory dogFactory = new DogFactory();
Animal dog = dogFactory.createAnimal();
dog.act(); // Output: Dog is acting.
AnimalFactory catFactory = new CatFactory();
Animal cat = catFactory.createAnimal();
cat.act(); // Output: Cat is acting.
}
}
동물 종류에 따라 팩토리를 제공하는 메서드를 정의하여 클라이언트 코드에서 팩토리를 선택할 수 있도록 합니다.
public class FactoryProvider {
public static AnimalFactory getFactory(String type) {
switch (type) {
case "Dog":
return new DogFactory();
case "Cat":
return new CatFactory();
default:
throw new IllegalArgumentException("Unknown animal type: " + type);
}
}
}
클라이언트 코드는 팩토리 제공 메서드를 통해 팩토리를 선택합니다.
public class Client {
public static void main(String[] args) {
AnimalFactory factory = FactoryProvider.getFactory("Dog");
Animal animal = factory.createAnimal();
animal.act(); // Output: Dog is acting.
factory = FactoryProvider.getFactory("Cat");
animal = factory.createAnimal();
animal.act(); // Output: Cat is acting.
}
}
이 예제에서는 FactoryProvider
클래스의 getFactory
메서드가 switch
문을 사용하여 적절한 팩토리를 반환합니다. 하지만 클라이언트 코드에서는 switch
문을 보지 않고, 추상 팩토리 인터페이스를 통해 다형성을 활용하여 동물을 생성하고 행동을 수행합니다. 이를 통해 switch
문을 효과적으로 숨기고, 추상 팩토리 패턴과 다형성을 결합하여 코드의 유연성과 유지보수성을 높일 수 있습니다.