Develop/Kotlin

[Kotlin] @field: Java와의 비교를 통한 이해

DevPi 2024. 8. 28. 16:35
반응형

Kotlin과 Java는 모두 JVM에서 실행되는 언어로, 많은 공통점을 가지고 있지만, 코드 작성 방식에서는 차이가 존재합니다. 특히 어노테이션을 적용할 때 Kotlin에서는 Java와 다른 구문적 차이를 보입니다. 이번 포스팅에서는 Kotlin의 @field: 어노테이션을 Java와 비교하며 그 차이를 이해해보겠습니다.


Kotlin의 프로퍼티와 어노테이션

Kotlin에서는 프로퍼티가 field, getter, setter로 컴파일됩니다. 예를 들어, 다음과 같은 Kotlin 프로퍼티를 생각해 봅시다.

var name: String = "Kotlin"

이 프로퍼티는 컴파일되면서 다음과 같은 구성 요소로 나뉩니다:

  • field: 실제 데이터를 저장하는 공간.
  • getter: 프로퍼티의 값을 읽을 때 호출되는 메서드
  • setter: 프로퍼티의 값을 설정할 때 호출되는 메서드

이러한 구조 때문에 Kotlin에서는 어노테이션을 field, getter, setter중 어디에 적용할지를 명확히 지정해야 할 경우가 많습니다.

 

Java와의 비교

Java에서는 클래스의 필드에 직접 어노테이션을 붙이는 것이 일반적입니다.

data class Person(
    @field:NotNull
    var name: String
)

여기서 @field:NotNull은 어노테이션이 실제 필드에 적용되도록 지정합니다.

@field:의 사용이 필요한 경우

  • 필드에 직접 어노테이션을 적용해야 할 때: Jackson의 @JsonProperty나 JPA의 @Column과 같은 어노테이션은 필드에 직접 적용되어야 합니다.
  • 검증 라이브러리 사용 시: Bean Validation(JSR 380)에서 @NotNull과 같은 검증 어노테이션은 필드에 적용되어야 올바르게 동작합니다.

예시: Kotlin vs Java

Java 코드 예시

public class User {
    @NotNull
    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

 

Kotlin 코드 예시

Java와 동일한 기능을 Kotlin에서 구현하려면, @field:를 사용하여 필드에 어노테이션을 적용합니다.

data class User(
    @field:NotNull
    var username: String
)

이 코드에서 @field:NotNull은 어노테이션이 프로퍼티의 필드에 적용되도록 보장합니다. @field:를 생략하고 그냥 @NotNull만 작성하면, 기본적으로 어노테이션이 게터에 적용될 수 있기 때문에, 의도와 다른 동작이 발생할 수 있습니다.

어노테이션 대상 명시

Kotlin에서는 어노테이션을 다양한 대상에 적용할 수 있으며, 그 대상은 다음과 같습니다.

  • @field: : field에 적용
  • @get: : getter에 적용
  • @set: : setter에 적용
  • @property: : property 전체에 적용
  • @param: : 생성자 파라미터에 적용

요약

  • Java에서는 필드에 직접 어노테이션을 적용할 수 있지만, Kotlin에서는 프로퍼티가 field, getter, setter로 나뉘므로 어노테이션을 정확히 적용하려면 @field:를 사용해야 합니다.
  • @field: 어노테이션은 Kotlin 프로퍼티의 필드에 직접 어노테이션을 적용하며, 검증이나 직렬화 라이브러리와 같은 특정 상황에서 필수적입니다.
  • 올바르게 어노테이션을 적용하면, Kotlin에서도 Java와 동일한 수준의 유효성 검사와 데이터 직렬화 등을 구현할 수 있습니다.

이 차이를 이해하면 Kotlin과 Java 간 어노테이션 사용에서 발생할 수 있는 혼란을 줄이고, 더 정확하고 유지보수 가능한 코드를 작성할 수 있습니다. Kotlin에서 어노테이션을 사용할 때는 어노테이션이 적용될 정확한 대상을 지정하는 것이 중요하다는 점을 꼭 기억해야 합니다.

반응형