클래스와 프로퍼티

1. 클래스와 프로퍼티 개념

Java에서의 클래스 정의

public class Person {
    private final String name;
    
    public Person(String name){
        this.name = name;
    }
    
    public String getName() {
        return name; // this.name 이어야 하는거 아닌가?
    }
}

Kotlin에서의 클래스 정의

class Person(val name: String)
  • val 키워드로 선언된 프로퍼티는 읽기 전용이며, 내부적으로 private 필드와 public 게터를 생성.
  • Java의 VO(Value Object) 개념과 유사함.

2. 프로퍼티와 접근자

Java에서의 접근자 메서드

Person person = new Person("Bob");
System.out.println(person.getName());

Kotlin에서의 접근자

val person = Person("Bob", true)
println(person.name) // 자동으로 게터 호출
println(person.isMarried)

person.isMarried = false // 자동으로 세터 호출
  • Kotlin에서는 프로퍼티를 직접 사용해도 내부적으로 게터/세터를 자동 호출.
  • val 프로퍼티는 getter만 제공.
  • var 프로퍼티는 getter와 setter를 제공.

3. 커스텀 접근자

class Rectangle(val height: Int, val width: Int) {
    val isSquare: Boolean
        get() { // 커스텀 게터
            return height == width
        }
}
  • 프로퍼티에 커스텀 게터를 추가하면, 접근할 때마다 값이 동적으로 계산됨.
  • 위의 isSquare 프로퍼티는 height와 width가 같을 경우 true 반환.
  • 더 간결하게 표현 가능:
val isSquare: Boolean get() = height == width

4. Kotlin 소스코드 구조

패키지 사용

package geometry.shapes

import java.util.Random

class Rectangle(val height: Int, val width: Int) {
    val isSquare: Boolean get() = height == width
}

fun createRandomRectangle(): Rectangle {
    val random = Random()
    return Rectangle(random.nextInt(), random.nextInt())
}
  • package 문을 사용해 패키지 단위로 코드 관리 가능.
  • 다른 패키지에서 선언을 가져오려면 import 필요.

다른 파일에서 사용

package geometry.example

import geometry.shapes.createRandomRectangle

fun main() {
    println(createRandomRectangle().isSquare)
}

5. Kotlin과 Java의 차이점

특징JavaKotlin

클래스 필드 private 필드 + 게터/세터 프로퍼티로 직접 접근 가능
읽기 전용 필드 final 키워드 사용 val 키워드 사용
가변 필드 private 필드 + set 메서드 var 키워드 사용
커스텀 접근자 get 메서드 수동 작성 get() = ... 형태로 간결하게 정의
패키지 구조 디렉터리 구조 필수 디렉터리와 무관

6. 결론

  • Kotlin의 프로퍼티 개념은 Java보다 훨씬 간결하고 직관적.
  • valvar를 이용해 게터/세터를 자동으로 생성.
  • 커스텀 접근자를 활용하면 불필요한 필드 없이 동적인 프로퍼티 정의 가능.
  • 패키지 구조가 Java보다 유연하여 더 자유로운 코드 작성 가능.

참고

  • 드미트리 제메로프,스베트라나 이사코바, Kotlin in Action (에이콘출판, 2017)

+ Recent posts