728x90
반응형
1. null
클래스를 많이 쓰게되면, 여러가지 객체들이 변수에 대입되어 사용하게 된다.
여기서 중요한게!! 변수에 객체가 대입되어 보관이 되어있는가를 살펴봐야한다!! (안그러면 에러니까)
개발자는 변수에 객체가 있다고 생각했지만, 막상 안에는 null값이라면?? 에러다.
그래서 코틀린에서는 변수에는 null 대입을 기본적으로 인정하지않는다.
class를 지정한 변수의 경우, 거기에 null을 대입하는것은 불가능하다.
또 프로퍼티의 경우, 반드시 객체가 대입될 수 있도록 초기화를 해야한다.
코틀린에서 초기화가 안된 프로퍼티(즉, 이 상태는 null의 상태이다)는 프로퍼티로 인정하지 않는다.
2. null 대응과 관련된 연산자
그런데 경우에 따라서는 null이 필요한 경우도 있을것이다.
코틀린에서는 null참조가능/불가능한것을 지정할 수 있다.
통상 class를 지정한 객체는 null 대입이 불가능하지만, 연산자를 통해서 바꿀수있다.
fun main() {
val t = Person(null,40)
//null이지만 괜찮다. class Person에 null 대응을 미리 해두었기때문에
t.println()
val h = Person(Pair("고양희","갈색"),10)
h.println()
}
class Person(name : Pair<String, String>? , age : Int) {
//null인 경우도 있으니 ? 로 대응
var name = name
var age = age
fun println(){
val (f,h) = name?: Pair("no","name") //name은 null일수도 있으니 ?로 대응
println("${f}-${h} (${age})")
}
}
//output
no-name (40)
고양희-갈색 (10)
name : String ? // null일수도 있다
name : String !!
// null이 절대 아니다
// null인 경우, NullPointerException 예외가 발생하여 프로그램이 강제 종료된다.
t?.println()
//객체를 대입하는 변수가 null일 수도 있는 경우, 그 객체 안에 있는 메소드를 호출할때 확인한다
//변수가 null이 아닌 경우에만 메소드를 실행한다.
//null이면 아무것도 실행하지 않고 밑으로 내려간다.
t!!.println()
//변수가 null을 허용하든, null이 아닌경우가 확실한 경우
//null이 아니라고 외치는중~
name ?: "없음"
//null인 경우, 그 대안으로 값을 넣음
//엘비스 연산자
3. 스코프함수
객체가 연속해서 필요한 일을 해야하는 경우, 스코프 함수라는것을 이용하여 간단하게 처리를 추가할 수 있다.
fun main() {
val t = Person().also{
it.set("고양희",10)
println("also : ${it.getMsg()}")
}.let{
it.set("센",14)
println("let : ${it.getMsg()}")
}
println(t)
}
class Person{
var name : String = ""
var age : Int = 0
fun set(name : String, age : Int){
this.name = name
this.age =age
}
fun getMsg() : String{
return "$name $age"
}
}
//output
also : 고양희 10
let : 센 14
kotlin.Unit
//let은 객체를 반환하지 않는다.이건 자신이 무슨 값을 갖고있다는게 아니다.
//리턴값이 없다고 생각하면 된다.
let
=> 객체(it) 자신을 파라미터로해서 필요한 일을 한다. 리턴값은 실행결과 (Kotlin.Unit)
run
=>파라미터에는 자신을 던지는게 아니라서, this로 지정한다. 리턴값은 실행결과 (Kotlin.Unit)
apply
=> 파라미터에는 자신을 던지는게 아니라서, this로 지정한다. 리턴값은 객체 자신이다.
also
=> 객체(it) 자신을 파라미터로해서 필요한 일을 한다. 리턴값은 객체 자신이다.
also에서 출력하는경우 객체의 고유값(Person@6e8cf4c6)을 출력한다.
fun main() {
val t = Person().also{
it.set("고양희",10)
println("also : ${it.getMsg()}")
}
println(t)
}
class Person{
var name : String = ""
var age : Int = 0
fun set(name : String, age : Int){
this.name = name
this.age =age
}
fun getMsg() : String{
return "$name $age"
}
}
//output
also : 고양희 10
Person@6e8cf4c6
728x90
반응형
'Kotlin' 카테고리의 다른 글
Delegate Pattern 위임패턴 (0) | 2024.08.20 |
---|---|
Kotlin13. class의 다른 확장 - Pair, 확장메소드/프로퍼티.. (0) | 2023.08.13 |
Kotlin12. class의 다른 확장 - Delegation, observable... (0) | 2023.08.13 |
Kotlin11. interface, abstract, Singleton (0) | 2023.08.13 |
Kotlin10. class와 OOP (0) | 2023.08.06 |