[kotlin] kotlin 강의 properties2

2018. 6. 17. 21:59kotlin-이론

kotlin 강의 properties2



프로퍼티의 가시성의 변경이나 어노테이션이 필요한 경우 


기본 accessor의 수정 없이 body없는 accessor를 통해 정의가능 

var abc:String = "asdg"
private set

var seet:String = "abcd"
@Logger get 

위와 같은 방법으로 바꾸어 줄 수 있다.  body를 작성해도 상관 없다. 



Backing Field


setter와 getter에 단순히 field라는 변수를 사용하는 경우를 본적이 있을 것이다. 

이것은 setter와 getter내에서만 사용한 특별한 변수인데. 사실상 이 setter와 getter를 사용하는 객체가 field인 것 이다. 


하지만 이필드를 사용하기 위해서는 몇가지 조건이 있는데 알아보자!!!


1. accessor중 한개라도 기본 구현을 사용하는 경우 //getter와 setter중 하나라도 재정의를 하지 않으면 자동으로 field생성된다. 

2. custom accessor에서 field 식별자를 사용하는 경우 

ex)

 var abcd:String = "abcd" //초기화가 없다면 오류가 발생한다. 

set(value){

field = value 

} 



Backing properties 


backing field가 맞지않는 경우 backing properties사용할 수 있음 


private var _table:Map?=null
public val table:Map
get() {
    if (_table==null){
        _table=HashMap()
    }
    return _table ?: throw AssertionError("null")
}

사실상 _table의 사용이 주목적인데 backing Field의 조건이 맞지 않아 public형태의 table을 하나 만들어서 backing Properties를 사용하여 getter, setter를 구현해주면 된다. 



Compile Time Constants


runtime 상수가 아닌 compile time 상수가 필요할 때는 


const val aa:String 과 같이 사용할 수 있다. 


하지만 이것 도 몇가지 조건이 필요하다 

-1. toplevel 이거나(함수 속이나 클래스 속에 안있는 변수)

-2. String 형태 이거나 Primitive 형태에서 사용할 수 있다.  


Late Initilaized properties 


클래스 안에 있는 프로퍼티를 초기화 없이 자신이 필요할 때 초기화 하여 사용할 수 있게 해주는 방법이다. 

우선 예시를 보면 

public class MyTest {
    lateinit var subject:String
    fun Setup(){
        subject = "asdb"
    }
}

제일 앞 변수와 같이 lateInt를 붙여주면 init안의 초기화 없이도 자신이 따로만든 함수를 통해 초기화 해줄 수 있다. 

하지만 이와 같은 경우에도 몇 가지 조건이 있다. 


1. 클래스에서만 가능하다. 

2. 생성자 (constructor)에 넣어서 사용 불가능하다. 

3. var 변수만 된다. 

4. custom Access가 있으면 안된다. 

5. not nullable ?가 있으면 안된다. 

6. not primitve이여야 한다. 


'kotlin-이론' 카테고리의 다른 글

[kotlin] Nested Class And Inner Class  (0) 2018.06.18
[kotlin]Data Class  (0) 2018.06.18
[kotlin] kotlin 강의 properties1  (0) 2018.06.16
[kotlin] Class 상속  (0) 2018.06.15
[kotlin]Class  (0) 2018.06.15