Property & Accessor - 1

김건우·2023년 12월 11일

개발 공부

목록 보기
4/13
post-thumbnail

목차

var과 val

  • 코틀린에는 변경가능한 var 프로퍼티와, 변경이 불가능한 val 프로퍼티가 있다.

  • varval 프로퍼티는 객체를 가리키는 참조이다.

  • var을 사용한 프로퍼티는 변수가 가리키던 대상을 바꿀 수 있지만, val로 선언된 프로퍼티는 새로운 대상을 참조할 수 없다.

	val keyboard : String = "leopold"
    keyboard = "logitec"
    
    -> 에러. Kotlin: Val cannot be reassigned
  • 프로퍼티는 멤버 함수에서 간단하게 프로퍼티 이름으로 호출할 수 있다.
class cup {
    val max = 100
	fun isMax(add: Int) : Bool {
		if (add < max)				//프로퍼티 max를 단순히 이름으로 호출
        	return false
        else return true
}
  • 클래스 밖에서 최상위 프로퍼티(전역 변수와 비슷한 역할)를 선언 할 수 있다. 하지만 var로 선언해 가변 프로퍼티로 만들면 프로그램이 복잡해질수록 상태를 추론하기 어려워 안티패턴으로 간주된다.
val notebook : String = "M1"   // 다른 클래스와 함수에서 참조가능한 프로퍼티가 됨

class Laptop

fun main(args: Array<String>) {}

프로퍼티 접근자 : get(), set()

  • getter인 get()은 해당 프로퍼티의 값에 접근할 때 호출되고, setter인 set()은 해당 프로퍼티의 값을 변경할 때 호출된다.
  • 코틀린에선 get()set()을 따로 정의하지 않아도 알아서 만들어준다.
class PropertyAccessor {
    var initializer : Int = 1
}

위의 코드를 작성하면 실제로 실행되는 코드는 아래와 같다.

class PropertyAccessor {
    var initializer : Int = 1
        get() {
            return field
        }
        set(value) {
            field = value
        }
}

* field는 코틀린의 backing property를 참조하는 식별자이다.
get(), set() 안에서만 사용되고, 프로퍼티의 값에 접근할 수 있다. 
  • val로 선언된 프로퍼티는 값을 변경할 수 없기 때문에 get()만 만들어진다.
val initializer : Int = 1
	get() {
        return field
    }
    set(value) {
        field = value
    }
        -> 에러: Kotlin: A 'val'-property cannot have a setter
  • get()set()을 커스텀화해 사용할 수도 있다. 이 때 get()만 정의하거나 set()만 정의하는 것이 가능하며, 정의하는 순서는 상관없다.
  • 커스텀화한 get()을 사용해서 프로퍼티의 초기값을 생략할 수 있다.
class Rectangle(val width: Int, val height: Int) {
    val area: Int 
        get() = this.width * this.height
}
  • 프로퍼티의 타입 또한 get()에서 추론 가능하면 생략할 수 있다.
	val area get() = this.width * this.height

다음에 공부할 것

  • 컴파일 타임 상수
  • 지연 계산 초기화
  • 위임된 프로퍼티
profile
즐겁게

0개의 댓글