「Androidアプリを作ってみたい!」
「モダンなプログラミング言語を学びたい!」
そんな思いを持っている方におすすめなのがKotlin(コトリン)です。
Kotlinは、こんな特徴を持つ素晴らしい言語です:
- Androidアプリ開発の公式言語(Googleが推奨)
- Javaとの互換性が高い(既存のJavaコードも使える)
- 安全で読みやすい(バグが起きにくい設計)
- 書くコードが少なくて済む(シンプルで効率的)
「でも、プログラミング言語って難しそう…」と思うかもしれませんが、Kotlinは初心者にもやさしい言語です。
この記事では、「プログラミング初めて」という方でも、Kotlinの基本構文がしっかり理解できるように、身近な例を使って一つずつ丁寧に説明します。
Kotlinって何?なぜ人気なの?

Kotlinをわかりやすく説明すると
Kotlinは、2011年にJetBrains社が開発したプログラミング言語です。
名前の由来は、ロシアのコトリン島からきています。
身近な例で考えてみましょう:
- 日本語と英語 → どちらも同じことを表現できるが、文法や表現方法が違う
- JavaとKotlin → どちらも同じプログラムを作れるが、書き方がより簡単
なぜKotlinが注目されているの?
1. Androidアプリ開発の公式言語
2019年にGoogleが「Android開発はKotlinを優先する」と発表しました。
つまり、Android開発者にとって必須の言語になっています。
2. 安全性が高い
「NullPointerException」という厄介なエラーが起きにくい設計になっています。
3. 書きやすい、読みやすい
同じ機能をJavaで書くより、コードが短くてすっきりします。
4. 学習しやすい
Javaの知識があれば移行しやすく、初心者でも理解しやすい構文です。
Kotlinで何ができるの?
- Androidアプリ開発:スマホアプリ作成
- Webアプリ開発:サーバーサイド開発
- デスクトップアプリ:PC用アプリ開発
- マルチプラットフォーム開発:iOS/Android両対応アプリ
Kotlinの魅力がわかったところで、実際にコードを書いてみましょう。
変数:データを保存する箱を作ろう
変数って何?
変数とは、「データを保存しておく箱」のようなものです。
身近な例で考えてみましょう:
- 名札 → 「田中太郎」という名前を覚えておく
- 貯金箱 → お金の金額を覚えておく
- 変数 → 文字や数字を覚えておく
Kotlinの変数:valとvar
Kotlinには2つの変数の種類があります:
val name = "田中花子" // val:変更できない変数
var age = 25 // var:変更できる変数
valとvarの違い:
val
(value:値)→ 一度決めたら変更不可(不変)var
(variable:変数)→ 後から変更可能(可変)
実際に使ってみよう
fun main() {
// val:変更できない変数
val name = "田中花子"
val schoolName = "〇〇高校"
// var:変更できる変数
var age = 16
var grade = 1
println("名前: $name")
println("学校: $schoolName")
println("年齢: $age歳")
println("学年: $grade年生")
// 年齢と学年を変更してみる
age = 17
grade = 2
println("\n1年後...")
println("年齢: $age歳")
println("学年: $grade年生")
// nameを変更しようとするとエラー!
// name = "佐藤花子" // これはエラーになる
}
実行結果:
名前: 田中花子
学校: ○○高校
年齢: 16歳
学年: 1年生
1年後...
年齢: 17歳
学年: 2年生
データ型を明示することもできる
fun main() {
// 型を明示した書き方
val name: String = "山田太郎" // 文字列型
var age: Int = 20 // 整数型
var height: Double = 170.5 // 小数型
var isStudent: Boolean = true // 真偽値型
println("名前: $name")
println("年齢: $age")
println("身長: $height cm")
println("学生ですか: $isStudent")
}
主要なデータ型:
String
:文字列(”こんにちは”)Int
:整数(1, 2, 3)Double
:小数(3.14, 170.5)Boolean
:真偽値(true, false)
どちらを使うべき?
val を使う場面:
- 名前、生年月日など、変わらない情報
- 設定値、定数など
var を使う場面:
- 年齢、体重など、変わる可能性がある情報
- カウンターやスコアなど
基本的にはvalを使って、必要な時だけvarを使うのがKotlinの推奨スタイルです。
変数の使い方がわかったら、次はプログラムに「判断」をさせる条件分岐を学んでみましょう。
条件分岐:プログラムに判断させよう

if文:もしも〜なら
if文は、「もし条件が当てはまるなら、この処理をする」という命令です。
身近な例で考えてみましょう:
- 「もし雨が降っているなら、傘を持って行く」
- 「もしテストが80点以上なら、ゲームをしても良い」
- 「もし年齢が18歳以上なら、大人料金」
基本的なif文の書き方
fun main() {
val age = 20
if (age >= 18) {
println("あなたは大人です")
} else {
println("あなたは未成年です")
}
}
実行結果:
あなたは大人です
より詳細な条件分岐
fun main() {
val score = 85
if (score >= 90) {
println("優秀!素晴らしい成績です")
} else if (score >= 80) {
println("良好!よく頑張りました")
} else if (score >= 60) {
println("合格!次回はもう少し頑張りましょう")
} else {
println("不合格!復習してもう一度チャレンジ")
}
}
実行結果:
良好!よく頑張りました
when式:Kotlinの便利な分岐
when
は、Kotlinの特徴的な機能の一つです。複数の条件を分かりやすく書けます:
fun main() {
val grade = 'B'
when (grade) {
'A' -> println("優秀な成績です!")
'B' -> println("良い成績ですね")
'C' -> println("普通の成績です")
'D' -> println("もう少し頑張りましょう")
'F' -> println("再試験が必要です")
else -> println("無効な評価です")
}
}
実行結果:
良い成績ですね
when式のいろんな使い方
範囲を指定する:
fun main() {
val age = 25
when (age) {
0 -> println("赤ちゃん")
in 1..5 -> println("幼児")
in 6..12 -> println("小学生")
in 13..15 -> println("中学生")
in 16..18 -> println("高校生")
in 19..22 -> println("大学生")
in 23..64 -> println("社会人")
else -> println("シニア")
}
}
実行結果:
社会人
複数の値をまとめて指定:
fun main() {
val month = 7
when (month) {
12, 1, 2 -> println("冬")
3, 4, 5 -> println("春")
6, 7, 8 -> println("夏")
9, 10, 11 -> println("秋")
else -> println("無効な月です")
}
}
実行結果:
夏
実用的な例:成績判定システム
fun main() {
val studentName = "田中太郎"
val score = 78
println("=== 成績判定結果 ===")
println("生徒名: $studentName")
println("点数: $score点")
// 合格判定
val result = if (score >= 60) "合格" else "不合格"
println("判定: $result")
// 詳細評価
val evaluation = when {
score >= 90 -> "S評価(素晴らしい!)"
score >= 80 -> "A評価(優秀)"
score >= 70 -> "B評価(良好)"
score >= 60 -> "C評価(合格)"
else -> "D評価(不合格)"
}
println("評価: $evaluation")
// アドバイス
when {
score >= 80 -> println("この調子で頑張り続けてください!")
score >= 60 -> println("合格ですが、さらなる向上を目指しましょう")
else -> println("復習して再チャレンジしてください")
}
}
実行結果:
=== 成績判定結果 ===
生徒名: 田中太郎
点数: 78点
判定: 合格
評価: B評価(良好)
合格ですが、さらなる向上を目指しましょう
条件分岐がわかったら、次は同じ処理を何度も繰り返すループ処理を学んでみましょう。
ループ処理:同じことを繰り返させよう
なぜループが必要?
例:1から10まで数える
ループを使わない場合:
println(1)
println(2)
println(3)
println(4)
println(5)
println(6)
println(7)
println(8)
println(9)
println(10)
これは効率が悪いですよね。もし1から1000まで数えるとしたら、1000行も書く必要があります!
for文:決まった回数繰り返す
基本的な使い方:
fun main() {
println("1から10まで数えます:")
for (i in 1..10) {
println(i)
}
}
実行結果:
1から10まで数えます:
1
2
3
4
5
6
7
8
9
10
範囲の指定方法
fun main() {
// 1から5まで(1..5)
println("1から5まで:")
for (i in 1..5) {
print("$i ")
}
println()
// 1から5未満(1 until 5)
println("1から5未満:")
for (i in 1 until 5) {
print("$i ")
}
println()
// 逆順(5から1まで)
println("5から1まで:")
for (i in 5 downTo 1) {
print("$i ")
}
println()
// 2つずつ増加
println("1から10まで2つずつ:")
for (i in 1..10 step 2) {
print("$i ")
}
println()
}
実行結果:
1から5まで:
1 2 3 4 5
1から5未満:
1 2 3 4
5から1まで:
5 4 3 2 1
1から10まで2つずつ:
1 3 5 7 9
リストやコレクションのループ
fun main() {
val fruits = listOf("りんご", "バナナ", "みかん", "ぶどう")
println("果物一覧:")
for (fruit in fruits) {
println("- $fruit")
}
println("\n番号付き果物一覧:")
for ((index, fruit) in fruits.withIndex()) {
println("${index + 1}. $fruit")
}
}
実行結果:
果物一覧:
- りんご
- バナナ
- みかん
- ぶどう
番号付き果物一覧:
1. りんご
2. バナナ
3. みかん
4. ぶどう
while文:条件が成り立つ間繰り返す
fun main() {
var count = 1
println("カウントアップ:")
while (count <= 5) {
println("カウント: $count")
count++ // count = count + 1 と同じ
}
println("カウントダウン:")
var countdown = 5
while (countdown > 0) {
println("あと ${countdown}秒")
countdown-- // countdown = countdown - 1 と同じ
}
println("スタート!")
}
実行結果:
カウントアップ:
カウント: 1
カウント: 2
カウント: 3
カウント: 4
カウント: 5
カウントダウン:
あと 5秒
あと 4秒
あと 3秒
あと 2秒
あと 1秒
スタート!
repeat文:指定回数だけ繰り返す
fun main() {
println("repeat文の例:")
repeat(3) {
println("こんにちは!")
}
println("\n回数付きrepeat:")
repeat(5) { index ->
println("${index + 1}回目の実行")
}
}
実行結果:
repeat文の例:
こんにちは!
こんにちは!
こんにちは!
回数付きrepeat:
1回目の実行
2回目の実行
3回目の実行
4回目の実行
5回目の実行
実用的な例:九九の表
fun main() {
println("=== 九九の表 ===")
// ヘッダー行を表示
print(" ")
for (j in 1..9) {
print("%4d".format(j))
}
println()
// 区切り線
print(" ")
repeat(9) { print("----") }
println()
// 九九の計算
for (i in 1..9) {
print("$i |")
for (j in 1..9) {
print("%4d".format(i * j))
}
println()
}
}
実行結果:
=== 九九の表 ===
1 2 3 4 5 6 7 8 9
------------------------------------
1 | 1 2 3 4 5 6 7 8 9
2 | 2 4 6 8 10 12 14 16 18
3 | 3 6 9 12 15 18 21 24 27
4 | 4 8 12 16 20 24 28 32 36
5 | 5 10 15 20 25 30 35 40 45
6 | 6 12 18 24 30 36 42 48 54
7 | 7 14 21 28 35 42 49 56 63
8 | 8 16 24 32 40 48 56 64 72
9 | 9 18 27 36 45 54 63 72 81
ループ処理がわかったら、次はコードを整理して再利用しやすくする関数について学んでみましょう。
関数:コードをまとめて再利用しよう

関数って何?
関数とは、「特定の処理をまとめて名前をつけたもの」です。
身近な例で考えてみましょう:
- 電子レンジの「温めボタン」→ 複雑な温度調整を1つのボタンで実行
- 自動販売機のボタン → お金を入れて商品を取り出す一連の処理
- 関数 → 複雑な処理を簡単な名前で呼び出し
基本的な関数の書き方
fun 関数名(引数: 型): 戻り値の型 {
// 処理内容
return 戻り値
}
実際の例:
fun greet(name: String): String {
return "こんにちは、${name}さん!"
}
fun main() {
val message = greet("田中")
println(message)
println(greet("佐藤"))
println(greet("山田"))
}
実行結果:
こんにちは、田中さん!
こんにちは、佐藤さん!
こんにちは、山田さん!
いろんなパターンの関数
引数なしの関数:
fun sayHello() {
println("こんにちは!")
}
fun getCurrentTime(): String {
return "現在時刻: 14:30"
}
fun main() {
sayHello()
println(getCurrentTime())
}
戻り値なしの関数:
fun printUserInfo(name: String, age: Int) {
println("名前: $name")
println("年齢: $age歳")
println("---")
}
fun main() {
printUserInfo("田中太郎", 20)
printUserInfo("佐藤花子", 25)
}
実行結果:
名前: 田中太郎
年齢: 20歳
---
名前: 佐藤花子
年齢: 25歳
---
デフォルト引数
引数にデフォルト値を設定できます:
fun introduce(name: String, age: Int = 20, city: String = "東京") {
println("私は$name、${age}歳、${city}出身です")
}
fun main() {
introduce("田中") // デフォルト値を使用
introduce("佐藤", 25) // 年齢だけ指定
introduce("山田", 30, "大阪") // すべて指定
introduce("鈴木", city = "名古屋") // 名前付き引数で指定
}
実行結果:
私は田中、20歳、東京出身です
私は佐藤、25歳、東京出身です
私は山田、30歳、大阪出身です
私は鈴木、20歳、名古屋出身です
単一式関数
簡単な関数は1行で書くことができます:
fun add(a: Int, b: Int): Int = a + b
fun multiply(a: Int, b: Int) = a * b // 戻り値の型は自動推定
fun isAdult(age: Int) = age >= 18
fun getGrade(score: Int) = when {
score >= 90 -> "A"
score >= 80 -> "B"
score >= 70 -> "C"
score >= 60 -> "D"
else -> "F"
}
fun main() {
println("5 + 3 = ${add(5, 3)}")
println("4 × 7 = ${multiply(4, 7)}")
println("17歳は大人? ${isAdult(17)}")
println("85点の評価: ${getGrade(85)}")
}
実行結果:
5 + 3 = 8
4 × 7 = 28
17歳は大人? false
85点の評価: B
実用的な例:計算機能
fun calculate(operation: String, a: Double, b: Double): Double {
return when (operation) {
"+" -> a + b
"-" -> a - b
"*" -> a * b
"/" -> if (b != 0.0) a / b else 0.0
else -> 0.0
}
}
fun formatResult(operation: String, a: Double, b: Double, result: Double): String {
return "$a $operation $b = $result"
}
fun main() {
val num1 = 10.0
val num2 = 3.0
val operations = listOf("+", "-", "*", "/")
println("=== 計算結果 ===")
for (op in operations) {
val result = calculate(op, num1, num2)
println(formatResult(op, num1, num2, result))
}
}
実行結果:
=== 計算結果 ===
10.0 + 3.0 = 13.0
10.0 - 3.0 = 7.0
10.0 * 3.0 = 30.0
10.0 / 3.0 = 3.3333333333333335
関数の使い方がわかったら、最後にKotlinの重要な概念であるクラスとオブジェクトについて学んでみましょう。
クラスとオブジェクト:データと機能をまとめよう
クラスって何?
クラスとは、「関連するデータと機能をまとめた設計図」のようなものです。
身近な例で考えてみましょう:
- 車の設計図 → 実際の車を作るための仕様
- 建物の設計図 → 実際の建物を建てるための仕様
- クラス → 実際のオブジェクト(インスタンス)を作るための仕様
基本的なクラスの書き方
class Person(val name: String, var age: Int) {
fun introduce() {
println("私は$name、${age}歳です")
}
fun birthday() {
age++
println("誕生日おめでとう!${age}歳になりました")
}
}
fun main() {
// オブジェクト(インスタンス)を作成
val person1 = Person("田中太郎", 20)
val person2 = Person("佐藤花子", 25)
// メソッドを呼び出し
person1.introduce()
person2.introduce()
// 誕生日を迎える
person1.birthday()
person1.introduce()
}
実行結果:
私は田中太郎、20歳です
私は佐藤花子、25歳です
誕生日おめでとう!21歳になりました
私は田中太郎、21歳です
より詳細なクラスの例
class Student(
val name: String,
val id: String,
var grade: Int,
var gpa: Double = 0.0
) {
// プロパティ
private val subjects = mutableListOf<String>()
private val scores = mutableListOf<Int>()
// メソッド:科目を追加
fun addSubject(subject: String) {
subjects.add(subject)
println("科目「$subject」を追加しました")
}
// メソッド:成績を追加
fun addScore(subject: String, score: Int) {
if (subject in subjects) {
scores.add(score)
updateGPA()
println("$subject: ${score}点を記録しました")
} else {
println("エラー: 科目「$subject」が見つかりません")
}
}
// プライベートメソッド:GPA計算
private fun updateGPA() {
if (scores.isNotEmpty()) {
gpa = scores.average()
}
}
// メソッド:学生情報を表示
fun showInfo() {
println("=== 学生情報 ===")
println("氏名: $name")
println("学籍番号: $id")
println("学年: ${grade}年")
println("GPA: %.2f".format(gpa))
if (subjects.isNotEmpty()) {
println("履修科目:
- 数学: 85点
- 英語: 78点
- 物理: 92点
================
データクラス:データを保存するためのクラス
Kotlinには、データを保存することが主目的のクラスを簡単に作れる機能があります:
data class Book(
val title: String,
val author: String,
val year: Int,
val price: Double
)
fun main() {
// 本のオブジェクトを作成
val book1 = Book("Kotlinプログラミング", "田中著", 2024, 2980.0)
val book2 = Book("Android開発入門", "佐藤著", 2023, 3200.0)
// データクラスは自動的にtoString()が生成される
println("本1: $book1")
println("本2: $book2")
// プロパティにアクセス
println("\n詳細情報:")
println("タイトル: ${book1.title}")
println("著者: ${book1.author}")
println("出版年: ${book1.year}")
println("価格: ¥${book1.price}")
// データクラスは自動的にequals()が生成される
val book3 = Book("Kotlinプログラミング", "田中著", 2024, 2980.0)
println("\nbook1とbook3は同じ? ${book1 == book3}") // true
// copy()メソッドで一部だけ変更したコピーを作成
val updatedBook = book1.copy(price = 2500.0)
println("価格変更後: $updatedBook")
}
実行結果:
本1: Book(title=Kotlinプログラミング, author=田中著, year=2024, price=2980.0)
本2: Book(title=Android開発入門, author=佐藤著, year=2023, price=3200.0)
詳細情報:
タイトル: Kotlinプログラミング
著者: 田中著
出版年: 2024
価格: ¥2980.0
book1とbook3は同じ? true
価格変更後: Book(title=Kotlinプログラミング, author=田中著, year=2024, price=2500.0)
実用的な例:簡単な銀行口座システム
class BankAccount(
val accountNumber: String,
val ownerName: String,
private var balance: Double = 0.0
) {
// 残高確認
fun getBalance(): Double = balance
// 入金
fun deposit(amount: Double) {
if (amount > 0) {
balance += amount
println("¥$amount を入金しました。残高: ¥$balance")
} else {
println("エラー: 入金額は0より大きい必要があります")
}
}
// 出金
fun withdraw(amount: Double) {
when {
amount <= 0 -> println("エラー: 出金額は0より大きい必要があります")
amount > balance -> println("エラー: 残高不足です(残高: ¥$balance)")
else -> {
balance -= amount
println("¥$amount を出金しました。残高: ¥$balance")
}
}
}
// 振込
fun transfer(targetAccount: BankAccount, amount: Double) {
if (amount > 0 && amount <= balance) {
this.withdraw(amount)
targetAccount.deposit(amount)
println("${targetAccount.ownerName}様への振込が完了しました")
} else {
println("振込に失敗しました")
}
}
// 口座情報表示
fun showAccountInfo() {
println("=== 口座情報 ===")
println("口座番号: $accountNumber")
println("名義人: $ownerName")
println("残高: ¥$balance")
println("===============")
}
}
fun main() {
// 口座を作成
val account1 = BankAccount("001-1234567", "田中太郎", 10000.0)
val account2 = BankAccount("002-7654321", "佐藤花子", 5000.0)
// 初期状態を表示
println("=== 初期状態 ===")
account1.showAccountInfo()
account2.showAccountInfo()
println("\n=== 取引開始 ===")
// 田中さんが入金
account1.deposit(2000.0)
// 田中さんが出金
account1.withdraw(1500.0)
// 田中さんから佐藤さんへ振込
account1.transfer(account2, 3000.0)
println("\n=== 取引後の状態 ===")
account1.showAccountInfo()
account2.showAccountInfo()
// エラーケースのテスト
println("\n=== エラーケースのテスト ===")
account1.withdraw(20000.0) // 残高不足
account1.deposit(-1000.0) // 負の値
}
実行結果:
=== 初期状態 ===
=== 口座情報 ===
口座番号: 001-1234567
名義人: 田中太郎
残高: ¥10000.0
===============
=== 口座情報 ===
口座番号: 002-7654321
名義人: 佐藤花子
残高: ¥5000.0
===============
=== 取引開始 ===
¥2000.0 を入金しました。残高: ¥12000.0
¥1500.0 を出金しました。残高: ¥10500.0
¥3000.0 を出金しました。残高: ¥7500.0
¥3000.0 を入金しました。残高: ¥8000.0
佐藤花子様への振込が完了しました
=== 取引後の状態 ===
=== 口座情報 ===
口座番号: 001-1234567
名義人: 田中太郎
残高: ¥7500.0
===============
=== 口座情報 ===
口座番号: 002-7654321
名義人: 佐藤花子
残高: ¥8000.0
===============
=== エラーケースのテスト ===
エラー: 残高不足です(残高: ¥7500.0)
エラー: 入金額は0より大きい必要があります
オブジェクト指向の基本概念
カプセル化:
class Counter {
private var count = 0 // private:外部から直接変更できない
fun increment() { count++ } // 公開されたメソッドで操作
fun decrement() { count-- }
fun getCount() = count // 読み取り専用アクセス
}
fun main() {
val counter = Counter()
// counter.count = 100 // エラー!privateなので直接変更不可
counter.increment()
counter.increment()
println("カウント: ${counter.getCount()}") // 2
counter.decrement()
println("カウント: ${counter.getCount()}") // 1
}
継承:
// 基本クラス
open class Animal(val name: String) {
open fun makeSound() {
println("$name が何かの音を出しています")
}
fun sleep() {
println("$name が眠っています")
}
}
// 継承クラス
class Dog(name: String) : Animal(name) {
override fun makeSound() {
println("$name がワンワンと鳴いています")
}
fun fetch() {
println("$name がボールを取ってきました")
}
}
class Cat(name: String) : Animal(name) {
override fun makeSound() {
println("$name がニャーニャーと鳴いています")
}
fun scratch() {
println("$name が爪とぎをしています")
}
}
fun main() {
val dog = Dog("ポチ")
val cat = Cat("タマ")
// 共通メソッド
dog.makeSound() // 犬特有の鳴き声
cat.makeSound() // 猫特有の鳴き声
dog.sleep() // 基本クラスのメソッド
cat.sleep() // 基本クラスのメソッド
// 固有メソッド
dog.fetch() // 犬だけのメソッド
cat.scratch() // 猫だけのメソッド
}
実行結果:
ポチ がワンワンと鳴いています
タマ がニャーニャーと鳴いています
ポチ が眠っています
タマ が眠っています
ポチ がボールを取ってきました
タマ が爪とぎをしています
まとめ

Kotlinの基本構文について、初心者の方でも理解できるように詳しく解説しました。
この記事で学んだこと:
変数の宣言:
val
:変更不可能な変数(推奨)var
:変更可能な変数- 型の自動推定と明示指定
条件分岐:
if
文による基本的な分岐when
式による柔軟で読みやすい分岐- 範囲指定や複数値の指定
ループ処理:
for
文による範囲やコレクションの反復while
文による条件付き反復repeat
文による指定回数の反復
関数:
fun
キーワードによる関数定義- デフォルト引数と名前付き引数
- 単一式関数による簡潔な記述
クラスとオブジェクト:
- クラスによるデータと機能のカプセル化
- データクラスによるデータ構造の定義
- 継承による機能の拡張
Kotlinの特徴:
- 安全性:Null安全、型安全
- 簡潔性:少ないコードで多くを表現
- 互換性:Javaとの相互運用
- 表現力:柔軟で読みやすい構文
覚えておきたい基本パターン:
// 変数宣言
val name = "田中" // 不変
var age = 20 // 可変
// 条件分岐
if (age >= 18) {
println("大人")
} else {
println("未成年")
}
// 関数定義
fun greet(name: String) = "こんにちは、${name}さん"
// クラス定義
class Person(val name: String, var age: Int) {
fun introduce() = "私は$name、${age}歳です"
}
コメント