
8.1 코틀린에서 프로퍼티 이용
8.1.1 프로퍼티란?
- 코틀린에서는 클래스의 변수를 프로퍼티(Property)라 부른다.(var, val)
- 변수처럼 보이지만 함수가 내장된 변수이기 때문에 변수가 아닌 프로퍼티라 부른다. getter, setter 내장
- 프로퍼티를 이용하면 외부에서는 변수를 직접 이용하는 것처럼 보이고, 불필요한 getter/setter 함수를 만들지
않아도 된다.
8.1.2 사용자 정의 프로퍼티
- 기본 getter/setter 함수는 배킹 필드를 이용해 프로퍼티 값을 변경하거나 그대로 전달하는 역할만 한다.
- 만약 개발자가 특정 작업(유효성 검증 등)에 프로퍼티 값을 이용하고자 한다면 getter/setter를 직접 정의한다.
- get(), set() 함수 내부에서는 프로퍼티 값을 field로 접근한다.
- val로 선언한 프로퍼티는 set() 함수를 정의할 수 없다.
- val로 선언한 프로퍼티는 get() 함수를 정의하면 초깃값을 명시하지 않아도 된다. var 프로퍼티는 명시해야 한다.
8.1.3 주 생성자와 프로퍼티
- 지역 변수는 프로퍼티가 아니다. get(), set() 함수를 제공하지 않는다.
- 주 생성자 매개 변수를 var, val로 선언하면 클래스의 멤버 변수이므로 생성자의 지역변수가 아니다. 외부에서 이용
할 수 있다.
- 생성자에 var, val로 선언한 변수는 직접 그곳에 get(),set()을 정의할 수 없지만 다른 프로퍼티에 대입 후 선언 가능.
- 이 경우에는 주 생성자의 매개변수에 직접 접근할 수 없도록 해야 한다. 매개 변수의 var, val을 제거하고 클래스
멤버 변수를 주 생성자 매개변수와 같은 이름으로 선언한 뒤 대입한다.
ex) class User(name:String) { var name:String = name }
8.2 프로퍼티 초기화
- 프로퍼티는 선언과 동시에 초깃값을 대입해 초기화해야 한다. 하지만 상황에 따라서 선언과 동시에 초깃값을 대입할
수 없을 때가 있다. 이때 초기에 null을 대입해 놓거나 아예 초기화 시점을 미루는 방법을 제공한다.
8.2.1 초기화 블록에서 초기화
- 클래스의 프로퍼티를 선언하면서 동시에 초깃값을 대입하지 않고, 초기화 블록에서 프로퍼티를 초기화해 사용할 수 있다.
8.2.2 null 허용으로 선언
8.2.3 늦은 초기화(lateinit)
- 프로퍼티를 null 허용으로 선언하지 않고 프로퍼티 초기화를 미루기 위해 lateinit 예약어를 사용한다.
ex) lateinit var lateData:String // main{ user.lateData = "hello" }
- 하지만 늦은 초기화는 주의 사항이 많다.
-> var로 선언한 프로퍼티 / 클래스 몸체 o, 주 생성자 x / get(),set() 정의 x / null 허용 프로퍼티 x / 기초 타입 x
8.2.4 초기화 미루기(by lazy)
- 프로퍼티 초기화를 프로퍼티의 이용 시점으로 미루는 방법도 있다 : by laze{}
- 프로퍼티 초기화를 by laze{ } 영역에서 실행. 표현식이므로 맨 마지막 값으로 초기화 된다.
- 프로퍼티가 사용되는 시점에 lazy 영역이 실행되어 프로퍼티가 초기화 된다.
- val 변수 / 클래스 몸체o, 최상위 레벨 o / 기초 타입 o
- 코틀린은 null 처리가 엄격하다. 따라서 null을 대입하지 않는 프로퍼티에 단지 초기화 시점을 미루기 위해 null
허용으로 선언할 필요는 없다.
- 의존성 주입에 의한 초기화 등이 초기화 시점을 미루어야 하는 대표적인 예이다.
8.3 프로퍼티 값 변경 감지
- var name:String "by Delegates.observable("초깃값", {값 변경 시 실행되는 영역})
※ 코틀린에서는 필드(field, 멤버 변수)를 제공하지 않는다. 프로퍼티라는 객체를 제공한다.
'Programming > Kotlin' 카테고리의 다른 글
10장. 추상 클래스와 인터페이스 (0) | 2020.01.21 |
---|---|
9장. 상속 (0) | 2020.01.20 |
7. 클래스 (0) | 2020.01.16 |
6. 흐름 제어 구문과 연산자 (0) | 2020.01.13 |
5. 데이터 타입 (0) | 2020.01.13 |