문제

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이 될 수 있는 변수로 선언할 수 있다.

자바 코드를 살펴보면

  • clientmessage@Nullable로 표시되어 있어 null 값을 가질 수 있다.
  • mailer@NotNull로 표시되어 있어 null 값을 가질 수 없다.
  • clientmessage 둘 중 하나라도 null 값이면 메서드를 종료한다.
  • client 객체에서 personalInfo를 가져온다.
  • personalInfo가 null 값 이면 메서드를 종료한다.
  • personalInfo에서 email을 가져온다.
  • email이 null이면 메서드를 종료한다.
  • mailer 객체를 사용하여 이메일 주소로 메시지를 보낸다.

위의 자바 코드를 요약해 보면 모두 유효한 경우에만 이메일을 보내도록 구성되어 있다.

중간에 null 값이 존재하면 메서드를 종료한다.

이를 통해 null값에 대해서 안전하도록 코드를 작성해야 되는 것을 알 수 있다.

val email = client?.personalInfo?.email

null 안전성에 대한 코드이다.

  • 널 안전한 접근 연산자 (?.) 사용:
    • client?.personalInfoclient 객체가 null이 아닌 경우에만 personalInfo에 접근하도록 한다.
    • 만약 client가 null이면 personalInfo에 접근하지 않고 null을 반환한다.
    • 같은 방식으로 personalInfo?.emailpersonalInfo 객체가 null이 아닌 경우에만 email 을 반환한다.

위의 내용을 토대로 if문의 조건을 통하여 null값이 허용된 변수들을 확인해 주는 조건을 TODO()에 기재해 주면 된다.

참고

Null 안전성 관련 연산자 종류

연산자사용법설명
?val a: Int?a 변수를 null 허용으로 선언
?:A?:BA가 null이면 B 실행
?.A?.lengthA가 null이면 null, nullO
!!A!!BA가 null이 아닐 때만 B 실행. null이면 예외 발생
profile
개발하는 다람쥐

0개의 댓글