16. lateinit과 게터, 세터(getter, setter)

2022. 3. 7. 12:13[Android APP] feat. Kotlin/Kotlin 언어 기초

코틀린에서 변수를 만들 때는 항상 초기화를 해줘야한다.

하지만 생성할 때 초기화를 하지 않고 나중에 하는 방법이 있다.

lateinit을 사용하면 나중에 init 안에서 초기화하겠다 라고 선언해주는 것과 같다.

위와 같이 코드를 작성하면 에러가 발생한다.

Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property owner has not been initialized
	at com.example.myapplication.Car.getOwner(KotlinBasics.kt:13)
	at com.example.myapplication.KotlinBasicsKt.main(KotlinBasics.kt:6)
	at com.example.myapplication.KotlinBasicsKt.main(KotlinBasics.kt)

이는 속성 owner가 초기화되지 않았기 때문에 발생하는 에러이다.

lateinit을 사용했기 때문에 비어있는 데이터에 접근하였고 널러블이 아니기에 가져올 수 없는 것이다.

 

해결방법은 myCar의 이니셜라이저를 init 안에 넣어준다.

아래 코드와 같이 owner를 init에서 초기화해주면 에러가 사라지는 것을 알 수 있다.

 

 

다음은 자동차의 최고속도인 maxSpeed를 생성한다.

maxSpeed역시 변수이기 때문에 초기화를 해준 뒤 getter, setter를 통해 값을 받아오고 setting해준다.

또한 최고 속도는 0이 될 수 없기 때문에 if문을 이용해 속도가 0이하일 경우 에러코드를 발생시켜준다.

속도를 0보다 작은 값으로 설정했을 때 IllegalAccessException을 통해 에러코드를 발생하는 것을 확인할 수 있다.

 

속도를 320으로 입력했을 때 제대로 출력되는 것을 알 수 있다.

getter의 역할은 입력된 값을 받아오는 것이고, setter는 입력된 값으로 연산을 해서 나온 값으로 데이터를 세팅해주는 역할이다.

 

private은 하나의 클래스 내에서만 사용할 수 있다.

따라서 현재 코드에서 Car클래스가 아닌 다른 곳에 정하는 것은 불가능하다.

myModel을 생성해 private setter를 연습해보겠다. Car클래스에 myModel속성을 만든 뒤 setter를 private로 설정한다.

메인에서 myModel속성을 정의할 때 에러가 발생하는 것을 볼 수 있다.

에러 내용은

Cannot assign to 'myModel': the setter is private in 'Car'

즉, myModel이라는 변수의 setter는 Car클래스 안에 private으로 설정되어있기 때문에 main에서 설정할 수 없는 것이다.

하지만 getter는 아래 코드에서 private으로 설정되있는 것이 아니기때문에 써도 무방하다.

 

Car클래스의 field는 getter와 setter 메소드 안에서 속성의 참조를 도와주며 이는 필수다.

만약 getter나 setter안에 그냥 프로퍼티를 입력하면, 반복되는 호출이 되어 Stack Overflow 현상이 일어난다.

* Stack Overflow는 Stack 영역의 메모리가 지정된 범위를 넘어갈 때 발생한다.

 

반응형