Java 헬퍼 클래스를 빌드 스크립트 쪽 Groovy로 옮겼더니 같은 호출이 다른 메서드로 갔습니다. 순서대로 정리하면 이렇습니다.
class Printer {
void show(Object o) { println 'object' }
void show(String s) { println 'string' }
void run(Object x) { show(x) }
}
new Printer().run('hi')
Java에서는 x의 선언 타입이 Object이므로 컴파일 시점에 show(Object)가 정해지고 object가 출력됩니다. Groovy는 실행 시점에 실제 인자 타입으로 메서드를 고르므로 같은 코드가 string을 출력합니다. 문서에도 multi-methods라는 이름으로 나와 있는 동작이라 버그는 아닙니다.
헷갈리는 건 세 번째 경우입니다. 클래스에 @CompileStatic을 붙이면 다시 object가 나옵니다. 즉 같은 소스가 어노테이션 하나로 다른 메서드를 부릅니다. 오버로드를 타입별로 나눠 둔 헬퍼가 몇 개 더 있어서, @CompileStatic을 파일 단위로 붙이는지 클래스 단위로 붙이는지, 아니면 오버로드 자체를 없애는 게 맞는지 궁금합니다.