1|2Null許容型は、いきなり参照できないとはいえ、nullが必要になる場面が現実的には多々存在するので、ここからはNull許容型の使い方を見ていきましょう。リスト8のように、Null許容型のプロパティにアクセスすると、コンパイルエラーが発生します。Null許容型のプロパティにアクセスするとコンパイルエラーすぐ上の行で変数bにnullではない文字列を代入していますので、本来このコードは動くはずですが、コンパイラは「いきなりNull許容型を参照することはまかりならぬ」として通してくれません。リスト7のように、「Null許容型変数を非Null型変数に代入する」こともできません。何と、String型とString?型は全く別の型で互換性がありません(*3)。*3)StringはString?の子クラスのような扱いになるため、逆に「Null許容型変数に非Null型変数を代入する」場合は問題なく動作します。何とも融通が利かないと感じるかもしれませんが、コンパイル時のこの厳密な型チェックが非常な安心感をもたらしてくれるのです。明示的なnullチェックNull許容型を参照したり、非Null型に代入したりしたい場合は幾つかの方法があります。リスト10のように明確にnullチェックをする方法です。nullチェックさえ済んでしまえば、参照も非Null型への代入も自由に行えます。Null許容型をnullチェックするとエラーなく参照、非Null型に代入できる?.演算子Null許容型を参照するための別の方法は、リスト11のように「?.」という演算子を使う方法です。//エラーは起きない。訳語は安全呼び出し演算子、セーフコール演算子など)は、「第1項(演算子の前)がnullの場合はnullを、そうではない場合は第2項(演算子の後)の結果を返す」演算子です。リスト11では、変数の値がnullであってもなくても、コンパイルエラーもNullPointerExceptionも発生することなく、その値を参照できています。ここではプロパティを参照していますが、メソッド呼び出しも同様に可能です。?.演算子の効能を見てみましょう。リスト12は、深いオブジェクト階層にある値を参照する例を、JavaとKotlinで書いたものです。}}↓//Kotlinで同じことをする。深い階層の参照をJavaとKotlinで比較もはや語るまでもないという印象ですね。Javaだと多重のNullチェックが必要なのに対し、Kotlinでは1行で書けます。連続して呼び出している?.演算子のどこかで結果がnullになったとしても、以降の?.演算子は自動的にnullを返すわけです。ちなみに、C#ではNull条件演算子と呼ばれる、同じ記法(?.)の演算子があり、使い方もほぼ同じなので、C#プログラマーにとっては、すっかりおなじみの演算子でしょう。?:(エルビス)演算子?:(エルビス)演算子(*4)は、「第1項がnullではない場合には第1項を、nullの場合には第2項を返す」演算子です。リスト13では、Null許容型を返すgetName関数の戻り値を変数に代入しています。戻り値がnullだった場合には?:演算子の後ろの「名無しの権兵衛」という値が設定されます。*4)不思議な名称ですが、「?:」がエルビス・プレスリーの顔文字に似ているから、だそうです......。何かのデフォルト値を設定する場合などに使えそうですね。C#ではnull合体演算子(記法は??)という、?:演算子に似た機能が利用可能です。!!演算子この他、NullPointerExceptionが忘れられない人のために「nullチェックしていなくても、Null許容型を無理やり非Null型として扱う」!!演算子という演算子も用意されています。これを使えばリスト14のようにKotlinにおいてもNullPointerExceptionを実現(?)できます。null安全の世界から飛び出すこの演算子、明確な用途がない限り普段は使うことはなさそうですね。本文ではNull参照問題を取り上げるため、主に参照型のケースを扱いましたが、Javaのプリミティブ型に相当するInt、Longといった型においても、Null許容型を使えます。Int、Longなどにnullを代入することはできませんが、参照型の場合と同様にInt?、Long?のように「?」を末尾に付けることで、Null許容型の変数として扱うことが可能です。詳しくはレファレンスなどをご確認ください。次回は、Kotlinのクラス関連機能について今回はnull安全について熱く語ってみましたが、いかがだったでしょうか。nullが不要なケースでは全く意識することなく書けますし、nullをハンドリングする必要がある場合でもnull安全のメリットは大きいです。Javaではnullチェックを忘れると実行時にNullPointerExceptionが投げられますが、Kotlinであればnullチェックを忘れてもコンパイル時に気付くことができるのです。した言語レベルでのnull安全がごくシンプルなアプローチで出来上がっていることに魅力を感じていただけならば、ぜひKotlinを使って体感してみてください。nullの落とし穴がどこにあるか分からない世界にはもう戻れなくなるかもしれません......。次回以降はKotlinにおけるクラス関連のもろもろの機能を解説します。今回のサンプルコード今回のサンプルコードはこちらからダウンロードできます。関連記事Kotlin(プログラミング言語)Kotlin(コトリン)は「実用的」であることを主眼においたプログラミング言語だ。その特徴は簡潔/安全/汎用/(Javaとの)相互運用性にある。1.0」がリリースJetBrainsが主導して開発を進めるJVMとAndroid用のオープンソースプログラミング言語の正式版がリリース。既存のコードやインフラとの相互運用性を重視した実用的なプログラミング言語だという。平均年収ランキング2017」を発表した。第1位はScalaで平均年収は626万円、第2位はPythonで601万円、第3位はKotlinで577万円だった。SwiftやRuby、Javaなどもランクインした。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。