더북(TheBook)

프로그램이 시작될 때 바로 파일을 읽는다. 하지만 게터를 사용한 프로퍼티를 사용해 다음과 같이 정의하면

val text get() = File("data.txt").readText()

프로그램이 프로퍼티 값을 읽을 때마다 파일을 매번 다시 읽어온다.

필요하면 프로퍼티 타입을 명시할 수도 있다.

val text: String by lazy { File("data.txt").readText() }

이 구문은 사실 프로퍼티 처리에 필요한 데이터를 모아 유지하면서 읽기와 쓰기를 처리하는 위임 객체(delegate object)를 통해 프로퍼티를 구현하게 해주는 위임 프로퍼티(delegate property)라는 기능의 특별한 경우다. 위임 객체는 by라는 키워드 다음에 위치하며, 코틀린이 정한 규약을 만족하는 객체를 반환할 수 있는 임의의 식이 될 수 있다. 우리 예제에서 lazy {}는 코틀린의 내장 구성 요소가 아니라 표준 라이브러리 함수에 람다를 넘기는 식일 뿐이다(2장 코틀린 언어 기초에서 배열 인스턴스 생성을 설명할 때 람다를 넘기는 표준 라이브러리 함수를 이미 살펴봤다).

코틀린이 기본으로 제공하는 몇 가지 위임 객체가 있다. 지연 계산을 활성화하는 lazy 외에도, 프로퍼티를 읽거나 쓸 때마다 리스너(listener)에게 통지해주는 위임이나 프로퍼티 값을 필드에 저장하는 대신 맵에 저장하는 위임 등이 기본으로 제공된다. 이 절에서는 지연 계산 프로퍼티라는 맥락에서 여러분이 위임을 간단히 맛볼 수 있게 해주고, 종합적인 처리에 대한 논의는 7장 컬렉션과 I/O 자세히 알아보기11장 도메인 특화 언어에서 코틀린 표준 라이브러리에서의 표준 위임을 설명하고 여러분 자신의 위임 객체를 설계하는 방법을 설명할 때까지 미뤄두겠다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.