【Kotlin】レッスン5-1:クラスの定義と使い方を基礎から学ぼう

ながみえ

一つ前の章ではKotlinのコレクションについて学習しました。

今回からは オブジェクト指向 について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数編
Lesson4:コレクション編
Lesson5:オブジェクト指向編

 ・Lesson5-1:クラスの基本を理解しよう ◁今回はココ
 ・Lesson5-2:プライマリコンストラクタを理解しよう
 ・Lesson5-3:セカンダリコンストラクタを理解しよう
 ・Lesson5-4:ふたつのコンストラクタを使いこなそう
 ・Lesson5-5:アクセス修飾子とカプセル化を理解しよう
 ・Lesson5-6:静的メンバとインスタンスメンバを理解しよう
 ・Lesson5-7:クラスの継承を理解しよう
 ・Lesson5-8:メソッドのオーバーライドを理解しよう
 ・Lesson5-9:クラスを拡張しよう
 ・Lesson5-10:抽象クラスを理解しよう
 ・Lesson5-11:インターフェースを理解しよう
 ・Lesson5-12:データクラスを理解しよう
 ・確認問題5-☆1:モンスター捕獲ゲームを作ろう
 ・確認問題5-☆2:マルバツゲームを作ろう
 ・確認問題5-☆3:石取りゲームを作ろう

<<前のページ

学習記事一覧

次のページ>>

クラスの使い方|定義からインスタンス化まで徹底解説

「クラス」はオブジェクト指向プログラムの中核をなす重要な概念です。

本記事では、ラスの基本的な定義方法やインスタンス化について、初心者向けに解説します。

クラスとは何か?|基本概念と定義方法

クラスとはプロパティ(データ)メソッド(動作)をまとめた「設計図」のようなものです。

Kotlinでクラスを定義する際には classキーワード を使います。

以下に基本的な構文を示します。

class クラス名 {
    // ここにプロパティ(データ)を定義
    // ここにメソッド(動作)を定義
}

実際にクラスを定義する例を見てみましょう。

class User {					// Userという名前のクラスを定義
    var name: String = "Alice"	// 変数(プロパティ)の宣言
    var age: Int = 25			// 変数(プロパティ)の宣言

    fun displayInfo() {			// displayInfoという名前のメソッドを定義
        println("Name: $name, Age: $age") // このメソッドの処理内容
    }
}

このように、クラスの中にプロパティとメソッド(データと動作)をまとめています。

参考資料

メソッドとは、関数と非常によく似た概念ですが、重要な違いがあります。

関数(Function)はプログラムのどこからでも呼び出せる「独立した処理」の単位です。Kotlinではfunキーワードを使って定義します。

そしてメソッド(Method)とはクラスの中に定義された「関数」のことを指します。

メソッドはクラスと紐付いており、「そのクラスの機能」を意味します。

インスタンスとは何か?|生成方法と使い方

クラスの定義方法を紹介しましたが、クラスとはあくまでも設計図であり、実際に動作はしません。

動作させるためには、この設計図を使って インスタンス を生成する必要があります。

クラス = データや動作を書いた設計図。クラス自体は動作しない。
インスタンス = クラスから作られる、実際に動作するプログラム。

インスタンス生成とはクラスの具体的な実体を作成することです。

インスタンスはメイン関数内で「クラス名()」と書き、それを定数に代入することで生成されます。

class User {					// Userという名前のクラスを定義
    var name: String = "Alice"	// 変数(プロパティ)の宣言
    var age: Int = 25			// 変数(プロパティ)の宣言

    fun displayInfo() {			// displayInfoという名前のメソッドを定義
        println("Name: $name, Age: $age") // このメソッドの処理内容
    }
}

fun main() {			// メイン関数
    val user = User()	// Userクラスのインスタンスを生成し、定数userに代入
    					// これにより、定数userはUserクラスの実体(オブジェクト)となる

    user.displayInfo()  // 定数userの中のdisplayInfoメソッドの呼び出し
}

このように、オブジェクトとなった定数は後ろにドットと内包するメソッド名を続けて書くことで、そのメソッドを呼び出すことができます。

すなわち、このコードを実行すると以下のように出力されます。

Name: Alice, Age: 25

また、クラスの定義位置がメイン関数の外になっている点にも注意しましょう。

クラスとインスタンスの活用コード例

もう少し実践的な例として、簡単なユーザー管理アプリのシミュレーションを作成してみましょう。

class User {				// Userクラスの定義
    var name: String = ""	// プロパティの宣言
    var age: Int = 0		// プロパティの宣言

    fun displayInfo() {		// メソッドの定義
        println("Name: $name, Age: $age")
    }
}

fun main() {				// メイン関数の宣言
    val user1 = User()		// Userクラスのインスタンスを生成し、定数user1に代入
    user1.name = "Bob"		// 「user1内の」変数nameに値を代入
    user1.age = 30			// 「user1内の」変数ageに値を代入

    val user2 = User()		// Userクラスのインスタンスを生成し、定数user2に代入
    user2.name = "Eve"		// 「user2内の」変数nameに値を代入
    user2.age = 22			// 「user1内の」変数ageに値を代入

    println("User 1 Information:")
    user1.displayInfo()		// user1のメソッドの呼び出し
    println("User 2 Information:")
    user2.displayInfo()		// user2のメソッドの呼び出し
}

このコードでは複数のインスタンスを作成し、それぞれ異なるデータを設定しています。

このコードを実行すると以下のように出力されます。

User 1 Information:
Name: Bob, Age: 30
User 2 Information:
Name: Eve, Age: 22

まとめ|クラスとインスタンスで広がるKotlinの世界

下の図はこれから学習していくKotlinのオブジェクト指向を概念的にまとめた図です。

本記事ではクラスの基本構造とその使用例について学びました。

クラスは、データと機能をひとつにまとめた「設計図」です。そして、インスタンスはその設計図から生まれる実体(オブジェクト)です。

Kotlinではクラスを定義して、必要に応じて何度でもインスタンスを作ることができます。

これにより、複雑なプログラムでも整理された、再利用しやすいコードを書けるようになります。

クラスとインスタンスの仕組みを理解し、あなたのKotlinプログラミングにどんどん活かしていきましょう!

練習問題|クラスを使ってユーザー情報を出力するプログラムを作ろう

ユーザーの名前と年齢を入力して、その情報を表示するプログラムを作成しましょう。

さらに入力された年齢が正しい形式でない場合には適切なメッセージを表示するようにします。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. Userクラスを定義すること:
    • プロパティ name を持ち、文字列型のデータを格納すること。
    • プロパティ age を持ち、整数型のデータを格納すること。
    • displayInfo() メソッドを定義し、name と age を表示すること。
  2. main関数を作成すること:
    • readLine() を使用して、ユーザーの名前を入力させること。
    • 年齢を入力させ、数値に変換すること。ただし、入力が数値でない場合は適切なエラー処理を行うこと。
    • 入力された名前と年齢を User クラスのインスタンスに設定し、その情報を表示すること。
  3. エラーメッセージを表示すること:
    • 年齢が正しい形式でない場合、「年齢が正しくありません」と表示すること。

ただし、以下のような実行結果となること。

ユーザーの名前を入力してください:
太郎
ユーザーの年齢を入力してください:
25
入力されたユーザー情報:
名前: 太郎, 年齢: 25

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:Userクラスを定義
  □ 変数nameを宣言し、初期値を空文字列に設定
  □ 変数ageを宣言し、初期値を0に設定
  □ displayInfo関数を定義
  □ □ 名前と年齢を文字列の埋め込みで出力
2:main関数を定義
  □ 「ユーザーの名前を入力してください:」と出力
  □ 変数userNameを宣言し、入力された文字列を代入。nullの場合は”未入力”を設定
  □ 「ユーザーの年齢を入力してください:」と出力
  □ 変数userAgeInputを宣言し、入力された文字列を代入
  □ 変数userAgeを宣言し、userAgeInputを整数に変換。無効な入力の場合は-1を設定
  □ Userクラスのインスタンスを生成し、変数userに代入
  □ 変数userのnameプロパティにuserNameを代入
  □ 変数userのageプロパティにuserAgeを代入
  □ if文にてuser.ageが0以上であるか判定
  □ □ 真の場合、「入力されたユーザー情報:」と出力
  □ □ displayInfo関数を呼び出してユーザー情報を出力
  □ □ 偽の場合、「年齢が正しくありません。数値を入力してください。」と出力

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

// Userクラスを定義します。このクラスはユーザー情報を格納します。
/* 【穴埋め問題1】
ここでUserクラスを定義し、nameとageというプロパティを持つコードを書いてください。
また、displayInfoという関数を定義して、ユーザー情報を表示するコードを記述してください。
*/

fun main() {
    // 入力を受け取る準備
    println("ユーザーの名前を入力してください:")
    /* 【穴埋め問題2】
    ここにユーザーの名前を入力させ、それを変数userNameに格納するコードを書いてください。
    */

    println("ユーザーの年齢を入力してください:")
    /* 【穴埋め問題3】
    ここにユーザーの年齢を入力させ、無効な入力の場合に-1を設定するコードを書いてください。
    */

    // Userクラスのインスタンスを作成
    /* 【穴埋め問題4】
    ここでUserクラスのインスタンスを作成し、nameとageプロパティにそれぞれuserNameとuserAgeを設定するコードを書いてください。
    */

    // 年齢が適切かチェック
    /* 【穴埋め問題5】
    ここにif文を使って、年齢が0以上の場合にユーザー情報を表示し、それ以外の場合にエラーメッセージを出力するコードを書いてください。
    */
}

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

この問題の解答と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
// Userクラスを定義します。このクラスはユーザー情報を格納します。
class User {
    // ユーザー名を格納する変数
    var name: String = ""
    // ユーザーの年齢を格納する変数
    var age: Int = 0

    // ユーザー情報を表示する関数
    fun displayInfo() {
        println("名前: $name, 年齢: $age")
    }
}

// ユーザーから情報を入力し、クラスを活用する関数
fun main() {
    // 入力を受け取る準備
    println("ユーザーの名前を入力してください:")
    val userName = readLine() ?: "未入力" // 入力がnullの場合は"未入力"を設定

    println("ユーザーの年齢を入力してください:")
    val userAgeInput = readLine()
    val userAge = userAgeInput?.toIntOrNull() ?: -1 // 入力が無効な場合は-1を設定

    // Userクラスのインスタンスを作成
    val user = User()
    user.name = userName // 入力された名前を設定
    user.age = userAge   // 入力された年齢を設定

    // 年齢が適切かチェック
    if (user.age >= 0) {
        // ユーザー情報を表示
        println("入力されたユーザー情報:")
        user.displayInfo()
    } else {
        println("年齢が正しくありません。数値を入力してください。")
    }
}
Q
正解コードの解説

コードをブロックごとに分割して解説します。

Userクラスの定義

class User {
    var name: String = ""
    var age: Int = 0

    fun displayInfo() {
        println("名前: $name, 年齢: $age")
    }
}
  • class User: クラスを定義する基本構文です。Userはクラスの名前であり、任意の名前を付けられます。
  • var name: String = "": ユーザーの名前を格納する変数(プロパティ)を定義しています。初期値は空文字列です。
  • var age: Int = 0: ユーザーの年齢を格納するプロパティです。初期値は0です。
  • fun displayInfo(): クラス内のメソッドです。このメソッドを呼び出すと、nameageの値を表示します。

メイン関数の定義

fun main() {
    println("ユーザーの名前を入力してください:")
    val userName = readLine() ?: "未入力"

    println("ユーザーの年齢を入力してください:")
    val userAgeInput = readLine()
    val userAge = userAgeInput?.toIntOrNull() ?: -1
  • fun main(): プログラムのエントリーポイントです。この関数からプログラムが開始します。
  • readLine(): ユーザーからの入力を受け取る関数です。名前や年齢を入力するために使用します。
  • ?:(エルビス演算子): 入力がnullの場合にデフォルト値を設定します。ここでは名前のデフォルトを”未入力”、年齢のデフォルトを-1としています。
  • toIntOrNull(): 入力された文字列を整数に変換します。変換できない場合はnullを返します。

クラスのインスタンス化とプロパティの設定

    val user = User()
    user.name = userName
    user.age = userAge
  • val user = User(): Userクラスのインスタンスを生成しています。これによりuserというオブジェクトが作られます。
  • user.name = userName: userオブジェクトのnameプロパティに、入力された名前を代入します。
  • user.age = userAge: userオブジェクトのageプロパティに、入力された年齢を代入します。

条件分岐による年齢のチェックと結果表示

    if (user.age >= 0) {
        println("入力されたユーザー情報:")
        user.displayInfo()
    } else {
        println("年齢が正しくありません。数値を入力してください。")
    }
}
  • if (user.age >= 0): 年齢が0以上の場合のみユーザー情報を表示します。無効な入力(例: 年齢に文字を入力した場合)はエラーメッセージを表示します。
  • user.displayInfo(): UserクラスのdisplayInfo()メソッドを呼び出し、ユーザー情報を表示します。
Q
サイト改善アンケート & ご指摘/ご質問

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などを アンケート 形式でお伺いしています。

また記事の内容に関する ご指摘ご質問 もお待ちしています。

1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
※ 特定の記事に関する内容の場合は、記事番号(レッスン〇-〇)をご記入願います。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました