【正社員】還元率83%【フリーランス】マージン一律5万円で案件をご紹介させていただきます。 詳細はこちら

【Android】<Kotlin>null安全とは?null許容型やnull安全のための演算子について徹底解説!

【Android】<Kotlin>null安全とは?null許容型やnull安全のための演算子について徹底解説!
すだ

みなさまこんにちは〜!
メモリアインクのすだです。

今回は、Kotlinでの開発における「null安全」の考え方と、「null許容型」と呼ばれる変数の定義について、実際のコードを使いながら解説していきます。

この記事を読んでわかること…
・null安全とは?
・null許容型の使い方

目次

環境

  • Kotlin (ver 1.9.0)
  • Android Studio (Giraffe | 2022.3.1 Patch 3)

null安全とは?

null安全(null-safety) とは、プログラムが「nullによるエラー」を起こさないようにする仕組みのことです。

たとえば、こんな Kotlinで以下のコードを書くとします:

val name: String = null // エラー

Kotlin では、nullを許さない型(非null型null を入れると コンパイルエラー になります。
これは nullによるアプリクラッシュ(NullPointerException)を防ぐための仕組みです。

null許容型とは?

Kotlinではできるだけnullを避けるのが基本ですが、実際のアプリ開発ではnullを許容しなければいけない場面が意外とあります。

たとえば以下のようなパターン:

  • 「未設定」や「未入力」を表す目的
    • ユーザーがニックネームをまだ登録していない場合があり、デフォルトでは null にしておいて、登録されたら値を入れる
  • 外部データの受け皿としての目的
    • APIレスポンスの値がnullの可能性があるとき
  • 「見つからなかった」ことを安全に表現する目的
    • 検索の結果が見つからないとき

こういった場合にnullを使うのは便利なので、nullを許容する変数に変更する必要があります。
これが「null許容型」と呼ばれるものです。

Kotlinでは、? を型名につけることで null を許容することができます。

val name: String = null // エラー(null不可)

↓

val name: String? = null // OK(nullを許容)

null安全のための演算子

Kotlinには、? 以外にもnullの値を扱うための演算子がいくつかあり、シーンによって使い分ける必要があるので
ここで全て紹介します。

?.(セーフコール演算子)

?.「nullでなければ処理、nullならそのままnullを返す」 という安全な呼び出し方法です。
name が null だった場合、length には null が入ります(クラッシュしない)

val name: String? = "Hanako"
val length = name?.length // nullならそのままnullを返す

セーフコール演算子をつけずにval length = name.lengthと書くとコンパイルエラーになるので注意。

?:(エルビス演算子)

?:「nullだったらこの値を代わりに使ってね」という演算子です。
つまりは、nullだった場合のデフォルト値を設定できます。

val name: String? = null
val result = name ?: "Unknown"

let + ?.(スコープ関数を活用)

?.let { ... } は、変数がnullでなければ、その中で処理を行うという安全な書き方。
nullチェックと処理を1つにまとめたいときに便利です。

val comment: String? = null

comment?.let {
    println("長さ: ${it.length}")
} ?: println("コメントがありません")

!!(非null断言演算子)※非推奨

!!「絶対に null じゃない!」 と Kotlin に伝える演算子です。
String? は本来 null かもしれないので、Kotlin は .length を直接使わせてくれません。
そこで !! をつけると「OK、自己責任で使います」となります。

val name: String? = "Taro"
val length = name!!.length

namenull だった場合、クラッシュ(NullPointerException)しますので非推奨です。
基本的には使わない方向で実装しましょう。

まとめ

おつかれさまでした。いかがでしたでしょうか!

null許容型の値を使って処理を書く場合は、?.let {} ?: を使ってnullに備えた処理を書くことが大切です。
そもそも「nullを使わなくて済む設計」も大事(非null型の活用)ですので、よく考えて使ってください。

すだ

技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
を通じて、
自分の市場価値をさらに向上させてみませんか?

それではまた次回の記事でお会いしましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

弊社テックブログをご愛読いただきありがとうございます。
当テックブログを運用している株式会社メモリアインクは、
【正社員】還元率83%
【フリーランス】マージン一律5万円で案件のご紹介
と、エンジニアの皆様に分かりやすい形で稼げる仕組みを構築し提供させていただいております。

コメント

コメントする

目次