코틀린에서 프라이머리 컨스트럭터는 파라미터 일부에 val이나 var을 붙여서 프로퍼티로 설정할 수 있는데

프로퍼티는 초기값이 있어야 하므로


프라이머리 컨스트럭터의 파라미터 일부가 프로퍼티로 정의되었을 때

세컨더리 컨스트럭터가 이 프로퍼티의 기본값을 설정해 주지 않으면

초기화되지 않은 프로퍼티가 생기는 문제가 발생하는데


이런 상황을 막기 위해 코틀린에서 프라이머리 컨스트럭터가 정의됐을 경우에는

무조건 세컨더리 컨스트럭터가 프라이머리 컨스트럭터를 호출하도록 되어 있음.


프라이머리 컨스트럭터가 없을 경우에는 초기값 없는 프로퍼티가 남아 있더라도 전부 init 블록에서 초기화할 수 있어서 세컨더리 컨스트럭터는 전부 다 그냥 생성자 오버로딩으로 취급하면 되지만

프라이머리 컨스트럭터가 있으면 세컨더리 컨스트럭터가 프라이머리 컨스트럭터를 꼭 호출해야 되는 이유는 여기서 나옴.

init에서 프라이머리 컨스트럭터에서 정의된 프로퍼티에 초기값을 넣으면 생성자 호출에 넣은 아규먼트가 전부 덮어써지는 문제가 발생하니까


단순히 생각하면 세컨더리 컨스트럭터 블록 내에서 프라이머리 컨스트럭터에서 정의된 모든 프로퍼티의 초기값을 써도 되지만

이것도 사실 스칼라에 비하면 덜 엄격한 거임.

스칼라는 언어 철학 때문에 하나의 주 생성자가 필요하고 (모든 객체는 공통 생성자를 가지도록)

프라이머리 컨스트럭터가 없더라도 모든 세컨더리 컨스트럭터는 프라이머리 컨스트럭터를 호출하게 되어 있음


그리고 코틀린은 스칼라에서 클래스 구조랑 컴패니언 오브젝트 구조를 가져왔으니까

그 철학 그대로 가져왔는지는 몰라도 스칼라보다 덜 엄격하긴 해도 제한은 그대로 남아 있음.

코틀린 언어 문서 보니까 프라이머리 컨스트럭터 정의 안 됐어도 init 블록을 프라이머리 컨스트럭터 취급해서 암시적으로 부르는 거나 마찬가지로 써놨네