본문으로 바로가기

코틀린 프로퍼티 맛보기

category Kotlin 코틀린 2019. 2. 13. 00:05
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


클래스는 생성자, 변수, 함수 등등으로 구성이 되는데 코틀린에서는 프로퍼티라는 말이 많이 나온다. 대충 사용법을 보면 자바의 변수같은데 코틀린에서는 변수라는 말 보다는 프로퍼티라는 말을 더 많이 사용하는 것 같다.


왜 변수를 프로퍼티라고 부르냐면 변수처럼 보이지만 함수가 내장된 변수이다. 접근자로 불리는 함수가 내장되어 있다. 또한 프로퍼티는 var, val로 선언 가능하고 이름과 데이터타입, 초깃값을 명시할 수 있다. getter, setter은 꼭 명시할 필요는 없지만 직접 개발자가 Custom해서도 사용이 가능하다. 간단한 프로퍼티 예제를 아래에 작성해보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
fun main(args: Array<String>) {
    var home = Home()
 
    println("${home.level}")    //beginner
    home.level = "standard"
    println("${home.level}")    //standard
    println("${home.age}")      //31
    println("${home.powerAge}"//961
 
}
 
class Home {
    var level: String= "beginner"
        get() = field
        set(value) {
            field = value
        }
 
    val age: Int = 31
        get() = field
 
    val powerAge: Int
        get() = this.age * this.age
}



위의 예제를 간략하게 설명하자면 var은 변경 가능하고, val은 변경이 불가능하기 때문에 var은 getter, setter을 사용할 수 있고, val은 getter만 사용할 수 있다. 

또한 getter, setter 즉 get, set 에서 field라는 것이 있는데 이 field를 통해 프로퍼티가 가지는 값에 접근할 수 있기 때문에 이를 배킹 필드(backing field)라고 한다. 코틀린 인 액션에서는 뒷받침하는 필드라고 설명을 하였다.(field라고만 써야 사용이 가능하다.)


또한 위의 예제에서는 powerAge라는 프로퍼티를 변수로 사용하고 있고, 결과 값으로 age를 제곱하여 결과를 리턴한다. 예제에서 보면 powerAge를 사용할 때 나이를 제곱한 결과를 호출하는 것을 볼 수 있다.


아래 예제에서 프로퍼티를 생성할 때 주의할 점을 책을 보면서 끄적여 보았다.

val age: Int = 31 처럼 값을 선언하게 되같은 Initializer is not allowed here because this property has no backing field 에러를 볼 수 있다. 해석해 보자면 "초기화는 여기서 허용되지 않는다. 왜냐하면 이 프로퍼티는 backing field를 가지고 있지 않다" 라고 해석이 된다. (난 영어를 진짜 못하기 때문에 잘못 번역했다면 댓글좀 ...) 


객체를 생성한 후 val에 값을 대입하고 get하려면 아래와 같이 사용하면 된다. 


    val age2: Int
        get() {
            return 31
        }


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
fun main(args: Array<String>) {
    var home = Home()
 
    home.name = "ktko"
    //home.age = 10 //error val로 클래스 선언
 
    println("${home.name}")
    println("${home.age2}")
 
}
 
class Home {
    var name: String= ""
        get() {
            return field?.toUpperCase()
        }
        set(value) {
            field = value?.toUpperCase()
        }
    
    /**
    val age: Int = 31 //Initializer is not allowed here because this property has no backing field
        get() {
            age
        }
    **/
    
    val age2: Int
        get() {
            return 31
        }
    //위와 같이 말고 get() = 31 처럼 사용이 가능하다.
}
 
cs