C/C++에서 printf() 함수를 사용하게 되면 formatted string 형태로 출력할 수 있다. Java에서는 String 클래스의 format() method를 사용하거나 Formatter 클래스를 사용하게 된다. 그러나 String.format()을 사용했을 때 예기치 않은 컴파일 에러가 발생하기도 한다. 다음 코드를 살펴보자.
double sum = 0.0;
System.out.println(String.format("%f", sum));
이런 코드에 대해 다음과 같은 컴파일 에러가 발생할 수 있다.
The method format(String, Object[]) in the type String is not applicable for the arguments (String, double)
간단하게 생각해보면 에러 메시지에 나온 대로 데이터를 가공해서 parameter로 넣어주는 다음과 같은 해결책이 있다.
Double newSum = new Double(sum);
System.out.println(String.format("%f", new Double[] { newSum }));
그러나 이같은 방법은 아무래도 번거롭다. 이런 짓을 하자고 format() method를 사용한다니 뭔가 이상하다. 사실, 이 문제는 JDK source level과 관련이 있는 문제이다. Eclipse에서 프로젝트를 생성할 때 하위 호환성을 위해 source level을 1.4 정도로 설정해놓으면 이런 문제가 발생할 수 있다. 이 문제의 해결방법은 바로 source level을 1.5 이상으로 높여서 사용하는 것이다.
JDK 1.5부터는 format(String, varargs) 형태로 API가 변경되었다. 그 이전(1.4.2)에서는 format() method에 대한 정의를 찾을 수가 없었다.
static String\tformat(String format, Object... args)
코드의 변경없이 source level만 높여서 해결할 수 있으므로 프로젝트 설정을 변경하면 된다.
우선, Eclipse 자체의 프로젝트 설정을 수정하는 게 정석이다. 프로젝트의 Properties 창을 열어서 Java Compiler 항목에서 Compiler compliance level을 1.5 이상으로 변경하면 된다.
편법으로, 설정 파일을 직접 고치는 방법이 있다. 프로젝트의 .setting 디렉토리의 org.eclipse.jdt.core.prefs 파일을 열어서, 다음과 같이 1.4로 되어 있는 값을 1.5로 수정하면 된다.
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.source=1.5
(이렇게 설정 파일을 직접 수정하게 되면 이미 열려 있는 프로젝트에 설정 변경이 적용되지 않을 수도 있다.)
이도저도 모두 귀찮을 때에는 코드에 @SuppressWarnings를 추가하여 source level을 조정하라는 에러 메시지가 발생하면 Quick Fix를 통해 source level을 1.5로 올리는 방법도 있다.