synthetic 즉 합성이라는 말은 하기는 쉽지만 쉽게 받아들여지지는 않는 개념이다. 자바에서 합성된 요소는 컴파일 결과물 중에서 소스 코드에 대응하는 구성 요소가 없는 구성 요소 중 기본 생성자, 클래스 초기화 메서드, Enum 클래스의 values나 valueOf 메서드를 제외한 것들을 이야기 한다.
이런 합성요소의 종류는 field, method, constructor가 있다.
synthetic field
아래와 같은 코드를 생각해보자.
import java.lang.reflect.Field;
public class SyntheticTest {
private class Inner {
String name;
}
public static void main(String[] args) {
SyntheticTest test = new SyntheticTest();
test.syntheticFieldTest();
}
public void syntheticFieldTest() {
Field[] fields = SyntheticTest.Inner.class.getDeclaredFields();
for (Field f : fields) {
System.out.println("필드: isSynthetic: " + f.isSynthetic() + " : " + f);
}
}
}
SyntheticTest에는 Inner 라는 내부 클래스를 가지고 있고 Inner에는 String 타입의 name이 하나가 선언되어있다. syntheticFieldTest 메서드에서는 reflection api를 이용해서 Inner class에 선언된 field들을 출력해보고 있는데.. 출력된 결과를 살펴보면 .............................충격적으로 field는 두개다!!