Kotlin 입문부터 포기까지의 기초편 (5) - 수식어, 확장, 데이터 클래스

9894 단어 Kotlin

Kotlin 입문부터 포기까지 기초 편만 (5)


가시성 수식어


Kotlin에는 네 가지 수식어가 존재합니다:public,private,protected,internal.기본 수식어는 공용입니다.그것들은 클래스, 대상, 인터페이스, 구조 함수, 속성, 그리고 그것들의 set 방법을 수식하는 데 사용된다.

싸다


Kotlin에서 함수, 속성, 클래스, 대상, 인터페이스는 패키지 단계에서 정의할 수 있습니다.패키지 레벨에서 사용되는 네 가지 코스메틱 단어:♣ public: 기본 수식자입니다. 어느 곳에서든 접근할 수 있습니다.♣ private: 현재 원본 파일에서만 사용할 수 있습니다♣ internal: 같은 모듈에서 사용할 수 있음♣ 보호된: 클래스와 인터페이스 내부에만 사용할 수 있는 잘못된 수식자입니다.
  package demo
  private fun test1(){} //  
  public var test2 : String="test" // 
  internal val test3=6// module 

클래스 및 인터페이스


클래스 및 인터페이스에서 네 가지 코스메틱 단어의 역할 영역:♣ public: 기본 수식자, 어느 곳에서든 접근할 수 있습니다♣ private: 이 클래스에서만 접근할 수 있습니다♣ internal: 같은 모듈에서 사용할 수 있음♣ 보호된: 현재 클래스와 하위 클래스만 접근할 수 있습니다
open class Person{
    private val age=15// 
    public val name =" "// 
    protected val sex=" "// 
    internal val height=175// Module 
}

구조기


모든 구조 함수는 기본적으로public이며, 다른 수식자 수식을 사용할 때 constructor 키워드를 명확하게 추가해야 합니다.
    class Person private constructor (age:Int,name:String){
        //...
    }

모듈


Kotlin의 모듈은 일련의 Kotlin 파일을 컴파일한 소스입니다.♣IntelliJ IDEA 모듈 1개♣ Maven 프로젝트 또는 Gradle 프로젝트♣ Ant 작업의 호출을 통해 컴파일된 파일 세트

로컬 선언


국부 변수, 함수, 클래스는 수식자를 지정할 수 없습니다.

확장성


C# 및 Gosu와 유사하게 Kotlin은 상위 클래스를 상속하거나 다른 디자인 모드를 사용하지 않고 지정된 클래스를 확장하는 방법도 제공합니다.우리는 확장된 특수 성명을 통해 실현할 수 있다.확장은 함수 확장과 속성 확장으로 나뉜다

함수 확장


함수 확장을 설명할 때, 우리는 함수 앞에서 확장된 대상을 지정해야 한다.예를 들면 다음과 같습니다.
    fun MutableList.swap(x:Int,y:Int){// list x y 
        val temp  = this[x]//this List
        this[x] = this[y]
        this[y] = temp
    }

♣ 함수 확장에서this 키워드는 함수 수신자 대상에 대응합니다.

확장은 정적 해석입니다


확장은 확장된 클래스를 수정하지 않았습니다.이 클래스에 새 구성원을 삽입하지 않았습니다. 단지 이 실례 대상이 "."을 통과할 수 있도록 했습니다.확장 멤버를 호출합니다.확장 함수는 정적 해석으로 수신자 유형의 가상 구성원이 아니다.확장 함수를 호출할 때 어떤 확장 함수를 호출할지 동적 형식이 아닌 호출 함수의 대상 표현식에 의해 결정된다는 뜻이다.예를 들어 우리는 두 개의 대상을 정의한다.Teacher 및 Person 여기서 Person은 Teacher의 상위 클래스입니다.두 대상 모두 확장 함수 DoFly () 를 성명한 다음fly () 방법이 Person 대상에 전송된 인삼 호출 DoFly 방법을 성명합니다.
    open class Person{}

    class Teacher : Person(){}

    fun Person.doFly() {//Person doFly() 
        println("Person fly")
    }

    fun Teacher.doFly() { //Teacher doFly() 

        println("Teacher fly")
    }

    fun fly(person : Person){
        person.doFly()
    }

    fun main(args : Array){// 
        var teacher:Teacher = Teacher()

        fly(teacher)
    }

위 코드의 출력 결과는 "Person fly"로, 선언된 매개변수 유형에 따라 호출되는 확장 함수를 확인할 수 있습니다.

구성원 및 확장 함수


확장 함수의 수신자 대상에 확장 함수와 같은 구성원 함수가 존재합니다.이 함수를 호출할 때 구성원 함수인지 확장 함수인지
    open class TestDemo {
        test(){// 
            println(" ")
        }
    }

    fun  TestDemo.test(){// 
        println(" ")
    }

    fun main(args : Array<String>){
        var person :Person =Person()
        person.test()
    }

상기 코드의 출력 결과는'구성원 함수'로 구성원 함수와 확장 함수의 이름이 동시에 존재할 때 이 함수를 호출할 때 구성원 함수를 우선적으로 호출하는 것을 알 수 있다.

빈 수신자


확장 구성원의 수신자는 비어 있을 수 있습니다.이렇게 하면 우리는 빈 대상으로 이 확장 구성원을 호출할 수 있으며, 이 방법에서'null==this'의 판단을 이용하여 논리적으로 조작할 수 있다.이렇게 하면 우리는 빈 바늘의 오류를 걱정하지 않고 이 확장 구성원을 임의로 사용할 수 있다.

속성 확장


Kotlin에서도 속성 확장이 지원됩니다.그러나 확장 속성은 수용 대상에게 진정한 구성원 속성을 제공하지 못하기 때문에 확장 속성은 백업 필드를 가질 수 없습니다.따라서 초기화 함수에는 확장 속성이 없고 확장 속성은 명확한 Getter와setter 방법으로만 정의할 수 있습니다.이것은 확장 속성이 val로만 성명될 수 있음을 의미합니다.var로 선언되면 초기화할 때 이상 오류가 발생합니다.

객체와 함께 확장


동반 대상을 정의하면 동반 대상을 확장할 수 있습니다.
    open class TestDemo{
        companion object{}
    }

    fun TestDemo.Companion.expandFun(){

    }

호출 시 일반 동반 대상의 구성원과 동일:
    TestDemo.expandFun()

확장된 도메인


대부분의 경우 가방(top level)에서 확장을 정의합니다.
    package test.demo

    fun Person.swim(){// test.demo swim 

    }

우리가 테스트에 있을 때.데모 패키지 외에 위에서 설명한 확장자를 사용할 때, 이 확장자를 가져오려면 import 키워드를 사용해야 합니다
    package com.example

    import test.demo.swim// 

    import test.demo.*// test.demo 

    fun main(args : Array<String>){
        var person : Person = Person()

        person.swim()// 
    }

데이터 클래스


우리는 보통 데이터를 저장하는 클래스를 만든다.Kotlin에서 이러한 클래스는 데이터 클래스라고 하며 데이터 키워드로 표시됩니다.
    data class Person (val name: String , val age :Int)

컴파일러는 주 구조 함수에 선언된 모든 속성에 다음과 같은 메서드를 추가합니다.
♣ equals():hashCode 함수♣ toString (): 출력 형식은 Person (name=소명,age=18) 입니다.♣ compontN (): 생명 순서에 따라 나타나는 모든 속성에 대응♣ copy () 만약 이 데이터 클래스나 기본 클래스에서 상술한 방법을 다시 썼다면, 다시 쓴 방법이 정확합니다

데이터 클래스 선언 조건


♣ 주구조 함수 중 적어도 하나의 함수는 있다♣ 주 구조 함수의 모든 속성은 val 또는 var 키워드를 표시해야 합니다♣ 데이터 클래스는 추상 클래스,open 클래스, 폐쇄 (sealed) 클래스 또는 내부 (inner) 클래스가 될 수 없습니다.♣ 데이터 클래스는 다른 클래스에서 계승할 수 없습니다. (인터페이스 제외)
♣ 만약 데이터 클래스에 참조 함수가 없다면, 주 구조 함수에서 속성을 초기화해야 한다.
    data class Person(val name:String=" ", val age:Int=18)

복제하다


데이터 클래스의 일부 속성을 수정해야 하지만 다른 부분은 변하지 않으면 코피 () 함수를 사용해야 합니다.예를 들면 다음과 같습니다.
    val xiaoming = Person(name=" ",age=18)
    val xiaoli = (name=" ")// name ,age 18

다중 선언


위에서 언급한componentN () 구성 요소 함수는 함수 이름의 1부터 N까지 대응하는 속성의 성명 순서이기 때문에 데이터 클래스의 다중 성명에서 사용할 수 있습니다.
    val xiaoming = Person(" ", 18)
    val (n,m) = xiaoming
    println("$n,is $m years old")

위 코드 인쇄 결과는 "소명, is 18 years old"

좋은 웹페이지 즐겨찾기