본문 바로가기
Kotlin

[Kotlin in Action] 2.2 클래스와 프로퍼티

by Nhahan 2025. 3. 14.

코틀린을 활용하면 더 적은 양의 코드로 클래스와 관련 있는 대부분의 작업을 수행할 수 있다. 아래는 간단한 자바 클래스를 동일하게 코틀린 클래스로 변환했을 때의 예제이다.

// Java
public class Person {
    private final String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}
// Kotlin
class Person(val name: String)

멋지다. 이런 유형의 클래스(코드가 없이 데이터만 저장하는 클래스)를 값 객체라 부른다.

자바의 public 가시성 변경자(visibiloty modifier)가 사라졌는데, 코틀린의 기본 가시성은 public이므로 생략가능하기 때문이다.

 

2.2.1 프로퍼티

코틀린은 프로퍼티(=필드+접근자)를 언어 기본 기능으로 제공하고, 프로퍼티를 선언할 때는 val이나 var를 사용한다.

val로 선언한 프로퍼티는 read only이며, var로 선언한 프로퍼티는 변경 가능하다.

class Person(
    val name: String, // 읽기 전용(read onㅣy) 프로퍼티로 private 필드이며, public getter가 제공된다.
    var isMarried: Boolean // 쓸 수 있는 프로퍼티로 private 필드이며, public getter&setter가 제공된다.
)

 

 

2.2.2 커스텀 접근자

직사각형 클래스인 Rectangle을 정의하면서 자신이 정사각형인지 알려주는 기능을 만들어보자. 직사각형이 정사각형인지 여부를 별도의 필드에 저장할 필요 없이, 사각형의 너비와 높이가 같은지 검사하면 정사각형 여부를 그 때 그 때 알 수 있다.

class Rentangle(val height: Int, val width: Int) {
    val isSquare: Boolean
        get() { // 프로퍼티 게터 선언
            return height == width
        }
}

isSquare 프로퍼티에는 자체 값을 저장하는 필드가 필요 없다. 이 프로퍼티에는 자체 구현을 제공하는 게터만 존재한다. 클라이언트가 프로퍼티에 접근할 때마다 게터가 프로퍼티 값을 매번 다시 계산한다.

이 경우에는 블록을 본문으로 하는 구문 대신 식을 본문으로 하는 함수, get() = height == width로 해도 된다.

 

2.2.3 코틀린 소스코드 구조: 디렉토리와 패키지

코틀린은 자바와 다르게 패키지 구조와 디렉토리 구조가 맞아 떨어질 필요는 없다. 하지만, 코틀린도 자바와 같이 패키지 별로 디렉토리를 구성하는 편이 좋다.

하지만, 여러 클래스를 한 파일에 넣는 것을 주저해서는 안 된다.

 

댓글