【Kotlin】レッスン5-01:クラスの基本を理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:クラスの定義と使用

この記事の練習問題を解くために必要な知識:
基礎文法、制御構造、関数、コレクション(レッスン1~4)クラスの定義と使用プライマリコンストラクタセカンダリコンストラクタアクセス修飾子とカプセル化クラスメンバとインスタンスメンバクラスの継承メソッドのオーバーライドクラスの拡張抽象クラスインターフェースデータクラス

<<前のページ Kotlin記事一覧 次のページ>>

Kotlinの「クラスの定義と使用」とは

この章ではKotlinにおける「クラスの定義と使用」の意味や使い方を学習します。用語の解説が不要な方はここをクリックして練習問題へ飛びましょう。




Kotlinでは、オブジェクト指向プログラミングの基礎として「クラス」が重要な役割を果たします。

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

クラスとは何か?

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

この設計図を準備しておいて、実際に動作する「インスタンス」をメイン関数の中に作成できます。

クラスを用いることで、現実世界の物事をコードとして表現することが容易になります。

Kotlinでのクラスの定義

Kotlinではclassキーワードを使ってクラスを定義します。

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

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

    fun displayInfo() {   // displayInfoという名前のメソッドを定義
        println("Name: $name, Age: $age") // このメソッドの処理内容
    }
}
  • class User: クラス名をUserとしています。
  • var namevar age: クラス内のプロパティを定義しています。
  • fun displayInfo(): クラス内で使用できるメソッドを定義しています。

このようにクラスを使えばデータとその操作方法をまとめられます。

ただしこれはあくまでも設計図であり、実際に動作はしません。

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

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

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

そしてメソッド(Method)とはクラスの中に定義された「関数」のことを指します。メソッドはクラスやそのインスタンスに紐づいており、クラスが持つデータや機能を操作します。

クラスのインスタンス化と使用例

定義したクラスを使用するためには「インスタンス化」という操作を行います。

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

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

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

fun main() {            // メイン関数
    val user = User()   // Userクラスのインスタンスを生成し、定数userに代入
    
    user.name = "Alice" // 定数userの中のプロパティnameにAliceを代入
    user.age = 25       // 定数userの中のプロパティageに25を代入
    /*
    ここで変更しているのはあくまでも定数userの中のプロパティである点に注意
    基の設計図であるUserクラスの中身は何も変わっていない
    */
    
    user.displayInfo()  // 定数userの中のdisplayInfoメソッドの呼び出し
}

このコードは次の手順を実行しています:

  1. Userクラスのインスタンス化: val user = User()Userクラスのオブジェクトを生成します。
  2. プロパティの値を設定: user.nameuser.ageに値を代入します。
  3. メソッドの呼び出し: 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.age = 30

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

    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のオブジェクト指向を分かりやすくまとめた概念図。 特にクラスの継承、オーバーライド、抽象クラス、インターフェース、データクラスの関係性を視覚的に理解できるようまとめている。

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

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

クラスを使うことでデータと動作をひとつにまとめ、整理されたコードを書くことができます。

次回はさらに進んだ概念である「コンストラクタ」について学びます。

引き続き学習を進めて、Kotlinのスキルを向上させましょう!

クラスの基本の練習問題

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

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

この問題の要件

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

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

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

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

この問題を解くヒント

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

ヒント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関数を呼び出してユーザー情報を出力
  □ □ 偽の場合、「年齢が正しくありません。数値を入力してください。」と出力

ヒント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以上の場合にユーザー情報を表示し、それ以外の場合にエラーメッセージを出力するコードを書いてください。
    */
}

以上がこの問題の穴埋めコードです。

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



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

// 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("年齢が正しくありません。数値を入力してください。")
    }
}

正解コードの解説

今回のコードではKotlinでのクラスの定義と使用を学びました。

このコードを通じて、クラスをどのように定義し、それを活用するかを理解しましょう。

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()メソッドを呼び出し、ユーザー情報を表示します。

まとめ

このコードではKotlinのクラスの定義と使用の基礎を学びました。

クラスを活用するとプログラムがより整理され、再利用可能になります。

次のステップでは、さらに高度なクラスの機能やオブジェクト指向の考え方を学びましょう!

<<前のページ Kotlin記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Kotlinのテキスト&問題集トップへ戻る
    トップページへ戻る