TL;DR

JAVA reflection을 써서 임의의 오브젝트를 생성하기 위해서는 public 하고 parameters(arguments)가 없는 constructor를 쓰는 것이 제일 간단하기 때문이다.


궁금증의 시작:

현재 프로젝트에서 ModelMapper를 이용해서 DTO 클래스 <-> Entity 클래스 간 변화를 주도하다 보면 DTO나 Entity 클래스에는 반드시 파라미터가 없으며 private 하지 않은 생성자가 필요하다.
없으면 에러가 발생한다.

int name;
int age;
...
// 어째선지 public하고 argument가 없는 생성자를 필요로 한다.
public ClassName() {}
...

왜죠...?


이유: Java Reflection

왜 그런고 하면, Hibernate나 Modelmapper는 Java의 "reflection"을 사용하기 때문이다.
Java의 reflection을 이용해 클래스에 도달하는 구현 자체는 가능하지만,

클래스의 생성자에서 파라미터가 일부가 제외되거나 public하지 않다면,
scope와 파라미터 불일치 문제로 아래와 같은 심플한 코드가 수행될 수 없기 때문이다.

//clazz는 동적으로 파라미터로 부여된 임의의 클래스의 reflection.
clazz.newInstance(); // 이렇게 쉽게, XX Class의 Obj를 만들고 싶지만 할 수 없게 된다.

JVM 종류에 따라 생성자(constructor)를 쓰지 않고 오브젝트를 직접 생성할 수 있는 녀석이 있으나 "모든" JVM에서 되는게 아니기 때문에 위와 같은 원칙이 발생한다.
(상세 내용은 아래 연관링크 1 참조)


연관링크
1: Hibernate 생성자에 대한 질의
2: ModelMapper official site