関数とは、呼び出されたときにのみ実行されるコードのブロックです。

関数にはデータ(パラメータ/引数)を渡すことができます。

関数は特定のアクションを実行するために使用され、メソッドとも呼ばれます。

組み込み関数

関数は既にほかの章で使われていたので、なんとなくどんなものかは既におわかりいただけているかもしれません。

例えば、println() は関数です。これはテキストを画面に出力するために使用されます:

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

自分の関数を作成する

自分の関数を作成するには、fun キーワードを使用し、関数の名前を書いた後に括弧 () を続けます:

fun myFunction() {
  println("I just got executed!")
}

関数の呼び出し

関数を作成したら、それを呼び出して実行することができます。

Kotlinで関数を呼び出すには、関数の名前の後に括弧 () を書きます。

以下の例では、myFunction() が呼び出されると、テキスト(アクション)が出力されます:

fun main() {
  myFunction() // myFunctionを呼び出す
}

// 出力: "I just got executed!" 

関数は複数回呼び出すことができます:

fun main() {
  myFunction()
  myFunction()
  myFunction()
}

// 出力:
// I just got executed!
// I just got executed!
// I just got executed! 

関数のパラメータ

関数に情報をパラメータとして渡すことができます。

パラメータは関数名の後、括弧内に指定します。複数のパラメータをカンマで区切って追加できます。ただし、各パラメータの型(Int、String など)を指定する必要があります。

以下の例では、fname という名前の String 型のパラメータを取る関数があります。関数が呼び出されると、名前を渡してフルネームを出力します:

fun myFunction(fname: String) {
  println(fname + " Doe")
}

fun main() {
  myFunction("John")
  myFunction("Jane")
  myFunction("George")
}

// 出力:
// John Doe
// Jane Doe
// George Doe 

パラメータが関数に渡されると、それを引数と呼びます。上記の例では、fname がパラメータであり、John、Jane、George が引数です。

複数のパラメータ

必要に応じて複数のパラメータを指定できます:

fun myFunction(fname: String, age: Int) {
  println(fname + " is " + age)
}

fun main() {
  myFunction("John", 35)
  myFunction("Jane", 32)
  myFunction("George", 15)
}

// 出力:
// John is 35
// Jane is 32
// George is 15 

注意:複数のパラメータを使用する場合、関数呼び出しで引数の数はパラメータの数と同じでなければならず、引数は同じ順序で渡す必要があります。

戻り値

上記の例では、関数を使用して値を出力しました。以下の例では、関数を使用して値を返し、その値を変数に代入します。

値を返すには、return キーワードを使用し、関数の括弧の後に戻り値の型を指定します(この例では Int):

fun myFunction(x: Int): Int {
  return (x + 5)
}

fun main() {
  var result = myFunction(3)
  println(result)
}

// 出力: 8 (3 + 5) 

2つのパラメータを使用する例:

fun myFunction(x: Int, y: Int): Int {
  return (x + y)
}

fun main() {
  var result = myFunction(3, 5)
  println(result)
}

// 出力: 8 (3 + 5) 

戻り値の短縮文法

戻り値を返すための短縮文法もあります。戻り値の型を指定せずに = 演算子を使用することができます。Kotlin は自動的に型を推測します:

fun myFunction(x: Int, y: Int) = x + y

fun main() {
  var result = myFunction(3, 5)
  println(result)
}

// 出力: 8 (3 + 5) 

forループを使用すると、範囲を指定して値を作成することもできます。範囲は「..」を使用して作成します:

for (chars in 'a'..'x') {
  println(chars)
}

数字の範囲も作成できます:

for (nums in 5..15) {
  println(nums)
}

注意:範囲には最初と最後の値が含まれます。

値の存在を確認する

値が範囲に存在するかどうかを確認するには、in 演算子を使用できます:

val nums = arrayOf(2, 4, 6, 8)
if (2 in nums) {
  println("存在します!")
} else {
  println("存在しません。")
}

val cars = arrayOf("Volvo", "BMW", "Ford", "Mazda")
if ("Volvo" in cars) {
  println("存在します!")
} else {
  println("存在しません。")
}

範囲でのブレークまたはコンティニュー

範囲/forループで breakcontinue キーワードを使用することもできます:

for (nums in 5..15) {
  if (nums == 10) {
    break
  }
  println(nums)
}

for (nums in 5..15) {
  if (nums == 10) {
    continue
  }
  println(nums)
}

配列を扱うときに、すべての要素をループ処理する必要があることがよくあります。

配列の要素をループ処理するには、for ループと in 演算子を組み合わせて使用します:

val cars = arrayOf("Volvo", "BMW", "Ford", "Mazda")
for (x in cars) {
  println(x)
}

すべての種類の配列をループ処理することができます。上記の例では文字列の配列を使用しました。

以下の例では、整数の配列をループ処理しています:

val nums = arrayOf(1, 5, 10, 15, 20)
for (x in nums) {
  println(x)
}

従来のforループ

Javaや他のプログラミング言語とは異なり、Kotlinには従来のforループは存在しません。

Kotlinでは、for ループを使用して、配列、範囲、またはカウント可能な値を含む他のものをループ処理します。

配列は、複数の値を1つの変数に格納するために使用されます。各値のために別々の変数を作成する代わりに、配列を使用します。

配列の作成

配列を作成するには、arrayOf() 関数を使用し、その中にカンマ区切りの値を置きます:

val cars = arrayOf("Volvo", "BMW", "Ford", "Mazda")

配列の要素にアクセスする

配列の要素には、インデックス番号を指定してアクセスできます。インデックスは角括弧内に記述します。

この例では、cars 配列の最初の要素の値にアクセスします:

val cars = arrayOf("Volvo", "BMW", "Ford", "Mazda")
println(cars[0])
// Outputs Volvo

注:文字列と同様に、配列のインデックスは0から始まります:[0]が最初の要素、[1]が2番目の要素、などです。

配列の要素を変更する

特定の要素の値を変更するには、インデックス番号を指定します:

cars[0] = "Opel"

val cars = arrayOf("Volvo", "BMW", "Ford", "Mazda")
cars[0] = "Opel"
println(cars[0])
// Now outputs Opel instead of Volvo

配列の長さ / サイズ

配列にいくつの要素が含まれているかを調べるには、size プロパティを使用します:

val cars = arrayOf("Volvo", "BMW", "Ford", "Mazda")
println(cars.size)
// Outputs 4

要素の存在を確認する

in 演算子を使用して、配列に要素が存在するかどうかを確認できます:

val cars = arrayOf("Volvo", "BMW", "Ford", "Mazda")
if ("Volvo" in cars) {
  println("It exists!")
} else {
  println("It does not exist.")
}

配列をループする

配列を扱うときには、すべての要素をループする必要があることがよくあります。for ループを使用して配列の要素をループできます。次の章でさらに詳しく学ぶことができます。

以下の例では、cars 配列のすべての要素を出力します:

val cars = arrayOf("Volvo", "BMW", "Ford", "Mazda")
for (x in cars) {
  println(x)
}

break

breakステートメントは、ループから抜け出すために使用します。

以下の例では、iが4と等しいときにループから抜け出します:

var i = 0
while (i < 10) {
  println(i)
  i++
  if (i == 4) {
    break
  }
}

continue

continueステートメントは、指定された条件が発生した場合に、ループの現在の反復をスキップし、次の反復に進みます。

以下の例では、値が4のときにスキップします:

var i = 0
while (i < 10) {
  if (i == 4) {
    i++
    continue
  }
  println(i)
  i++
}

ループは、指定された条件が満たされている限り、同じコードブロックを複数回実行することができます。

ループは時間を節約し、エラーを減らし、コードをより読みやすくするために便利です。

whileループ

whileループは、指定された条件がtrueの間、コードブロックを繰り返し実行します:

文法

while (condition) {
  // 実行するコードブロック
}

以下の例では、カウンタ変数(i)が5未満である限り、ループ内のコードが繰り返し実行されます:

var i = 0
while (i < 5) {
  println(i)
  i++
}

注意:条件で使用している変数を忘れずに増加させてください。そうしないと、ループは決して終了しません。

do..whileループ

do..whileループは、whileループの変種です。このループは、条件がtrueかどうかをチェックする前に、コードブロックを一度実行し、その後条件がtrueである限りループを繰り返します。

文法

do {
  // 実行するコードブロック
}
while (condition);

以下の例では、do..whileループを使用しています。条件がfalseであっても、コードブロックは条件がテストされる前に一度は必ず実行されます

var i = 0
do {
  println(i)
  i++
}
while (i < 5)

条件で使用している変数を忘れずに増加させてください。そうしないと、ループは決して終了しません!

if..else式を複数個書く代わりに、より読みやすいwhen式を使用できます。

when式は、実行するコードブロックを選択するために使用されます:

曜日の番号を使って、曜日の名前を計算します:

val day = 4

val result = when (day) {
  1 -> "月曜日"
  2 -> "火曜日"
  3 -> "水曜日"
  4 -> "木曜日"
  5 -> "金曜日"
  6 -> "土曜日"
  7 -> "日曜日"
  else -> "無効な日付。"
}
println(result)

// 出力: "木曜日"(dayが4の場合)

when式は、Javaのswitch文に似ています。

動作の説明

上記の例では、dayの値が4なので、「木曜日」が表示されます。

Kotlinでは、数学で使う論理条件をサポートしています:

これらの条件を使って、異なる条件に基づいて異なるアクションを実行できます。

Kotlinには以下の条件分岐があります:

注意: Javaとは異なり、Kotlinではif..elseをステートメントとしても、式としても使用できます(変数に値を代入するための式として)。下のページの例を参照してください。

Kotlin if

条件がtrueの場合に実行されるコードブロックを指定するには、ifを使用します。

文法

if (condition) {
  // 条件がtrueの場合に実行されるコードブロック
}

ifは小文字で書く必要があります。大文字(IfやIF)ではエラーが発生します。

if (20 > 18) {
  println("20は18より大きい")
}

変数をテストすることもできます。

val x = 20
val y = 18
if (x > y) {
  println("xはyより大きい")
}

例の説明

上記の例では、変数xとyを使用して、xがyより大きいかどうかをテストしています(>演算子を使用)。xが20でyが18なので、20が18より大きいことがわかり、「xはyより大きい」と画面に表示します。

Kotlin else

条件がfalseの場合に実行されるコードブロックを指定するには、elseを使用します。

文法

if (condition) {
  // 条件がtrueの場合に実行されるコードブロック
} else {
  // 条件がfalseの場合に実行されるコードブロック
}

val time = 20
if (time < 18) {
  println("こんにちは。")
} else {
  println("こんばんは。")
}
// 出力: "こんばんは。"

例の説明

上記の例では、time(20)が18より大きいため、条件がfalseになります。したがって、else条件に進み、”こんばんは”と画面に表示します。もしtimeが18未満だった場合、プログラムは”こんにちは”と表示します。

Kotlin else if

最初の条件がfalseの場合に、新しい条件を指定するにはelse ifを使用します。

文法

if (condition1) {
  // condition1がtrueの場合に実行されるコードブロック
} else if (condition2) {
  // condition1がfalseでcondition2がtrueの場合に実行されるコードブロック
} else {
  // condition1とcondition2の両方がfalseの場合に実行されるコードブロック
}

val time = 22
if (time < 10) {
  println("おはようございます。")
} else if (time < 20) {
  println("こんにちは。")
} else {
  println("こんばんは。")
}
// 出力: "こんばんは。"

例の説明

上記の例では、time(22)が10より大きいため、最初の条件はfalseです。次のelse if文の条件もfalseなので、else条件に進み、”こんばんは”と画面に表示します。ただし、もしtimeが14だった場合、プログラムは”こんにちは”と表示します。

Kotlinのif..else式

Kotlinでは、if..elseステートメントを式として使用することもできます(変数に値を代入して返す):

val time = 20
val greeting = if (time < 18) {
  "こんにちは。"
} else {
  "こんばんは。"
}
println(greeting)

ifを式として使用する場合は、elseも含める必要があります(必須)。

注意

ifに1つの文しかない場合は、中括弧{}を省略できます。

fun main() {
  val time = 20
  val greeting = if (time < 18) "こんにちは。" else "こんばんは。"
  println(greeting)
}

この例は、Javaの「三項演算子」(短縮形のif…else)と似ています。

プログラミングでは、2つの値のいずれかを持つデータ型が必要になることがよくあります。例えば:

Kotlinでは、ブーリアン型を使用して、trueまたはfalseの値を取ることができます。

ブーリアンの値

ブーリアン型はBooleanキーワードを使って宣言でき、値としてはtrueまたはfalseのみを取ることができます。

val isKotlinFun: Boolean = true
val isFishTasty: Boolean = false
println(isKotlinFun)   // 出力: true
println(isFishTasty)   // 出力: false

前の章で学んだ他のデータ型と同様に、上記の例も型を指定せずに書くことができます。Kotlinは変数がブーリアンであることを理解します。

val isKotlinFun = true
val isFishTasty = false
println(isKotlinFun)   // 出力: true
println(isFishTasty)   // 出力: false

ブーリアン式

ブーリアン式は、trueまたはfalseのブーリアン値を返します。

比較演算子を使用して、式(または変数)がtrueかどうかを調べることができます。例えば、greater than(>)演算子を使用して、次のように確認できます。

val x = 10
val y = 9
println(x > y) // 出力: true、10は9より大きい

さらに簡単に書くこともできます。

println(10 > 9) // 出力: true、10は9より大きい

以下の例では、equal to(==)演算子を使用して式を評価します。

val x = 10
println(x == 10) // 出力: true、xの値は10に等しい

println(10 == 15) // 出力: false、10は15に等しくない

ブーリアン式の値は、すべてのKotlinの比較や条件の基礎となります。

文字列はテキストを格納するために使用されます。

文字列はダブルクォーテーションで囲まれた文字の集まりです。

var greeting = "Hello"

Javaとは異なり、変数が文字列であることを指定する必要はありません。Kotlinはダブルクォーテーションのおかげで、上記の例でのgreeting変数が文字列であると理解します。

ただし、他のデータ型と同様に、指定したい場合は型を明示することもできます。

var greeting: String = "Hello"

注意:値を後から代入したい場合は、変数を宣言する際に型を指定する必要があります。

var name: String
name = "John"
println(name)

これは問題なく動作します。

var name
name = "John"
println(name)

これはエラーを生成します。

文字列へのアクセス

文字列の文字(要素)にアクセスするには、角括弧内のインデックス番号を参照する必要があります。

文字列のインデックスは0から始まります。以下の例では、txtの最初と3番目の要素にアクセスしています。

var txt = "Hello World"
println(txt[0]) // 最初の要素 (H)
println(txt[2]) // 3番目の要素 (l)
[0]は最初の要素、[1]は2番目の要素、[2]は3番目の要素です。

文字列の長さ

Kotlinの文字列はオブジェクトで、特定の文字列変数の後にドット(.)を記述することで、プロパティや関数を利用して文字列に対する操作を行うことができます。例えば、文字列の長さはlengthプロパティで取得できます。

var txt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
println("文字列txtの長さは: " + txt.length)

文字列の関数

文字列には多くの関数があります。例えば、toUpperCase()toLowerCase()があります。

var txt = "Hello World"
println(txt.toUpperCase())   // 出力: "HELLO WORLD"
println(txt.toLowerCase())   // 出力: "hello world"

文字列の比較

compareTo(string)関数は2つの文字列を比較し、両方が等しい場合は0を返します。

var txt1 = "Hello World"
var txt2 = "Hello World"
println(txt1.compareTo(txt2))  // 出力: 0(等しい)

文字列内の文字列を検索

indexOf()関数は文字列内で指定されたテキストの最初の出現位置(インデックス)を返します(空白も含む)。

var txt = "Please locate where 'locate' occurs!"
println(txt.indexOf("locate"))  // 出力: 7

Kotlinは位置をゼロからカウントします。

0が最初の位置、1が2番目の位置、2が3番目の位置です。

文字列内の引用符

文字列内で引用符を使用するには、単一引用符(’)を使用します。

var txt1 = "It's alright"
var txt2 = "That's great"

文字列の連結

文字列同士を加算するために+演算子を使用できます。これを文字列の連結と呼びます。

var firstName = "John"
var lastName = "Doe"
println(firstName + " " + lastName)

ここではfirstNamelastNameの間に空のテキスト(” “)を追加してスペースを作っています。

また、plus()関数を使用して2つの文字列を連結することもできます。

var firstName = "John "
var lastName = "Doe"
println(firstName.plus(lastName))

文字列テンプレート/補間

連結の代わりに、「文字列テンプレート」を使用することもできます。これは文字列内に変数や式を簡単に追加する方法です。

変数を参照するには、$シンボルを使用します。

var firstName = "John"
var lastName = "Doe"
println("私の名前は $firstName $lastName です")

「文字列テンプレート」はKotlinの人気機能で、コード量を減らすことができます。例えば、連結の例のようにfirstNamelastNameの間に空白を指定する必要がありません。