ツールバーの


コトリンの番組を見てみましょう.

🤔 専攻は何ですか。

  • クラス変数をPropertyと呼びます.
  • 変数のように見えますが、実際にはgetter、setter関数が内蔵されています.
  • Javaでは클래스의 field + 접근자 메소드 = 프로퍼티と呼ばれています.
  • のブロック({...})propertyは、クラスに含まれていない上位変数またはクラス内部で宣言された変数のみ使用できます.(領域変数xを使用)
  • fun main(args: Array<String>) {
        val user = User()
        println("Name: ${user.name}, Age: ${user.age}")
    }
    
    class User {
        var name: String = "jang"
    
        /*    get() = field
            set(value) {
                field = value
            }*/
        val age: Int = 10
      //      get() = field
    
    }
    コメントを削除しても同じ結果が出力されます.user.name = "kim" or println("${user.name}")が実行されると、set()、get()メソッドが内部的に呼び出されます.

    Backing field

  • パーセント値を格納フィールド値
  • get(),set()メソッドでは,フィールドを介してPropertyの値
  • にアクセスする.

    フィールドで直接近づかないで


    Java形式でset()、get()メソッドを使用してname変数のコードにアクセスします.
    fun main(args: Array<String>) {
        val user = User()
        user.name = "jang"
        println("Name: ${user.name}, Age: ${user.age}")
    }
    
    class User {
        var name: String
            get() = name
            set(value) {
                name = value
            }
        val age get() = 10
    }
    get()とset()の両方でStackOverFlowが発生します.

    get()の場合

  • の値を得るためにnameを返し、nameの値を得るためにget()関数を呼び出す.無限再帰ループを囲む.
  • set()の場合

  • user.name="jang"は実際にUserクラスを呼び出すset()と同じです.
  • ユーザクラスのset()から見ると、name変数に直接値を付与します.set()関数内でもset()関数が呼び出されます.
  • したがって、StackOverflowが発生しない場合は、以下に示すように、BackFieldを使用してコードを変更することができます.
    class User {
        var name: String = "jang"
            get() = field
            set(value) {
                field = value
            }
        val age get() = 10
    }

    Backfieldを使用するルール

    1. get(), set() 내부에서는 field 값으로 접근한다.
    2. var로 선언한 프로퍼티는 set(), get() 둘 다 정의할 수 있지만 val은 get()만 가능하다.

    👏 リファレンス

  • BackFieldとBackProperty
  • Kotlin基礎課5::専門と後ろ盾フィールド