728x90
/*
class Coffee constructor(val name: String) { //constructor 키워드를 생략할 수 있다.
}
*/
class Coffee(
var name: String = "",
var price: Int = 0, //후행 쉼표가 가능하다, price를 수정하지 않고 새로운 필드를 추가할 수 있다.
//코드 리뷰 시 변경사항이 한부분만 변경된 것을 명시적으로 알 수 있다
//val brand: String,
var iced:Boolean = false,
){
val brand: String
//get() = "스타벅스" //커스텀 getter
get() {
return "스타벅스"
}
var quantity: Int = 0
set(value) { //커스텀 setter
if (value > 0 ){ //수량이 0 이상인 경우에만 할당
field = value //식별자로, getter/setter에 대해서 field를 제공한다.
//quantity = value //프로퍼티 값을 직접 세팅해 주면 내부적으로 계속 setter를 호출하기 떄문에 stackoverflow 에러가 발생한다.
}
}
}
class EmptyClass //본문이 없는 클래스
fun main() {
val coffee = Coffee()
coffee.name = "아이스 아메리카노"
coffee.price = 2000 //실제로는 setter를 사용해 값을 세팅해 준다, 코틀린 컴파일러가 getter/setter를 알아서 생성해준다.
coffee.quantity = 1
coffee.iced = true
if (coffee.iced){ //클래스의 상태를 프로퍼티로 가지고 온다.
println("아이스 커피")
}
println("${coffee.brand} ${coffee.name} 가격은 ${coffee.price} 수량은 ${coffee.quantity}")
}
- class 키워드를 사용해 클래스를 선언한다.
- 클래스 본문을 생략할 수 있다.
- 클래스의 생성자는 기본 생성자, 하나 이상의 보조 생성자가 존재할 수 있다.
- 클래스의 constructor 키워드는 생략이 가능하다.
- 프로퍼티를 선언 할 때 후행 쉼표를 사용할 수 있다.
- 수정하려고 하는 필드를 명시적으로 수정할 수 있으며, git diff 등으로 변경 이력도 명확히 알 수 있다.
- 프로퍼티는 val, var 키워드 모두 사용 가능하며, 수정하거나 사용하려면 참조를 사용하면 된다
- var로 선언된 프로퍼티는 getter,setter를 자동으로 생성하며, val로 선언된 프로퍼티는 getter만 존재한다.
- coffee.name = "아이스 아메리카노" //setter를 사용해 값 할당
- println(coffee.name) //getter를 사용
- 커스텀 getter/setter를 만들 수 있다.(brand, quantity)
- 커스텀 setter는 var 키워드만 한정해 만들 수 있다.
- getter/setter 에서 field 라는 식별자를 사용해 필드의 참조에 접근하는데, 이를 backing field에 접근한다고 한다.
- 직접 프로퍼티를 통해 값을 대입하면 무한 재귀가 발생해(내부적으로 값 세팅할 때, setter가 호출되기 때문) stackoverflow가 발생한다.
- 코틀린의 프로퍼티는 객체지향적으로 상태는 프로퍼티로 행위는 메서드로 표현할 수 있다.
- 자바보다 객체지향적으로 코드 작성 가능(iced)
728x90