[Atomic 18] 프로퍼티 (val & var)
클래스에 속한 프로퍼티
[ 프로퍼티 ]
- 클래스에 속한 val나 var을 의미
- 클래스에 속한 프로퍼티는 클래스의 일부분으로, 점 표기법(객체명.프로퍼티 명)을 사용해 프로퍼티 값에 접근 가능
- 멤버 함수의 경우 같은 클래스에 속한 프로퍼티에는 점 표기법을 사용하지 않고 접근 가능
- 프로퍼티를 통해 클래스 내에서 상태를 유지
- 각 객체는 프로퍼티를 저장한 공간을 따로 할당
[ 코드 예시 ]
class Cup{
var percentFull=0
val max = 100
fun add(increase:Int):Int{
percentFull += increase // 멤버 함수에서 동일한 클래스 내의 프로퍼티에 접근 가능
if(percentFull > max) percentFull = max
return percentFull
}
}
fun main(){
val c1 = Cup()
c1.percentFull = 50
var c2 = Cup()
c2.percentFull = 100
print(c1.percentFull) // 출력 결과 : 50
print(c2.percentFull) // 출력 결과 : 100
}
- 공간을 따로 할당 받기 때문에 c1, c2의 percentFull의 값이 다름을 알 수 있음
[ 안티패턴 ]
- 가변(var)인 최상위 프로퍼티를 선언하는 것
- 프로그램이 복잡해질 수록 공유된 가변 상태에 대해 추론이 어려우며, 누구가 접근 가능하여 버그가 생길 가능성이 존재
- 가변 상태의 경우 클래스 내에 가두는 것이 좋음
val constant = 42
var counter = 0
fun inc(){
counter++
}
[ 가변 var , 불변 val ]
- var은 수정이 가능은 프로퍼티, val은 수정이 불가능한 프로퍼티를 의미
class House{
var sofa: String = "" // 가변
val table:String = "table : $60.00" // 불변
}
fun main(){
val house1 = House() // 불변
var house2 = House() // 가변
house1.sofa = "sofa : $89.00"
house2.sofa = "sofa : $89.00"
//house1.table = "table : $70.00" // 불변으로 수정 불가
//house2.table = "table : $70.00"
//house1 = House() // 불변으로 수정 불가
house2 = House()
}
[ 식별자 ]
- 식별자는 객체가 아닌 객체를 가리키는 참조
class House{
var table:String = "table : $60.00"
}
fun main(){
val house1 = House()
val house2 = house1 // 같은 객체 참조
print(house1.table) // 출력 결과 : table : $60.00
print(house2.table) // 출력 결과 : table : $60.00
house1.sofa = "table : $89.00"
print(house1.table) // 출력 결과 : table : $89.00
print(house2.table) // 출력 결과 : table : $89.00
}
- house2는 house1이 참조하고 있는 동일한 객체를 참조하기 때문에 house1의 table을 변경해도 house2가 변경됨
- val / var은 객체가 아닌 참조를 제한
[ 오늘의 학습 소감 ]
오늘은 내용은 많지 않았지만 정리를 해보니 내용이 한가득이었던 프로퍼티. 이전 아톰에서 계속 다뤘던 var / val의 프로퍼티에 대해 더 자세하고 깊게 설명한 아톰이었는데 프로퍼티부터 안티패턴, 참조 등 다양한 것에 대해서 알았고, 예시를 통해 더 쉽게 이해할 수 있는 아톰이었다. 오늘은 이전에 설명했었던 내용들을 바탕으로 한 것을 제외하고 생각해 보았을 때 제일 마지막 'val / var은 객체가 아닌 참조를 제한한다.' 라는 문장을 기억해놔야 할 것 같다.