클래스는 생성자, 변수, 함수 등등으로 구성이 되는데 코틀린에서는 프로퍼티라는 말이 많이 나온다. 대충 사용법을 보면 자바의 변수같은데 코틀린에서는 변수라는 말 보다는 프로퍼티라는 말을 더 많이 사용하는 것 같다.
왜 변수를 프로퍼티라고 부르냐면 변수처럼 보이지만 함수가 내장된 변수이다. 접근자로 불리는 함수가 내장되어 있다. 또한 프로퍼티는 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하려면 아래와 같이 사용하면 된다.
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 |
'Kotlin 코틀린' 카테고리의 다른 글
코틀린 고차함수 run, apply, let, with 사용하기 (1) | 2019.03.20 |
---|---|
코틀린의 null 안전 관련 연산자 (0) | 2019.02.12 |
코틀린 변수와 자바 변수의 차이점 (0) | 2019.02.09 |
코틀린 변수 함수 정리를 해보자 (0) | 2019.02.06 |
코틀린의 Any 그리고 Any? 대입 비교하기 (0) | 2019.02.06 |