본문으로 건너뛰기

Item1

1 가변성을 제한하라

  • 코틀린은 모듈로 프로그램을 설계합니다.
  • 모듈은 클래스, 객체, 함수, 타입 별칭, 톱레벨 프로퍼티 등 다양한 요소로 구성됩니다.
  • 이러한 요소 중 일부는 상태를 가질 수 있습니다.
  • 예를 들어, 읽고 쓸 수 있는 프로퍼티 var를 사용하거나 mutable 객체를 사용하면 상태를 가질 수 있습니다.

2. 상태 관리의 어려움

  • 시간의 변화에 따라서 변하는 요소를 표현하는 것은 유용하지만 상태를 적절하게 관리하는 것은 어렵습니다.
  • 프로그램을 이해하고 디버그하기 힘들어집니다.
  • 가변성이 있으면 코드의 실행을 추론하기 어렵습니다.
    • 시점에 따라 값이 달라질 수 있으므로 현재 어떤 값을 가지고 있는지 알아야 실행을 예측할 수 있습니다.
  • 멀티 스레드 프로그램에서 적절한 동기화가 필요합니다.
    • 변경이 일어나는 모든 부분에서 충돌이 발생할 수 있습니다.
  • 테스트하기 어렵습니다.
    • 모든 상태를 테스트해야 하므로 테스트 케이스가 많아집니다.
    • 변경이 많으면 많을수록 더 많은 조합을 테스트해야 합니다.
  • 상태 변경이 일어날 때 이러한 변경을 다른 부분에 알려야 하는 경우가 있습니다.
    • 예를 들어 정렬되어 있는 리스트에 가변 요소를 추가하면 요소 변경 시 리스트 전체를 다시 정렬해야 합니다.

3. 코틀린에서 가변성 제한하기

  • 코틀린은 가변성을 제한하기 위해 다양한 방법을 제공합니다.
  • 가변성을 제한하기 위한 방법은 아래와 같습니다.
    • 읽기 전용 프로퍼티 사용
    • 가변 컬렉션과 읽기 전용 컬렉션 구분하기
    • 데이터 클래스의 copy

3.1 읽기 전용 프로퍼티 사용

  • 읽기 전용 프로퍼티는 val로 선언된 프로퍼티입니다.
  • 이렇게 선언된 프로퍼티는 마치 값처럼 동작하며 일반적인 방법으로는 값이 변하지 않습니다.
    • 읽기 전용 프로퍼티가 완전 변경 불가능한 것은 아닙니다.
    • 읽기 전용 프로퍼티가 mutable 객체를 참조하는 경우에는 객체의 상태가 변경될 수 있습니다.

예시

val list = mutableListOf(1, 2, 3)
list.add(4)
println(list) // [1, 2, 3, 4]
  • 위의 예시에서 list는 읽기 전용 프로퍼티로 선언되었지만 mutableListOf를 사용하여 가변 리스트를 생성했습니다.
  • 이 경우 list는 읽기 전용 프로퍼티이지만 내부의 리스트는 가변입니다.
  • 따라서 list의 상태는 변경될 수 있습니다.