처음 접한 키워드들

이완희·2024년 5월 21일
0

코틀린 기초 타파

목록 보기
1/5

프로퍼티와 var & val

이 개념부터 확실하게 알아야 코틀린을 이해할수 있다.

  • 프로퍼티 = 필드 + 접근자
  • var(Variable) : 가변 변수, getter & setter 선언 가능
  • val(Value): 불변 변수, getter만 선언가능(read-only)
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)

클래스의 프로퍼티로 자동 할당되지 않으므로 클래스 외부에서 접근할 수 없다. 생성자 또는 프로퍼티 초기화 하는 식에서만 사용가능 하다.

lateinit, by lazy

늦은 초기화

일부 프로퍼티는 사용되는 시점보다 이전에 초기화 될 수 있다.

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를 보장한다는 장점도 있다.

profile
인생을 재밌게, 자유롭게

0개의 댓글