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"
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
머티리얼 디자인 도입 직후에 할 일안드로이드 프로젝트에 머티리얼 디자인을 도입한 후에 할 일을 적는다. Android 프로젝트를 만든 후 Hello world에 대해 수행합니다. 머티리얼 디자인을 도입하기 위해, build.gradle 를 이하와 같...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.