Kotlinについて ~Javaと比較~

f:id:U_ss:20200501183649p:plain

こんにちは!U_ssです。初めての投稿になるのでお手柔らかにお願いいたします。
最近Kotlinをさわることがあるので基本的な文法を少しまとめてみました。
KotlinといえばJavaの進化系のようなイメージもあったのと、自分自身がJavaを使っていたこともあるので、Javaと比較しながら書いていけたらと思ってます!
今回は変数、関数、クラスについてですね!

変数



Javaで一般的な変数の宣言は下記みたいな感じですかね。

// Java
String a = "test";
final String b = "test";

これをKotlinで書こうと思ったら次のようになります。

// Kotlin
var a: String = "test"
val b: String = "test"

基本的な違いとしては

  • 文末に ; がいらない
  • var,val が使われる

ちなみに「 var :書き換え可能」「 val :読み込み専用」です。

型推論

Kotlinは型推論によって型を省略して宣言することもできます。
このとき、変数、定数の型は右辺の値や、入ってくる値から推論されています。便利ですねー

// Kotlin
var a = "test"
val b = "test"
nullの許容(オプショナル)

Kotlinはnull安全に設計された言語だそうで、デフォルトではnullが許容されていません。
ちなみに...

Null安全とは、「Nullチェックをコンパイラが強制する仕組み」のこと

だそうです。
そこで、Kotlinではnullになりえる型の後ろには「?」を付与します。
これを、null許容型というみたいです。逆をnull非許容型というみたいです。

// Kotlin
var a: String = null // コンパイルエラー
val b: String? = null // コンパイルが通る。OK
null許容型へのアクセス(オプショナル)

null許容型のように、オプショナルを付けてnullで変数を宣言することができたのはいいですが、その変数へアクセスしようとするとコンパイルが通らないです...
アクセスする場合には必ずnullチェックが必要です。

// Java
String c = null;

// nullチェックしない場合
c.contains("test");    // cはnullなのでヌルポで落ちる

// nullチェックする場合
if(c != null){
    c.contains("test");    // nullなので通らない
}

これをKotlinで書くと次のようになる

// Kotlin
var c: String? = null

// nullチェックしない場合
c.contains("test")    // コンパイルが通らない

// nullチェックする場合
c?.contains("test")    // cがnullならcontainsは実行されない

このようにKotlinではnullチェックもとても簡単に行えます。
Javaでは実行するまでわからなかったヌルポも、Kotlinではそもそもコンパイルが通らなくなるのでnullチェックを忘れることがなくなりますね。
便利ですねー
また、Kotlinのオプショナルに関する話題として、「!!」を付けることでオプショナル型の変数を通常の変数のように扱える強制アンラップなるものもあります。
おそらく「!!」を使うとnullチェックが行われず強制的に実行されるんですかね?
オプショナルは奥が深そうですね...

関数



Javaでの関数の宣言は次のような感じですかね。

public void test(){
    // 関数内の処理
}

// 引数と返り値あり
public int test(int a, int b){
    return a+b;
}

これをKotlinで書くと次のようになります。

fun test(){
    // 関数内の処理
}

// 引数と返り値あり
fun test(a: Int, b: Int): Int{
    return a+b
}

Kotlinでは関数の宣言に「fun」を使います。
また、アクセス修飾子を付けていない場合はpublicの扱いになります。

クラス


public class TestClass(){
    // フィールド
    private int x;
    // コンストラクタ
    public TestClass(int x){
        this.x = x;
    }
    // メソッド
    private void method(){
        // 関数内の処理
    }
}

これをKotlinで書くと次のようになります。

class TestClass(private val x : Int){
    // メソッド
    private fun method(){
        // 関数内の処理
    }
}

Kotlinではコンストラクタをクラス名の直後に書きます。これをプライマリコンストラクタと呼び、以下2つの役割があります。

  • コンストラクタの引数を指定する。
  • 引数で初期化されるプロパティを定義する。

少しJavaに寄せた書き方をすると次のようにも書けます。

class TestClass(test_x : Int){
    val x = test_x
    
 // メソッド
    private fun method(){
        // 関数内の処理
    }
}

プライマリコンストラクタに引数を取らない場合は下記のように省略することもできます。

class TestClass{
    
}
初期化ブロック

先ほどのプライマリコンストラクタの内容を明示的に記載すると次のようになります。

class TestClass(test_x : Int){
    val x: Int
    
    init{
        // 初期化処理
        x = test_x
    }
    
    // メソッド
    private fun method(){
        // 関数内の処理
    }
}

初期化ブロック「init」はクラスが生成されたときに実行される初期化コードを含んでいます。
初期化時に処理を追加したい場合、initの中に追記します。

まとめ



今回は変数、関数、クラスの宣言周りについてまとめてみました~
やはりJavaと比べると機能等豊富そうですね。便利ですねー
使いこなすには慣れが必要そうですね。
オプショナルや、コンストラクタあたりの話はまだまだ深堀できそうですが長くなりそうなので止めておきました...
他の文法についても機会があればまとめてみようかなと思います。

もし記事内容に誤りなどありましたら、コメントで教えてください!



このブログはBulletGroupが運営しております。
BulletGroupについてはこちら
bltinc.co.jp


BulletGroupで働いてみたい方はこちら
bltinc.co.jp