Java Method - 놓치기 쉬운 개념들

이강현·2025년 4월 2일

Argument & Parameter

  • 메서드를 호출하는 Caller 입장에서 메서드에 넘겨주는 실제 값Argument(인자)라고 합니다.

  • 메서드가 정의될 때 전달 받을 argument를 저장하기 위해 선언하는 변수Parameter(매개변수)합니다.



Argument Type | Parameter Type

  • Argument Type은 Parameter Type과 일치하거나 자동 형변환이 가능한 것이어야 합니다.
public class MethodTestMain {

    public static void main(String[] args) {
        int i = 5;
        // Argument Type: int, Parameter Type: long
        // int -> long auto-casting OK!
        myMethod(i); 

		MyClass myClass = new MyClass();
        // Argument Type: MyClass, Parameter Type: MyInterface
        // MyClass(implement) -> MyInterface(interface) auto-casting OK!
        myMethod(myClass);
    }

    private static void myMethod(long l) {
        System.out.println("OOPTestMain.MyMethod");
        System.out.println("l = " + l);
    }

    private static void myMethod(MyInterface mi) {
        // mi.instanceMethod(); <- need down-casting
        MyClass myClass = (MyClass) mi;
        myClass.instanceMethod();
        mi.interfaceMethod();
    }
}

interface MyInterface {
    void interfaceMethod();
}

class MyClass implements MyInterface {
    private long iv;

    @Override
    public void interfaceMethod() {
        System.out.println("MyClass.testMethod");
    }

    public void instanceMethod() {
        System.out.println("MyClass.instanceMethod");
    }
}



Varargs(가변 인자)

가변 인자는 다음과 같은 규칙이 있습니다.

  • 가변 인자는 메서드의 매개변수 목록에서 마지막에 위치해야 합니다.
  • 가변 인자를 사용하는 메서드를 오버로딩할 때 모호성이 발생하지 않도록 주의해야 합니다.

가변 인자는 배열 처럼 다루면 됩니다.

	void varargsMethod(/* {variable, ...} */ int... varargs) {
        for (int i = 0; i < varargs.length; i++) {
            System.out.println(varargs[i]);
        }
    }



메서드의 반환 개수

  • 자바의 메서드에서는 오직 1개 이하(0 or 1)의 결과만 반환할 수 있습니다.

  • 다음과 같은 이유에서 2개 이상의 결과 반환을 제한했습니다.

    • 자바는 단순하고 명확한 코드를 중요하게 생각합니다. 메서드가 하나의 결과만 반환하도록 제한함으로써 코드의 복잡성을 줄이고 예측 가능성을 높일 수 있습니다.
    • 자바는 OOP 언어이고 OOP 원칙을 따르는 것을 권장합니다. 하나의 결과만 반환하도록 제한해서 메서드가 SRP(단일 책임 원칙)를 수행하도록 유도합니다.
    • 메서드의 역할과 책임이 명확해지면 객체간의 상호작용을 명확하게 정의할 수 있고 가독성유지보수성이 향상됩니다.

만약 여러 결과를 반환해야 한다면 다음과 같은 내용을 순차적으로 확인해볼 필요가 있습니다.

  • SRP를 지키고 있는지 확인해봅니다.
  • 결과를 반환하는 것이 아닌, 결과를 필요로 하는 다른 기능들을 함수가 직접 호출할 수 있는지 확인해 봅니다.
  • 실질적으로 여러개의 결과를 반환합니다. 최후의 수단으로 활용할 수 있는 방안들입니다.
    • 출력 매개변수: 결과를 저장할 곳을 매개변수로 전달해 줍니다.
    • 배열 또는 Collection: 결과들이 동일한 타입이라면 가독성은 떨어지지만 편리한 방법입니다.
    • 사용자 정의 클래스 또는 Record: 코드가 길어지거나 비효율적일 수 있지만 가독성이 높습니다.
    • 그외 Map, Object배열 등도 활용할 수 있습니다.



Overloading Method 선택 우선순위

컴파일러는 Overloading 된 메서드들 중에 호출에 가장 적합한 메서드를 선택하기 위해 다음과 같은 우선순위를 따릅니다.

    1. 정확한 매칭
    • 호출에 사용된 argument(인자)의 타입과 정확히 일치하는 메서드를 우선적으로 찾습니다.
    1. 형변환 우선순위
    • 1이 없는 경우, 자동 형변환을, 그 중에서도 우선순위가 높은 것 부터 고려합니다.
    1. 가변 인자
    • 1, 2가 없는 경우, 가변 인자를 사용하는 메서드를 고려합니다.
    1. Ambiguous(모호)
    • 1, 2, 3이 없거나 같은 우선순위를 가진 메서드가 여럿 있는 등 어떤 메서드를 선택해야 할지 결정할 수 없는 경우, 컴파일 오류가 발생합니다.
profile
백엔드 개발자 지망생입니다.

0개의 댓글