실무 프로젝트로 배우는 Kotlin & Spring/코틀린 기초

클래스와 프로퍼티

webmaster 2022. 10. 2. 15:30
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

'실무 프로젝트로 배우는 Kotlin & Spring > 코틀린 기초' 카테고리의 다른 글

인터페이스  (0) 2022.10.02
상속  (0) 2022.10.02
예외 처리  (0) 2022.10.01
널 안정성  (0) 2022.10.01
흐름제어  (0) 2022.10.01