Learn about null safety and safe calls in Kotlin and rewrite the following Java code so that it only has one if expression:
public void sendMessageToClient(
@Nullable Client client,
@Nullable String message,
@NotNull Mailer mailer
) {
if (client == null || message == null) return;
PersonalInfo personalInfo = client.getPersonalInfo();
if (personalInfo == null) return;
String email = personalInfo.getEmail();
if (email == null) return;
mailer.sendMessage(email, message);
}
fun sendMessageToClient(
client: Client?, message: String?, mailer: Mailer
) {
TODO()
}
class Client(val personalInfo: PersonalInfo?)
class PersonalInfo(val email: String?)
interface Mailer {
fun sendMessage(email: String, message: String)
}
fun sendMessageToClient(
client: Client?, message: String?, mailer: Mailer
) {
val email = client?.personalInfo?.email
if (email != null && message != null) {
mailer.sendMessage(email, message)
}
}
class Client(val personalInfo: PersonalInfo?)
class PersonalInfo(val email: String?)
interface Mailer {
fun sendMessage(email: String, message: String)
}
null 안전성 및 안전한 호출에 관한 문제이다.
문제 제목 Nullable types에서 Nullable은 명시적으로 null이 될 수 있는 변수를 뜻 한다.
타입에 물음표(?) 기호를 이용하여 명시적으로 null이 될 수 있는 변수로 선언할 수 있다.
자바 코드를 살펴보면
client
와 message
는 @Nullable
로 표시되어 있어 null 값을 가질 수 있다.mailer
는 @NotNull
로 표시되어 있어 null 값을 가질 수 없다.client
와 message
둘 중 하나라도 null 값이면 메서드를 종료한다.client
객체에서 personalInfo
를 가져온다.personalInfo
가 null 값 이면 메서드를 종료한다.personalInfo
에서 email
을 가져온다.email
이 null이면 메서드를 종료한다.mailer
객체를 사용하여 이메일 주소로 메시지를 보낸다.위의 자바 코드를 요약해 보면 모두 유효한 경우에만 이메일을 보내도록 구성되어 있다.
중간에 null 값이 존재하면 메서드를 종료한다.
이를 통해 null값에 대해서 안전하도록 코드를 작성해야 되는 것을 알 수 있다.
val email = client?.personalInfo?.email
null 안전성에 대한 코드이다.
?.
) 사용:client?.personalInfo
는 client
객체가 null이 아닌 경우에만 personalInfo
에 접근하도록 한다.client
가 null이면 personalInfo
에 접근하지 않고 null을 반환한다.personalInfo?.email
도 personalInfo
객체가 null이 아닌 경우에만 email
을 반환한다.위의 내용을 토대로 if문의 조건을 통하여 null값이 허용된 변수들을 확인해 주는 조건을 TODO()
에 기재해 주면 된다.
Null 안전성 관련 연산자 종류
연산자 | 사용법 | 설명 |
---|---|---|
? | val a: Int? | a 변수를 null 허용으로 선언 |
?: | A?:B | A가 null이면 B 실행 |
?. | A?.length | A가 null이면 null, nullO |
!! | A!!B | A가 null이 아닐 때만 B 실행. null이면 예외 발생 |