본문 바로가기

kotlin

코틀린 : 프로퍼티

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