関数とは、呼び出されたときにのみ実行されるコードのブロックです。
関数にはデータ(パラメータ/引数)を渡すことができます。
関数は特定のアクションを実行するために使用され、メソッドとも呼ばれます。
関数は既にほかの章で使われていたので、なんとなくどんなものかは既におわかりいただけているかもしれません。
例えば、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ループで break
や continue
キーワードを使用することもできます:
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)
}
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
ステートメントは、ループから抜け出すために使用します。
以下の例では、i
が4と等しいときにループから抜け出します:
var i = 0
while (i < 10) {
println(i)
i++
if (i == 4) {
break
}
}
continue
ステートメントは、指定された条件が発生した場合に、ループの現在の反復をスキップし、次の反復に進みます。
以下の例では、値が4のときにスキップします:
var i = 0
while (i < 10) {
if (i == 4) {
i++
continue
}
println(i)
i++
}
ループは、指定された条件が満たされている限り、同じコードブロックを複数回実行することができます。
ループは時間を節約し、エラーを減らし、コードをより読みやすくするために便利です。
while
ループは、指定された条件がtrueの間、コードブロックを繰り返し実行します:
while (condition) {
// 実行するコードブロック
}
以下の例では、カウンタ変数(i
)が5未満である限り、ループ内のコードが繰り返し実行されます:
var i = 0
while (i < 5) {
println(i)
i++
}
注意:条件で使用している変数を忘れずに増加させてください。そうしないと、ループは決して終了しません。
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
文に似ています。
when
変数(この例ではday
)が一度評価されます。day
変数の値が各「ブランチ」の値と比較されます。else
を使用して実行するコードを指定します。上記の例では、day
の値が4なので、「木曜日」が表示されます。
Kotlinでは、数学で使う論理条件をサポートしています:
これらの条件を使って、異なる条件に基づいて異なるアクションを実行できます。
Kotlinには以下の条件分岐があります:
if
を使用して、指定された条件がtrueの場合に実行されるコードブロックを指定するelse
を使用して、同じ条件がfalseの場合に実行されるコードブロックを指定するelse if
を使用して、最初の条件がfalseの場合にテストする新しい条件を指定するwhen
を使用して、複数の代替コードブロックを指定する注意: Javaとは異なり、Kotlinではif..elseをステートメントとしても、式としても使用できます(変数に値を代入するための式として)。下のページの例を参照してください。
条件が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より大きい」と画面に表示します。
条件がfalseの場合に実行されるコードブロックを指定するには、else
を使用します。
if (condition) {
// 条件がtrueの場合に実行されるコードブロック
} else {
// 条件がfalseの場合に実行されるコードブロック
}
val time = 20
if (time < 18) {
println("こんにちは。")
} else {
println("こんばんは。")
}
// 出力: "こんばんは。"
上記の例では、time(20)が18より大きいため、条件がfalseになります。したがって、else条件に進み、”こんばんは”と画面に表示します。もしtimeが18未満だった場合、プログラムは”こんにちは”と表示します。
最初の条件が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ステートメントを式として使用することもできます(変数に値を代入して返す):
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)
ここではfirstName
とlastName
の間に空のテキスト(” “)を追加してスペースを作っています。
また、plus()
関数を使用して2つの文字列を連結することもできます。
var firstName = "John "
var lastName = "Doe"
println(firstName.plus(lastName))
連結の代わりに、「文字列テンプレート」を使用することもできます。これは文字列内に変数や式を簡単に追加する方法です。
変数を参照するには、$
シンボルを使用します。
var firstName = "John"
var lastName = "Doe"
println("私の名前は $firstName $lastName です")
「文字列テンプレート」はKotlinの人気機能で、コード量を減らすことができます。例えば、連結の例のようにfirstName
とlastName
の間に空白を指定する必要がありません。