본문 바로가기

Programming/Kotlin

8. 프로퍼티

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