var variable: String?
variable = null
fun nullParameter(string: String?){
//함수의 파라미터가 null을 허용하려면 이렇게 if문으로 null 체크를 먼저 해야 사용할 수 있다.
if (string != null) {
var length = string.length
}
}
fun nullReturn(): String? {
//리턴타입에 NUllable을 지정해줘야지 null을 반환할 수 있다.
return null
}
fun testSafeCall(str: String?): Int? {
var resultNull: Int? = str?.length
return resultNull
//str이 null이면 뒤의 length를 호출하지 않고 null을 반환
}
fun testElvis(str: String?): Int {
var resultNonNull: Int = str?.length ?: 33
return resultNonNull
// length 오른쪽에 ?:을 사용하면 null일 경우 ?: 오른쪽의 값 33이 반환
}
class Person {
var name: String? = null //처음에 null값을 입력해두고,
init {
name = "Lionel"
}
fun process() { //메서드 영역에서 값을 입력.
name?.plus(" Messi")
print("이름의 길이 = ${name?.length}")
print("이름의 첫 글자 = ${name?.substring(0, 1)}")
}
}
class Person {
lateinit var name: String
init {
name = "Lionel"
}
fun process(){ //Safe call을 사용하지 않고 사용이 가능하다.
name.plus(" Messi")
print("이름의 길이 = ${name.length}")
print("이름의 첫 글자 = ${name.substring(0, 1)}")
}
}
class Company {
//반환되는 값의 타입을 추론할 수 있기 때문에 person 변수의 타입은 생략.
val person: Person by lazy { Person() }
fun process(){
print("person의 이름은 ${person.name}")
}
}
Null Safety개념이 아주 흥미로웠다. null처리를 위해 따로 ? 연산자를 사용해줘야 한다는 것, 그리고 null값을 대체하기 위한 ?: 연산자가 있는 것도 새로웠다.
=>Null Safety가 일종의 예외 처리로 사용되고 있는 것 같은데, 이를 통해 예외 처리를 할 일이 많이 줄어들지 빨리 체감해 보고 싶다.
지연초기화의 by lazy도 모양부터 낯선감이 있었는데, 전체처리속도에 유의 하여 사용한다는 주의점을 기억하고 상황에 맞춰 효율적인 방법을 사용할 수있도록 노력해야겠다.
기본문법서의 예제문제들을 안드로이드 스튜디오로 실행하고 있는데, logcat을 확인해야할 때, 빌드는 제대로 되고 에뮬도 잘 실행되었는데 로그캣만 반응 없이 잠잠해서 당황스러웠다.
확인해보니까 일단 사용하고있는 에뮬레이터 이름과 로그캣에 찍혀있는 에뮬레이터 이름이 달라서 이를 중점으로 검색했더니
메뉴의 File > Invalidate Caches / Restart 를 통해 캐시를 모두 지우고 다시 시작하는 방법이 나와서 실행했더니 사용하고 있는 에뮬레이터와 잘 연결되는 것을 볼 수 있었다.
이 방법이 통하지 않는다면
메뉴의 Tools > Android > Android Device Monitor 을 통해서
LogCat창을 확인할 수 있다고 하니, 기억해둬야곘다.