이 개념부터 확실하게 알아야 코틀린을 이해할수 있다.
public class House {
private final String address;
private float price;
public String getAddress() {
return address;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public House(String address, float price) {
this.address = address;
this.price = price;
}
}
address와 price를 갖고 있는 자바의 클래스 코드와 아래 코틀린 클래스는 동일하다.
class House(val address: String, var price: Float)
getter와 setter가 난무하지 않는 간결한 코드를 작성할 수 있다는건 코틀린의 큰 장점중 하나이다.(물론 자바에서도 자동생성, @Data등을 통해 쉽게 생성할 순 있다)
val(var)가 없을수도 있다.
class House(address: String, price: Float)
클래스의 프로퍼티로 자동 할당되지 않으므로 클래스 외부에서 접근할 수 없다. 생성자 또는 프로퍼티 초기화 하는 식에서만 사용가능 하다.
일부 프로퍼티는 사용되는 시점보다 이전에 초기화 될 수 있다.
var text: String? = null
위 코드의 단점은 사용 전에 초기화되므로 절대 널이 될 수 없는 값이라는 사실을 알고 있음에도 널 가능성을 처리해야 한다. 이런 단점을 보완하려면 lateinit키워드를 사용하면 된다.
lateinit var text: String
lateinit 키워드가 있다면 값을 읽으려고 할때 초기화 하지 않았다면 UnititalizePropertyAccessException을 던져준다. 사용자의 실수를 사전에 방지해준다. 다만 아래 조건을 만족해야 한다.
1) 값이 변경될 수 있으므로 val 선언은 불가능하다.
2) Int, Long, Double, Float와 같은 Primitive Type에는 사용이 불가능하다. null이 될수있는 값으로 표현되기 때문이다.
3) 초기화 식을 지정해 값을 바로 대입할 수 없다.
var text = File("data.txt").readText()
프로퍼티를 이렇게 정의하면 프로그램을 시작할 때 바로 읽어버린다. 하지만 아래처럼 by lazy키워드가 있다면 변수를 실행하는 시점까지 초기화를 자동으로 늦춰주는 위임 패턴을 사용한다.
var text by lazy {
File("data.txt").readText()
}
덤으로 Thread-Safe를 보장한다는 장점도 있다.