- 메서드를 호출하는
Caller입장에서 메서드에 넘겨주는실제 값을Argument(인자)라고 합니다.- 메서드가
정의될 때 전달 받을 argument를 저장하기 위해 선언하는변수를Parameter(매개변수)합니다.
- 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");
}
}
가변 인자는 다음과 같은 규칙이 있습니다.
- 가변 인자는 메서드의 매개변수 목록에서
마지막에 위치해야 합니다.- 가변 인자를 사용하는 메서드를
오버로딩할 때모호성이 발생하지 않도록 주의해야 합니다.가변 인자는
배열 처럼다루면 됩니다.
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 된 메서드들 중에 호출에 가장 적합한 메서드를 선택하기 위해 다음과 같은 우선순위를 따릅니다.
정확한 매칭
- 호출에 사용된
argument(인자)의 타입과 정확히 일치하는 메서드를 우선적으로 찾습니다.
형변환우선순위
- 1이 없는 경우,
자동 형변환을, 그 중에서도 우선순위가 높은 것 부터 고려합니다.
가변 인자
- 1, 2가 없는 경우,
가변 인자를 사용하는 메서드를 고려합니다.
Ambiguous(모호)
- 1, 2, 3이 없거나 같은 우선순위를 가진 메서드가 여럿 있는 등 어떤 메서드를 선택해야 할지
결정할 수 없는 경우, 컴파일 오류가 발생합니다.