🔰

Javaと比較するKotlin入門

2024/11/22に公開

前置き

Android開発でKotlinを使用する前に、まずは基礎知識から勉強します。
元々Java(やGroovy)での開発経験があるのでJavaと比較しながらみていきます。

変数宣言

Kotlinは型推論が強力なので明示的な形指定は不要
JavaはJava10以降でvarが使用できるようになったが、あまり見なかった印象
(あとはRVコメントでfinalを付け忘れるなと言われた記憶)

Java

String message = "Hello";  // 変更可能
final String finalMessage = "Hello";  // 変更不可能

Kotlin

var message = "Hello"  // 変更可能
val finalMessage = "Hello"  // 変更不可能

Kotlinで型を明示的に指定するとこう

var message: String = "Hello"

関数定義

Kotlinだと関数の省略形式が多数ありそうだったが、

Java

public int add(int a, int b) {
  return a + b;
}

public void greet(String name) {
  System.out.println("Hello, " + name);
}

Kotlin

fun add(a: Int, b: Int): Int {
  return a + b
}

fun greet(name: String) {
  println("Hello, $name")  // 文字列テンプレート
}

クラス定義

ここは結構差があるところ
JavaだとLombokを使用してgetter/setterを省略したりするところ、
Kotlinだと宣言したプロパティに対するgetter/setterが暗黙的に宣言される。
またクラスの本体がない場合は中括弧も省略可能。

Java

public class Person {
  private String name;
  private int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}

Kotlin

// コンストラクタ、getter、setterが自動生成される
class Person(
  var name: String,
  var age: Int
)

// データクラスを使うと equals()、hashCode()、toString() も自動生成
data class DataPerson(
  var name: String,
  var age: Int
)

アクセス修飾子

Javaとkotlinではデフォルトのアクセス修飾子が異なる

Java

アクセス修飾子 概要
public すべてのクラスからアクセスできる
protected 現在のクラスとサブクラスからアクセスできる
なし(デフォルト) 現在のクラスと同じパッケージのクラスからアクセスできる
private 現在のクラスからだけアクセスできる

Kotlin

アクセス修飾子 概要
public(デフォルト) すべてのクラスからアクセスできる
private 同じファイル内か現在のクラスからだけアクセスできる
protected 主にクラス内とそのサブクラス内からアクセスできるようにする修飾子
トップレベルの宣言(クラス外部の変数や関数)には使えない
internal 同じモジュール内からアクセス可能

HelloWorld

JavaとKotlinの比較でよく目にするやつです。
Kotlinはclassの記載を省略してもよく、その場合Kotlinのコンパイラがファイル名に応じたクラス名を自動で作成してくれるようです。

Java

class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, world.");
  }
}

Kotlin

fun main() {
  println("Hello world")
}

感想

久しぶりにJavaの記法を見て懐かしくなりました。
Kotlinのnull安全性などもっと重要な部分は改めて記事にしたいと思います。

参考

https://kotlinlang.org/docs/home.html

NCDCエンジニアブログ

Discussion