Kotlin Basic #2 - (프로퍼티)

daehyeon kim·2022년 5월 13일
0
post-thumbnail

Property

- Java vs Kotlin

먼저 프로퍼티는 클래스의 속성을 표현합니다. 자바에서는 필드와 접근자를 묶어 프로퍼티라 부릅니다.
접근자는 일반적으로 getter / setter 로 해당 필드에 접근할 수 있도록 하는 함수입니다.
이러한 형태를 취하는 이유는 캡슐화 때문입니다. 필드를 private 으로 선언하여 외부에서의 직접적인 접근을 제한하고 접근자를 공개하여 외부에서의 접근을 통제합니다.

class Example{
	private String type;
    
    public String getType(){
    	return this.type;
    }
    public void setType(String type){
    	this.type = type;
    }
}

보통 위와 같은 형태를 취하고 있습니다.

하지만 코틀린에서는 필드 선언 시 자동으로 접근자를 생성해줍니다.
val 변수는 getter 만을 생성하고, var 변수는 setter / getter 모두 생성합니다.
필드에 대한 모든 접근은 자동으로 생성된 접근자를 통해 이뤄집니다.
이러한 내부 동작으로 코틀린은 프로퍼티를 지원합니다.

코틀린의 접근자 명명규칙

기본적으로 get필드명, set필드명 규칙으로 생성되지만 예외가 있다.
is 로 시작되는 필드의 경우 필드명 그대로 getter 가 생성된다.
ex) var isChild 필드의 getter 는 isChild()

코틀린의 프로퍼티 지원 덕분에 더 간결한 코드를 작성할 수 있습니다.
개발자는 프로퍼티로 필드에 접근할 수 있고, 이에 필요한 접근자 생성, 호출 등은 모두 내부에서 자동으로 처리됩니다.

val person = Person("john", true)

println(person.name)
>> john

println(person.isMarried)
>> true

person.isMarried = false
println(person.isMarried)
>> false

isMarried 를 false로 변경할 때 자바

person.setMarried(false)

코틀린

person.isMarried = false

- 커스텀 접근자

getter

코틀린에서는 접근자 (getter / setter)를 자동으로 생성해준다 하였습니다. 하지만 상황에 따라 커스텀하여 사용할 수도 있습니다.
쉽게 말하면 getter 와 setter를 직접 정의해주는 것입니다.

만약 호출할 때 마다 값을 계산해야 하는 프로퍼티라면 아래와 같은 방식으로 커스텀 접근자를 만들 수 있습니다.

class Rectangle(val height: Int, val width: Int){
	val isSquare: Boolean
    	get() {
        	return height == width
        }
}

정사각형인지 알려주는 isSquare 프로퍼티는 height과 width의 값이 같은지를 비교하여 불리언 값을 반환합니다.
이러한 간단한 구조의 경우 본문이 식인 함수로 표현할 수도 있습니다.

get() = height == width

Custom getter vs function

isSquare 를 프로퍼티로 선언하지 않고 함수로 선언할 수도 있습니다.
프로퍼티로 선언하는 경우 커스텀 gettter를 사용하게 되는데 결과적으로 두 방식의 성능차이는 없습니다.
가독성 측면에서만 차이가 난다고 할 수 있습니다.
하지만 일반적으로 클래스의 특성을 정의할 때는 프로퍼티로 그 특성을 정의해야 합니다.
해당 클래스에 대한 특성을 표현할 때에는 프로퍼티 사용을 권장합니다.

setter

getter와 마찬가지로 setter 또한 커스텀 할 수 있습니다.
주의할 점은 var로 선언된 변수에 대해서만 커스텀할 수 있다는 점입니다.

class Account(val price: Int){	
	val discountRate = 0.3
	var discountedPrice: Long
    	set(value){
        	field = value * discountedRate
        }
}

set() 함수는 프로퍼티에 저장할 값을 파라미터로 받습니다.
field 는 프로퍼티의 백킹필드에 저장된 값을 참조하는 변수입니다.
setter 안에서 field라는 변수에 접근하면 해당 프로퍼티의 값을 참조할 수 있습니다.
위의 예시에서 field 는 discountedValue의 값을 참조합니다.

profile
Keep Going

0개의 댓글