Kotlinの初心者向け問題4-4:クラスメンバを理解しよう
この問題を解くために必要な知識:
【レベル1~3の知識】
コメントの書き方、変数と定数、基本データ型、算術演算と論理演算、入力と出力、import文、配列、分岐処理(if、if~else、when)、繰り返し処理(for、while、do~while)、Null安全、スマートキャスト、関数の定義と呼び出し、関数の戻り値、関数のオーバーロード、ラベルとジャンプ、例外処理、クラスの定義と使用、インスタンス、コンストラクタ、プロパティ、クラスの継承、クラスの拡張、コレクションの基礎、リストコレクション(MutableList、ArrayList)、セットコレクション(HashSet、MutableSet、TreeSet)、マップコレクション(HashMap、MutableMap、TreeMap)
【レベル4の知識】
メンバ関数、ゲッターとセッター、カプセル化、クラスメンバ、抽象クラス、インターフェース、データクラス
<<前の問題 | 問題集Top |
次の問題>> |
Kotlinの文法「クラスメンバ」とは
ここではクラスメンバの意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。
Kotlinでは、クラスの内部で定義されるメンバ(クラスメンバ)は、オブジェクト指向プログラミングを理解する上で欠かせない概念です。
これらはクラスの状態や動作を定義する重要な要素となります。
クラスメンバとは?
クラスメンバとは、クラス内に定義されるプロパティ(変数)やメソッド(関数)のことを指します。
これらは、クラスのインスタンスを通じてアクセスされ、オブジェクトの状態を保持したり、動作を定義したりする役割を果たします。
Kotlinでは、クラスメンバの可視性やアクセス範囲を制御するためにアクセス修飾子を使用します。
代表的な修飾子にはpublic
、private
、protected
があります。
これにより、外部からアクセス可能なメンバとクラス内部に限定されるメンバを区別することができます。
クラスメンバの使用例
次に、Kotlinでクラスメンバがどのように定義され、使用されるかを例を交えて見てみましょう。
class Car { var brand: String = "Toyota" // プロパティ(メンバ変数) var speed: Int = 0 // 初期速度 // メソッド(メンバ関数) fun accelerate(amount: Int) { speed += amount } } fun main() { val myCar = Car() // Carオブジェクトの作成 println(myCar.brand) // "Toyota"と表示 myCar.accelerate(50) // 速度を50上げる println(myCar.speed) // 50と表示 }
このコードでは、Car
クラスが2つのメンバ変数(brand
とspeed
)を持ち、それに加えてaccelerate
というメンバ関数を定義しています。
myCar
というインスタンスを作成して、brand
を取得したり、accelerate
メソッドを使用して速度を増加させることができます。
このように、クラスメンバはオブジェクトの状態(プロパティ)を管理し、動作(メソッド)を定義するために使われます。
クラスメンバの可視性
Kotlinでは、クラスメンバのアクセス範囲を制御するために、アクセス修飾子を使用します。主な修飾子は次の通りです:
public
: デフォルトで、どこからでもアクセス可能です。private
: クラス内部からのみアクセス可能です。クラス外から直接操作されることを防ぎ、カプセル化を強化します。protected
: 同じクラスやサブクラスからのみアクセスできます。サブクラスによるメンバの拡張を許可する場合に便利です。internal
: 同じモジュール内でのみアクセス可能です。モジュール外からはアクセスできないようにします。
次の例では、BankAccount
クラスでprivate
修飾子を使用して、balance
というプロパティの直接アクセスを制限しています。
class BankAccount { private var balance: Int = 1000 // プライベートプロパティ fun deposit(amount: Int) { balance += amount } fun getBalance(): Int { return balance } } fun main() { val myAccount = BankAccount() myAccount.deposit(500) println(myAccount.getBalance()) // 1500と表示 }
ここでは、balance
プロパティはprivate
に設定されており、外部から直接変更することはできませんが、deposit
メソッドを通じて金額を追加することが可能です。
また、getBalance
メソッドを使って現在の残高を取得することができます。
このように、アクセス修飾子を使うことで、データの保護とクラスの安全性を確保することができます。
まとめ
Kotlinにおけるクラスメンバは、クラスの状態や動作を定義する重要な要素です。
プロパティとメソッドを効果的に利用することで、オブジェクト指向の設計を理解し、プログラムの構造を整理することができます。
また、アクセス修飾子を使うことで、データの保護や可視性をコントロールすることが可能です。
練習問題を通じて、これらの概念をしっかりと理解しましょう。
Kotlin練習問題4-4_シンプルなカウントダウンタイマーを作ろう
Kotlinのクラスメンバを復習するために、学生を管理するシステムを作成しましょう。このプログラムでは以下の機能を持つ Student
クラスと StudentManager
クラスを作成します。
Student
クラスname
プロパティ:学生の名前を管理する。age
プロパティ:学生の年齢を管理する。id
プロパティ:学生のIDを管理する(各学生にユニークなIDを割り当てる)。
StudentManager
クラスstudentList
プロパティ:学生のリストを管理する。addStudent
メンバ関数:学生の名前と年齢を受け取り、リストに追加する。showStudents
メンバ関数:すべての学生の情報を表示する。totalStudents
クラスメンバ:学生の総数を管理する。
この問題の要件
以下の要件に従ってプログラムを作成してください。
Student
クラスを定義し、学生の名前、年齢、IDを管理する。StudentManager
クラスを定義し、学生のリストを管理するプロパティとメンバ関数を定義する。- 学生をリストに追加する
addStudent
メンバ関数を定義する。 - 学生の情報を表示する
showStudents
メンバ関数を定義する。 - クラスメンバとして学生の総数を管理する
totalStudents
を定義する。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
ID: 1, Name: Alice, Age: 20 ID: 2, Name: Bob, Age: 22 ID: 3, Name: Charlie, Age: 21 Total number of students: 3
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.Student クラスの定義
2.StudentManager クラスの定義
2-1. studentList プロパティの定義
2-2. companion object の定義
2-2-1. totalStudents プロパティの定義
2-3. addStudent メンバ関数の定義
2-3-1. id の計算と初期化
2-3-2. Student インスタンスの作成
2-3-3. studentList への追加
2-3-4. totalStudents のインクリメント
2-4. showStudents メンバ関数の定義
2-4-1. for ループの開始
2-4-2. 学生情報の出力
3.main 関数の定義
3-1. StudentManager インスタンスの作成
3-2. 学生の追加
3-2-1. addStudent 関数の呼び出し
3-3. 学生情報の表示
3-3-1. showStudents 関数の呼び出し
3-4. 学生総数の表示
3-4-1. totalStudents プロパティの表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
// Student クラスを定義 class Student(/*【穴埋め問題1】ここにコンストラクタのパラメータnameを定義するコードを書いてください。*/ /*【穴埋め問題2】ここにコンストラクタのパラメータageを定義するコードを書いてください。*/ /*【穴埋め問題3】ここにコンストラクタのパラメータidを定義するコードを書いてください。*/) // StudentManager クラスを定義 class StudentManager { // 学生のリストを管理するプロパティ private val studentList = mutableListOf</*【穴埋め問題4】ここにStudentクラスを指定するコードを書いてください。*/>() // クラスメンバとして学生の総数を管理 companion object { var totalStudents: Int = 0 private set } // 学生をリストに追加するメンバ関数 fun addStudent(name: String, age: Int) { val id = /*【穴埋め問題5】ここに学生IDを計算するコードを書いてください。*/ + 1 val student = Student(name, age, id) studentList.add(student) totalStudents++ } // すべての学生の情報を表示するメンバ関数 fun showStudents() { for (student in studentList) { println(/*【穴埋め問題6】ここに学生情報を表示するコードを書いてください。*/) } } } // main 関数を定義 fun main() { // StudentManager クラスのインスタンスを作成 val manager = /*【穴埋め問題7】ここにStudentManagerクラスのインスタンスを作成するコードを書いてください。*/ // 学生を追加 manager.addStudent("Alice", 20) manager.addStudent("Bob", 22) manager.addStudent("Charlie", 21) // 学生の情報を表示 manager.showStudents() // 学生の総数を表示 println(/*【穴埋め問題8】ここに学生の総数を表示するコードを書いてください。*/) }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
********************
// Student クラスを定義 class Student(val name: String, var age: Int, val id: Int) // StudentManager クラスを定義 class StudentManager { // 学生のリストを管理するプロパティ private val studentList = mutableListOf<Student>() // クラスメンバとして学生の総数を管理 companion object { var totalStudents: Int = 0 private set } // 学生をリストに追加するメンバ関数 fun addStudent(name: String, age: Int) { val id = totalStudents + 1 val student = Student(name, age, id) studentList.add(student) totalStudents++ } // すべての学生の情報を表示するメンバ関数 fun showStudents() { for (student in studentList) { println("ID: ${student.id}, Name: ${student.name}, Age: ${student.age}") } } } // main 関数を定義 fun main() { // StudentManager クラスのインスタンスを作成 val manager = StudentManager() // 学生を追加 manager.addStudent("Alice", 20) manager.addStudent("Bob", 22) manager.addStudent("Charlie", 21) // 学生の情報を表示 manager.showStudents() // 学生の総数を表示 println("Total number of students: ${StudentManager.totalStudents}") }
********************
正解コードの解説
Student クラスの定義
class Student(val name: String, var age: Int, val id: Int)
- クラスの定義:
Student
クラスは学生の名前、年齢、IDを管理します。 - プロパティ:
name
は不変(val
)、age
は可変(var
)、id
は不変です。
StudentManager クラスの定義
class StudentManager { private val studentList = mutableListOf<Student>()
- クラスの定義:
StudentManager
クラスは学生を管理するクラスです。 - プロパティ:
studentList
はmutableListOf<Student>()
で、学生のリストを保持します。
クラスメンバの定義
companion object { var totalStudents: Int = 0 private set }
- クラスメンバ:
totalStudents
はクラス全体で共有されるプロパティで、全学生数をカウントします。 companion object
:Kotlinでは、companion object
を使ってクラスメンバを定義します。private set
:外部から変更できないようにし、読み取り専用にしています。
学生をリストに追加するメンバ関数
fun addStudent(name: String, age: Int) { val id = totalStudents + 1 val student = Student(name, age, id) studentList.add(student) totalStudents++ }
- メンバ関数:
addStudent
は新しい学生をリストに追加し、総学生数を更新します。 - IDの生成:新しい学生の
id
は現在のtotalStudents
に1を加えた値です。
学生の情報を表示するメンバ関数
fun showStudents() { for (student in studentList) { println("ID: ${student.id}, Name: ${student.name}, Age: ${student.age}") } }
- メンバ関数:
showStudents
はすべての学生の情報を出力します。
main 関数
fun main() { val manager = StudentManager() manager.addStudent("Alice", 20) manager.addStudent("Bob", 22) manager.addStudent("Charlie", 21) manager.showStudents() println("Total number of students: ${StudentManager.totalStudents}") }
- エントリーポイント:
main
関数はプログラムの開始点です。 - インスタンス作成:
StudentManager
のインスタンスを作成します。 - メンバ関数の呼び出し:
addStudent
を使って学生を追加し、showStudents
で学生情報を表示します。 - クラスメンバの利用:
totalStudents
を出力して総学生数を表示します。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。