
Java의 경우 일반적으로 아래와 같은 형태의 Class 구조를 가집니다.

위 코드를 Kotlin으로 작성할 시 아래와 같이 Constructor, Getter, Setter 추가로 정의할 필요가 없습니다.

Kotlin에서는 아래와 같은 Constructor의 인자들을 Property라고 하는데, 이는 Field와 Getter, Setter를 모두를 포함하는 요소라는 의미를 지닙니다.

즉, Kotlin에서는 Field만 정의해주어도 Getter와 Setter를 자동으로 생성해주기 때문에, Java처럼 별도의 메소드를 생성하지 않아도 아래와 같이 작성할 경우 Getter, Setter 메소드와 동일한 동작을 수행하게 됩니다.

Java의 경우 일반적으로 아래와 같이 Constructor에서 유효성 검증을 수행합니다. 반면, Kotlin에서는 Constructor 호출 시 한 번만 수행되는 init 블록을 활용하여 Property에 대한 유효성 검증을 수행합니다.

이러한 동작을 Kotlin에서는 아래와 같이 작성하여 동일하게 구현할 수 있습니다.

Java의 경우 Constructor의 인자 일부에 고정값을 주입하기 위해 Constructor Overloading를 활용합니다. 반면, Kotlin에서는 아래와 같이 Secondary Custructor를 활용하여 동일한 기능을 수행합니다.

추가로, Kotlin에서는 아래와 같이 Default Value를 활용하여 동일한 동작을 수행할 수 있으며, 여러 개의 Constructor를 정의하기 보다 아래와 같은 방법을 더 권장하고 있습니다.

Kotlin에서는 커스텀 Getter와 Setter는 함수가 아닌 Class의 Property로 표현할 때 사용하는 방법입니다.
예를 들어, Java에서는 Person이라는 Class에서 age를 활용하여 성인 여부를 확인하기 위해선 아래와 같은 함수를 정의해야 합니다.

하지만, Kotlin에서는 아래와 같이 get()을 활용하여 함수가 아닌 Property처럼 구현할 수 있습니다.

Custom Setter는 아래와 같이 활용할 수 있습니다.

Kotlin에는 자기 자신을 가리키는 보이지 않는 Field인 Backing Field라는 개념이 존재합니다.field라는 예약어를 통해 사용할 수 있고, Custom Getter/Setter를 정의할 때 무한루프를 방지하기 위해 사용합니다.
아래는 name을 조회할 때 대문자로 출력하도록 Custom Getter를 정의한 코드입니다.

Kotlin에서는 변수명.프로퍼티명, 프로퍼티명을 호출한 경우 Getter 호출해 값을 얻어옵니다. 즉, 아래와 같이 name을 호출하면 다시 또 Getter를 호출하게 되면서 무한루프가 발생합니다.

이러한 상황에서 아래와 같이 자기 자신을 가리키는 Backing Field를 활용하여 무한루프를 방지하고 원하는 동작을 수행할 수 있습니다.
