자바는 프로퍼티가 없고 코틀린에만 있음
var name = ""
get() = field
set(value){
field = value
}
----
var p = Person()
p.name // --> name속성 get호출
p.name = "표인수" // --> name속성 set(value)호출
var(mutable), val(read-only)
class A{
var
val
}
var 이름:타입 = 초기자
getter
settervar name: String = "haruple"
val age: Int = 26
var name: String = "haruple"
get() = field
set(value) {field = value}
val age: Int = 26
get() = field
위 두 코드는 동일한 코드이다. var - 변경할수 있으므로 get,set 모두 추가 val - 변경 못하므로 get만 추가밑에 두 코드는 거의 같다
class A {
var name = "Koltin"
}
class A {
var name = "Kotlin"
get() {
return field + "!!!!!!!!!!!"
}
set(value) {
field = value
}
}
//출력 Koltin!!!!!!!!!!
class A {
var a = 1 //getter,setter
val b = 1 //getter
var c:Int? //오류 - 명시적인 초기화 필요
val d:Int? //오류 - 명시적인 초기화 필요
}
val isEmpty: Boolean
get() = this.size == 0 관습적으로 setter의 파라미터 이름은 value임(변경가능)
val isEmpty: String
get() = this.toString()
set(value) {
setDataFrimString(value)
}
val isEmpty
get() = this.size == 0 class Person constructor(){ - - - -> Default 생성자는 생략가능
val name: String - - - - > 속성 선언 시 초기화를 진행하지 않을 시 Type(String)을 반드시 선언
var age: Int
val gender: Char
init {
name = "Pyo Insoo"
age = 32
gender = 'M'
}
}
(late-initialized)
::a.isInitalized해서 초기화 됐나 확인하고 사용class Person {
lateinit var name: String
//lateinit var age:Int - - - -> 기본타입에는 사용불가
// lateinit var gender: Char - - - -> 기본타입에는 사용불가
constructor(name: String, age:Int, gender:Char){
this.name = name
//this.age = age
//this.gender = gender
}
}
fun main(){
val person = Person("Pyo Insoo", 32, 'M')
}
class A (lateinit var ~){} XXXXlateinit val xxlateinit var a: String
get() = {return field} xxxxxxxxxxxxxxxxlate var a: String? xxxxxxxxxxxxxclass Person {
val name: String by lazy { //->람다 함수임
println(“lazy init”) // ->lazy init은 맨처음 한번만 출력되고 그 후로는 출력되지 않음
"Pyo Insoo“ //- - - -> by lazy는 표현식이므로 할당 할 값이 맨 마지막에 와야 한다
}
val age:Int by lazy {
32
}
val gender: Char by lazy{
'M'
}
}
var temp = 1
val increment: Int by lazy{
++temp
}
fun main(){
val person = Person()
println("name:${person.name}") //lazy init, 표인수
println("name:${person.name}") //표인수
println("age:${person.age}")
println("gender:${person.gender}")
println("increment: $increment") //처음에만 증가 - 2출력
println("increment: $increment") //증가하지 않는다 - 2출력
}
예시
fun main(){
val foodCourt = FoodCourt()
foodCourt.searchPrice(FoodCourt.FOOD_CREAM_PASTA)
foodCourt.searchPrice(FoodCourt.FOOD_PIZZA)
foodCourt.searchPrice(FoodCourt.FOOD_STEAK)
//크림파스타 가격은 13000 입니다
//피자 가격은 15000 입니다
//스테이크 가격은 25000 입니다
lateinit var b : String
//lateinit var a = "아" 오류뜸 lateinit은 초기화를 하면 안되네
var lateInitSample = LateInitSample()
println(lateInitSample.getLateInitTest()) // 기본값
lateInitSample.text = "쿵따딱"
println(lateInitSample.getLateInitTest()) // 쿵따닥
val a : Int by lazy {
println("초기화됨")
7 //lazy 값이라는 뜻
}
println(a) //초기화됨 7
println(a) //7
}
class FoodCourt{
fun searchPrice(foodName: String){
val price = when(foodName){
FOOD_CREAM_PASTA -> 13000
FOOD_STEAK -> 25000
FOOD_PIZZA -> 15000
else -> 0
}
println("$foodName 가격은 $price 입니다")
}
companion object{
const val FOOD_CREAM_PASTA = "크림파스타"
const val FOOD_STEAK = "스테이크"
const val FOOD_PIZZA = "피자"
}
}
class LateInitSample{
lateinit var text: String
fun getLateInitTest(): String {
if(::text.isInitialized){
return text
} else {
return "기본값"
}
}
}
delegate : 위임, (디자인 패턴중 하나)
- 속성의 책임을 다른 객체에 위임할 수 있는 강력한 기능.
- Kotlin Refection 기능을 활용한 위임이며 속성에 값을 할당하는 개념이 아니고 할당할 수도 없다
- val/var : by <DelegateClass,Function(둘중 하나)>
- Expression Class Implementation(실행)
- var : operator function getValue/setValue를 구현
- val : operator function getValue 만 구현
- Property getter/setter를 호출하면 getValue/setValue가 자동 호출
ex)
import kotlin.reflect.KProperty
class PropertyDelegate(var value: String) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
println("${property.name} get value ${this.value}")
return value
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, newValue: String) {
println("${property.name} set value ${this.value} -> $newValue")
this.value = newValue
}
}
class Person {
var name:String by PropertyDelegate("이동수") // getValue, setValue
val age: String by PropertyDelegate("27") // getValue
}
fun main() {
val person = Person()
println("person name is ${person.name}")
//name get value 이동수
//person name is 이동수
person.name = "소진호"
//name set value 이동수 -> 소진호
println("person name is ${person.name}")
//name get value 소진호
//person name is 소진호
println("person age is ${person.age}")
//age get value 27
//person age is 27
}