코틀린 언어 정리 2-2

class

접근 권한

여기에서는 접근 권한 키워드가 클래스 내에서 사용될 때의 설명( 멤버 선언에 사용될 때 )만 포함합니다.


private

클래스 내에서만 접근 가능


protected

클래스 및 하위 클래스 내에서만 접근 가능


public

클래스 내부와 외부에서 모두 접근 가능


internal

같은 모듈( 컴파일된 바이너리 단위 ) 내에서 접근 가능



프로퍼티

프로퍼티는 일반적으로 사용하는 변수와 동일한 방식으로 사용할 수 있지만 자체에 getter/setter를 내장하고 있습니다. getter/setter는 자동으로 생성되며 사용자가 직접 구현할 수도 있습니다. 코틀린에서는 전역에서 선언한 변수, 클래스 내부에 선언한 변수는 모두 프로퍼티로 처리되며 로컬 함수의 내부에서 선언한 변수는 프로퍼티로 처리되지 않습니다.


프로퍼티 선언 및 초기화

선언하면서 초기화

선언하면서 사용자가 입력한 고정값, 주생성자 매개변수, 기타 다른 프로퍼티들의 조합으로 계산된 새로운 값으로 초기화 할 수 있습니다.


예제

class TestNum {

   var value: Int = 0

}


선언 후 초기화

init block에서 초기화

예제

class TestNum {

   var value: Int


   init {

       value = 10

   }

}


보조생성자에서 초기화

어떤 생성자를 호출 하더라도 선언된 모든 프로퍼티들의 초기화가 실행되도록 해야 컴파일 에러가 발생하지 않습니다. 예를 들면 생성자가 2개 이상인데 어떤 프로퍼티가 특정 생성자에서만 초기화 되도록 구현했다면 컴파일 에러가 발생합니다.


by lazy

프로퍼티가 처음 이용( 참조 )되는 시점에 초기화 코드를 실행합니다.( Standard Delegates ) lazy는 함수입니다.


예제

class MyClass {

   val name: String by lazy {

       println("by lazy 테스트")

       "Kim"

   }

}


fun main(args: Array<String>) {

   var obj = MyClass()

   println(obj.name)

}


제약

by lazy는 val 로 선언한 프로퍼티일 경우만 사용 가능합니다.


lateinit

C/C++ 처럼 프로퍼티의 초기화를 객체 생성 이후 아무때나 수행할 수 있게 해줍니다. 프로퍼티를 초기화 하지 않고 사용할 경우 예외가 발생합니다.


예제

class MyClass {

   lateinit var name: String

}


fun main(args: Array<String>) {

   var obj = MyClass()

   obj.name = "Ree"

   println(obj.name)

   obj.name = "Kim"

   println(obj.name)

}


제약

lateinit을 사용할 수 없는 경우

  • val로 선언한 프로퍼티

  • 기본 타입(ex. Int, Double 등 )으로 선언한 프로퍼티

  • null 허용 프로퍼티

  • get/set을 구현한 프로퍼티

  • 주생성자 매개변수와 동시에 선언한 프로퍼티


lateinit 사용 불가 코드 요약

  • val

  • :Int?

  • get(){} / set( value ){}

  • constructor ( val ... )



필드와 프로퍼티

field

프로퍼티(property)에 대응하는 값을 저장하는 변수입니다. 프로퍼티 정의를 통해 접근할 수 있습니다.


property

설정, 참조 가능한 객체의 특성입니다. property는 자신에 대응하는 field를 가질수도 있고 그렇지 않을 수도 있습니다.



get/set 구현

  • 일반적으로 호칭할 때는 getter/setter라고 호칭하고 코드상으로는 get/set 으로 구현합니다.

  • var 프로퍼티에는 get/set 모두 구현 가능합니다.

  • val 프로퍼티에는 get만 구현 가능합니다.

  • val 프로퍼티일 경우 get 을 구현하면 프로퍼티 초기화를 별도로 하지 않아도 됩니다.

  • 주생성자의 매개변수와 동시에 선언한 프로퍼티는 getter/setter를 구현할 수 없습니다.


field

프로퍼티에 저장된 값 자체(backing field)입니다. get/set 함수 구현 내부에서 backing field에 값을 저장하거나 참조할 때 사용하는 키워드입니다. 프로퍼티의 getter/setter 구현 시 사용 되나 값을 저장할 필요가 없는 프로퍼티에는 사용할 필요가 없습니다.


예제

class MyClass(name: String) {

   var name: String = name

       get() {

           return field

       }

       set(value) {

           field = value

       }

}


fun main(args: Array<String>) {

   println(MyClass("hong").name)

}



+ Recent posts