Property
=> Class 외부에 선언한 변수와 클래스 내부에 선언한 변수를 프로퍼티라고 한다.
메소드 내부에 만든 변수는 프로퍼티가 아니다.
=> 프로퍼티라고 부를 때는 저장 공간을 만들고 접근자 메소드가 존재하는 경우입니다.
접근자 메소드: 변수의 값을 리턴(getter)하고 설정하는 메소드(setter)
사용은 변수를 하는 것 처럼 보이지만 실제로는 메소드가 호출되는 방식
=> val 로 시작하면 setter가 안만들어진다.
var로 시작하면 getter와 setter가 모두 만들어 집니다.
=> 변수의 값을 가져올 때나 설정 할 때 어떤 내용을 수행하고자 하면 get과 set을 재정의 하면 됩니다.
get과 set을 재정의할 때는 프로퍼티 선언 바로 아래 하면 되고 변수의 이름은 field 라고 해야한다.
class T {
var num : Int = 10
get(){return field}
set(value:Int) {field = value}
val num : Int = 10
get(){return field}
}
=> get이나 set을 만드는 경우를 key - value Observing
데이터가 변경될 때 다른 작업을 수행하거나 유효성 검사를 할 목적으로 set을 재정의 하고
get은 로그를 기록할 목적으로 다시 만든다.
Data <-> Adapter <->List
Data 가 변경이 되면 List 를 다시 출력
Data가 변경 될 때 Adapter가 setNotifyChanged를 호출
서버로 부터 데이터를 받아오고 받아오면 메소드를 호출
Data
set(value:?){
field = value
재출력
}
=>primary constructor에서 val 이나 var를 이용해서 클래스 내부의 프로퍼티를 생성할 수 있음
이 경우에는 get과 set을 수정할 수 없다.
primary constructor에서 val 이나 var를 제거하고 클래스 내부에 프로퍼티를 생성하고 생성자의 데이터를 대입하는 구문을 만들어주고 get과 set을 만들어야 한다.
class T(var num:Int) {
// 이 경우에는 num의 get과 set을 만들 수 없습니다.
}
class T(num:Int) {
var num = num
get(){
}
set(value:Int){
}
}
프로퍼티를 초기화 할 때는 init{} 에서 가능
=> lateinit 프로퍼티 선언 앞에 붙이면 나중에 초기화 할 수 있다.
=> 자료형 뒤에 by lazy를 설정하면 처음 사용할 때 초기화: 지연 생성
class T {
var x : Int = 10
var y : Int by lazy = 10
}
//인스턴스 생성
val t : T() // 이 순간에 t에는 x가 존재 - y는 생성하지 않습니다.
t.y = 20 // y를 처음 사용을 했으므로 이 때 y를 생성하고 초기화하고 사용.
이 문법은 클라이언트 애플리케이션 제작에 주로 이용
서버는 절대 안돼!
클라이언트 애플리케이션이 모든 초기화 작업을 전부 수행하고 실행 하려면 시간이 너무 오래 걸릴 수 있으므로
현재 필요한 것만 가지고 실행하고 나머지는 필요할 때 생성.
메모리 문제
=> property의 변경을 감시
property의 변경을 감시하고 있다가 적절한 메소드를 호출하는 형태를 작성할 수 있다.
Notification 이벤트 처리
자료형 뒤에 by Delegates.observable(초기값, 매개 변수를 3개 갖는 함수 설정)
매개 변수의 순서는 첫번째가 프로퍼티 이름
두번 째는 이전 값
세번째는 새로 변경되는 값
함수를 만들어서 연결해도 되지만 대부분의 경우는 람다 표현식으로 설정
import java.sql.DriverManager.println
import kotlin.properties.Delegates
Class T{
//name의 값이 변경되면 함수를 호출하도록 만드는 방법
var name : String by Delegates.observable (initialValue: "noname",
{props, old, new -> println("$props 가 변경됨")
println("$old 에서 $new 로 변경 됨"
})
}
fun main(args :Array<String>){
// 인스턴스 생성
var obj = T{}
obj.name = "adam"
}
}
'kotlin' 카테고리의 다른 글
코틀린 : 상속 (0) | 2020.10.15 |
---|---|
코틀린 : 메소드 (0) | 2020.10.15 |
코틀린 : 변수 (0) | 2020.10.15 |
코틀린: 차근 차근 시작하기 :-) (0) | 2020.10.15 |
코틀린 : 클래스와 인터페이스 (0) | 2020.10.14 |