왕초보일지

231206 TIL kotlin 접근제한자 지연초기화 예외처리 등등

다시은 2023. 12. 6. 17:04

안드로이드 스튜디오 저장경로오류로 어제 만든 계산기 통째로 사라졌다....깃헙에 업로드 안해놨으면 어쩔뻔

 

접근제한자

 

AccessTestClass 클래스 안에 여러 접근제한자를 적용한 변수를 만들어 놓음

이 클래스를 같은 패키지안의 Test.kr 파일에서 호출할 때

변수 a, b, d 만 호출가능한 것을 확인할 수 있다. public인 a, b 는 당연히 가능하고

 

internal 로 제한된 변수 d 는

app 이라는 모듈 안에 같이 포함되어있기 때문에 호출가능한 것

 

AccessTestClass 클래스를 상속받은 AccessTestChildClass 클래스 에서 불러올 수 있는 변수는?

private 인 c를 제외하고는 호출이 가능하다.

protected인 e 는 부모 클래스를 상속받았기 때문에 Test.kr 의 경우와 달리 호출이 가능한 것

 

 

예외처리의 활용

 

과제로 만든 계산기 기능에서

숫자를 입력받는 과정에 숫자가 아닌 문자를 입력받으면 어떻게 뜰까?

 

java.long.NumberFormatException 오류가 뜬다.

 

 

그러면 이 경우는 예외처리를 통해 문자의 입력을 막을 수 있다.

 

연산자를 입력하는 부분에서는 ?

입력받은 숫자를 문자열로 처리할 수 있기때문인지 when조건식의 else 로 넘어가서 나머지를 구한다.

 

지연초기화

Kotlin 에서는 항상 생성자에서 null 이 아닌 속성을 초기화시켜주어야 한다.

""와 같이 공백으로 처리하는 것은 가독성에 좋지 X

nullable 이 아닌 속성을 초기화하지 않았기 때

이 때 초기의 값을 나중에 대입하기 위한 문법이 지연초기화, 늦은 초기화라고 한다.

변수var : lateinit / 상수 val : lazy

Int 타입의 변수 age 와 nullable 에 lateinit 선언을 해줬더니 위와 같은 오류가 뜬다. 

'lateinit' modifier is not allowed on properties of primitive types/nullable types in Kotlin

 

isInitialized 를 활용해서 값이 초기화되었는지 확인할 수 있다.

 

 

상수의 지연초기화 lazy

 상수를 사용하는 시점에 값을 대입하고 초기화 수행

처음 : address 초기화 / seoul

이후 : seoul

 

 

 

 

 

 

 

 

 

lateinit 참고

: Why Kotlin lateinit Can’t Be Used With Primitive Types

https://www.baeldung.com/kotlin/lateinit-primitive-types

 

 

 

Kotlin 의 primitive types

  • Boolean
  • Byte
  • Char
  • Double
  • Float
  • Int
  • Long
  • Short

 

널 세이프티

 

널이란???

널이면 호출이 안된다.

 

readline()!! : null 허용

readln() : null 허용X

 

https://kotlinlang.org/docs/whatsnew16.html#new-readline-functions