반응형

Java에서 파라미터로 여러 타입을 받을 수 있도록 설계하려면 다음과 같은 방법들을 사용할 수 있습니다. 각 방법은 특정 상황에 적합하므로, 필요에 따라 적절한 방법을 선택하세요.


1. Object 타입 사용

가장 단순한 방법은 파라미터 타입을 Object로 선언하는 것입니다. 하지만 호출 시 적절한 타입으로 캐스팅해야 합니다.

public void processParameter(Object param) {
    if (param instanceof String) {
        System.out.println("Received a String: " + param);
    } else if (param instanceof Integer) {
        System.out.println("Received an Integer: " + param);
    } else if (param instanceof List) {
        System.out.println("Received a List: " + param);
    } else {
        System.out.println("Unknown type: " + param.getClass().getName());
    }
}

호출:

processParameter("Hello");
processParameter(42);
processParameter(List.of("A", "B", "C"));

2. 제네릭 사용

제네릭을 사용하면 타입 안정성과 유연성을 동시에 확보할 수 있습니다.

public <T> void processParameter(T param) {
    if (param instanceof String) {
        System.out.println("Received a String: " + param);
    } else if (param instanceof Integer) {
        System.out.println("Received an Integer: " + param);
    } else {
        System.out.println("Unknown type: " + param.getClass().getName());
    }
}

호출:

processParameter("Hello");
processParameter(42);

3. 가변 인자 (Varargs) 사용

가변 인자는 여러 값을 받을 수 있도록 설계된 문법입니다.

public void processParameters(Object... params) {
    for (Object param : params) {
        if (param instanceof String) {
            System.out.println("String: " + param);
        } else if (param instanceof Integer) {
            System.out.println("Integer: " + param);
        } else {
            System.out.println("Unknown type: " + param.getClass().getName());
        }
    }
}

호출:

processParameters("Hello", 42, List.of("A", "B", "C"));

4. @SafeVarargs와 제네릭 가변 인자 사용

제네릭과 가변 인자를 함께 사용할 수 있습니다.

@SafeVarargs
public final <T> void processParameters(T... params) {
    for (T param : params) {
        System.out.println("Type: " + param.getClass().getName() + ", Value: " + param);
    }
}

호출:

processParameters("Hello", 42, List.of("A", "B", "C"));

5. 다형성 활용 (인터페이스 또는 부모 클래스)

공통된 부모 클래스나 인터페이스를 활용하여 여러 타입을 지원할 수 있습니다.

interface Processable {
    void process();
}

class StringProcessor implements Processable {
    private final String value;
    public StringProcessor(String value) { this.value = value; }
    @Override
    public void process() {
        System.out.println("Processing String: " + value);
    }
}

class IntegerProcessor implements Processable {
    private final Integer value;
    public IntegerProcessor(Integer value) { this.value = value; }
    @Override
    public void process() {
        System.out.println("Processing Integer: " + value);
    }
}

public void process(Processable param) {
    param.process();
}

호출:

process(new StringProcessor("Hello"));
process(new IntegerProcessor(42));

6. Record 또는 DTO 사용

다양한 타입의 값을 하나의 컨테이너로 묶어서 전달하는 방법입니다.

public record MultiTypeParam(String strValue, Integer intValue, List<String> listValue) {}

public void process(MultiTypeParam param) {
    if (param.strValue() != null) {
        System.out.println("String: " + param.strValue());
    }
    if (param.intValue() != null) {
        System.out.println("Integer: " + param.intValue());
    }
    if (param.listValue() != null) {
        System.out.println("List: " + param.listValue());
    }
}

호출:

process(new MultiTypeParam("Hello", 42, List.of("A", "B", "C")));

요약

  • 간단한 경우: Object 또는 Object....
  • 타입 안정성이 필요한 경우: 제네릭 사용.
  • 다양한 처리 논리를 통합: 인터페이스 또는 다형성 활용.
  • 구조화된 데이터: Record 또는 DTO.

어떤 방법을 선택할지는 애플리케이션의 요구사항과 코드의 복잡성에 따라 결정하면 됩니다.

반응형

+ Recent posts