式と文の違い
プログラミングにおける式とは、簡単に言うと『変数に代入することができる形式であるもの』です。
言い換えれば、何らかの値を持つもの…という表現もできるでしょう。
最も簡単な例は、下のような形ではないでしょうか。
3 + 2という式は、その結果を変数resultに格納することができます。
整数同士の計算は、THE・計算式…という感じなのでイメージしやすいかと思いますが、このような典型的な式の他にも、文字列同士をくっつけたり、整数を文字列型に変換した結果も『値を持つもの=式』として代入可能です。
val result = 10.toString() // これも式と解釈されます
一方、プログラミングにおける『文』は、なんらかの処理を行うための命令を伴うが、それ自体は値を持たないもの…というふうに表現することができます。
例えば、forループ(文)。
forは繰り返しの処理を行うように命令するものですが、それ自体が10(整数)とか、"
Hello world"
(文字列)とか、なんらかの値を保持するものではありません。
なので、forループによる繰り返される処理を変数に代入しようと思っても、コンパイルエラーになります。
fun main() {
val kotlin = for(i in 1..5) {
// 何らかの処理
}
/* これはエラーになります
* For is not an expression, and only expressions are allowed here */
}
上のサンプルコードには実行時のエラーメッセージをコメントとして掲載していますが、そのエラーメッセージを訳すと、『Forは式ではありません。ここでは式の記述しか許可されていません。』となり、for~は式ではないということが明言されています。
このように、for〜は繰り返しの処理を行いますが、何らかの値や結果を持つものではない(=式ではない)ので、変数に代入できない仕組みになっています。
これがプログラミングにおける式と文の大きな違いです。
Kotlinのif〜elseは式として扱えるという特徴を押さえる前に、まずはこの違いをしっかり理解しておく必要があります。
POINT!
- ・式は何らかの値や結果を持つものであり、変数に代入可能!
- ・文は何らかの処理を行うが、それ自体が値を持つわけではない!
- ・なので、文を変数に代入することはできない!
Kotlinではif~elseが式である
前章ではプログラミングの式と文の違いについて説明しましたが、多くのプログラミング言語において、条件分岐の基本であるif~esleは式ではなく文として解釈されます。
例えば、JavaScriptでは下のような記述はエラーになります。
// これはJavaScriptではエラーになります
const num = 10;
const result = if(num > 5) {
true
} else {
false
}
おさらいになりますが、文はそれ自体が何らかの値を持つわけではないので、= で変数に代入することができないからです。
通常は、if~else自体を変数に代入するのではなく、下の例のように変数をどこか別の場所で宣言しておき、if~elseの中で改めて結果を代入する必要があります。
const num = 10;
let result;
if(num > 5) {
result = true;
} else {
result = false;
}
console.log(result); // true
どうしても直接的に結果を代入したい場合は、下の例のように、式である三項演算子を利用するしかありません。
// 三項演算子は式なので結果を変数に代入可能
const num = 10;
const result = num > 5 ? true : false;
console.log(result); // true
ですが、三項演算子は人間にとって読みやすい形式であるとは言えないのがデメリットと言えます。
上のサンプル程度の条件分岐であれば問題ないですが、複雑なものになればなるほど、三項演算子で表現するとわかりづらくなってしまいがちです。
できれば、if~elseを式として解釈してくれた方がありがたいですよね?
それを実現してくれたプログラミング言語こそがKotlinです。
Kotlinではif~elseを式として扱うことができるように設計されています。
次のコードはKotlinではエラーにならず、結果が正常に出力されることが確認できます。(コードの右上の▶ボタンをクリックするとコードを実行できます)
上の例では、わかりやすいようにifブロックとelseブロックを改行で明確に分けていますが、下のようにもっとシンプルに記述することも可能です。
三項演算子のように『?』マークや『:』マークといった記号を使うのではなく、if・elseという人間にとって意味のある単語を使って表現できるので、直感的に分かりやすいコードを書くことができます。
また、複数の条件を記述できるwhen~も式として結果を変数に代入することができるようになっています。
筆者がKotlinを愛する理由は色々ありますが、その一つがこの『条件分岐を式として扱える』という点です。
条件分岐を式として扱える便利さは一度手にしてしまうと、二度と手放せません(笑)。
『if~elseは式じゃなくて文だから、どこかで変数を宣言して値を格納して…。変数を宣言する場所はどうする?変数に値を代入するタイミングは?』といったことを、いちいち悩まなくて良いのはとても便利だと感じます。
他のプログラミング言語と比較した時に、『Kotlinにおけるif~elseは式である』というのがいかに特徴的で、非常に協力な機能であるというのがお分かりいただけたでしょうか?
人気や求人数だけでプログラミング言語を選ぶのであれば、JavaScriptやその他の言語に軍配が上がるのが正直なところですが、扱いやすさや今後の将来性、できることの幅広さで選ぶなら、Kotlinはかなりオススメのプログラミング言語です。
趣味として、あるいは第二言語的な感じでKotlinを学ぶのも楽しいですしオススメですよ!
POINT!
- ・一般的に、if~elseは式ではなく文として解釈されることが多い!
- ・しかし、Kotlinではif~elseを式として扱うことが可能!
- ・複数の条件分岐を扱うwhen~も式として変数に代入可能!