第7章 クラス/オブジェクト指向プログラミングの基礎
この章の目的
Section titled “この章の目的”この章では、C#の重要な考え方である クラス と オブジェクト指向プログラミング の基礎を学習します。
これまでの章では、変数、条件分岐、繰り返し、配列を使ってプログラムを書いてきました。
たとえば、社員情報を扱う場合、次のように変数を用意できます。
int employeeId = 1001;string employeeName = "山田太郎";string departmentName = "営業部";1人分ならこれでも問題ありません。
しかし、複数人の社員情報を扱う場合、次のように変数が増えていきます。
int employeeId1 = 1001;string employeeName1 = "山田太郎";string departmentName1 = "営業部";
int employeeId2 = 1002;string employeeName2 = "佐藤花子";string departmentName2 = "開発部";この書き方では、データのまとまりが分かりにくくなります。
そこで、C#では クラス を使って、関連するデータや処理を1つのまとまりとして扱います。
この章では、まず次の考え方を学びます。
社員を表すクラスを作る ↓社員番号、氏名、部署などの情報を持たせる ↓社員情報を表示する処理を持たせる ↓社員オブジェクトを作って利用するこの章でできるようになること
Section titled “この章でできるようになること”この章を終えると、次のことができるようになります。
- オブジェクト指向プログラミングの考え方をおおまかに説明できる
- クラスとは何かを説明できる
- オブジェクトとは何かを説明できる
- クラスとオブジェクトの違いを説明できる
- 自分で簡単なクラスを作成できる
- クラスにプロパティを定義できる
- クラスからオブジェクトを作成できる
- オブジェクトのプロパティに値を代入できる
- オブジェクトのプロパティを表示できる
- クラスにメソッドを定義できる
- メソッドを呼び出せる
- 戻り値のあるメソッドを作成できる
- 引数のあるメソッドを作成できる
- 変数のスコープを説明できる
本章で使用する環境
Section titled “本章で使用する環境”| 項目 | 内容 |
|---|---|
| 開発環境 | Visual Studio 2022 |
| プロジェクト種類 | コンソール アプリ |
| 対象フレームワーク | .NET 8 |
| プロジェクト名 | Chapter07_ClassBasics |
作業前チェック
Section titled “作業前チェック”作業を始める前に、次の内容を確認してください。
- Visual Studio 2022でコンソールアプリを作成できる
-
.NET 8.0を選択できる -
int、string、boolなどの変数を使える -
if文を使った条件分岐が書ける -
for文やforeach文を使った繰り返しが書ける - 配列の基本を説明できる
-
class Programとstatic void Main()の形に見慣れている - 第6章の内容をGitに提出済みである
7-1 オブジェクト指向とは?
Section titled “7-1 オブジェクト指向とは?”オブジェクト指向の考え方
Section titled “オブジェクト指向の考え方”オブジェクト指向プログラミングとは、プログラムを もの の集まりとして考える方法です。
ここでいう「もの」は、現実世界にある物体だけではありません。
たとえば、次のようなものもプログラム上の「もの」として扱えます。
社員商品注文顧客タスク予約売上これらの「もの」には、情報があります。
たとえば、社員には次のような情報があります。
社員番号氏名部署メールアドレス在籍中かどうかまた、社員に関する処理もあります。
社員情報を表示する氏名を取得する部署を変更する在籍状態を確認するオブジェクト指向では、このような 情報 と 処理 を1つのまとまりとして扱います。
情報と処理をまとめる
Section titled “情報と処理をまとめる”社員を例にすると、次のように考えられます。
社員 ├─ 情報 │ ├─ 社員番号 │ ├─ 氏名 │ └─ 部署 │ └─ 処理 ├─ 社員情報を表示する └─ 表示用の名前を作るC#では、このようなまとまりを クラス として定義します。
そして、そのクラスから実際に作られたものを オブジェクト または インスタンス と呼びます。
この章でのイメージ
Section titled “この章でのイメージ”この章では、まず次のように考えてください。
| 用語 | ひとまずの説明 |
|---|---|
| クラス | 設計図 |
| オブジェクト | 設計図から作られた実物 |
| プロパティ | オブジェクトが持つ情報 |
| メソッド | オブジェクトに行わせる処理 |
たとえば、社員クラスを設計図と考えると、実際の社員データがオブジェクトです。
Employeeクラス ↓社員を表す設計図
employee1 ↓山田太郎さんを表すオブジェクト
employee2 ↓佐藤花子さんを表すオブジェクト7-2 オブジェクト指向以前
Section titled “7-2 オブジェクト指向以前”変数だけで社員情報を扱う
Section titled “変数だけで社員情報を扱う”まず、クラスを使わずに社員情報を扱ってみます。
using System;
class Program{ static void Main() { int employeeId = 1001; string name = "山田太郎"; string department = "営業部";
Console.WriteLine($"社員番号:{employeeId}"); Console.WriteLine($"氏名:{name}"); Console.WriteLine($"部署:{department}"); }}実行結果:
社員番号:1001氏名:山田太郎部署:営業部このコードは問題なく動作します。
しかし、社員が増えるとどうなるでしょうか。
複数人になると分かりにくい
Section titled “複数人になると分かりにくい”2人分の社員情報を扱うと、次のようになります。
using System;
class Program{ static void Main() { int employeeId1 = 1001; string name1 = "山田太郎"; string department1 = "営業部";
int employeeId2 = 1002; string name2 = "佐藤花子"; string department2 = "開発部";
Console.WriteLine($"社員番号:{employeeId1}"); Console.WriteLine($"氏名:{name1}"); Console.WriteLine($"部署:{department1}");
Console.WriteLine($"社員番号:{employeeId2}"); Console.WriteLine($"氏名:{name2}"); Console.WriteLine($"部署:{department2}"); }}動作はしますが、次の問題があります。
社員1人分の情報がまとまっていない変数名が増えて読みにくい表示処理が重複している後から項目を追加しにくいたとえば、メールアドレスを追加したくなった場合、すべての社員について変数と表示処理を追加しなければなりません。
配列を使う場合
Section titled “配列を使う場合”配列を使うと、複数の値をまとめられます。
using System;
class Program{ static void Main() { int[] employeeIds = { 1001, 1002 }; string[] names = { "山田太郎", "佐藤花子" }; string[] departments = { "営業部", "開発部" };
for (int i = 0; i < employeeIds.Length; i++) { Console.WriteLine($"社員番号:{employeeIds[i]}"); Console.WriteLine($"氏名:{names[i]}"); Console.WriteLine($"部署:{departments[i]}"); } }}配列を使うことで、複数人分のデータを扱いやすくなりました。
しかし、まだ問題があります。
employeeIds、names、departments の同じ番号が同じ社員を表す配列同士の対応関係を人間が注意して管理する必要がある社員1人分の情報が1つのまとまりになっていないそこで、クラスを使います。
7-3 初めてのクラス
Section titled “7-3 初めてのクラス”Employeeクラスを作る
Section titled “Employeeクラスを作る”社員情報をまとめて扱うために、Employee クラスを作成します。
まずは、Program.cs に次のコードを入力してください。
using System;
class Program{ static void Main() { Employee employee = new Employee();
employee.EmployeeId = 1001; employee.Name = "山田太郎"; employee.Department = "営業部";
Console.WriteLine($"社員番号:{employee.EmployeeId}"); Console.WriteLine($"氏名:{employee.Name}"); Console.WriteLine($"部署:{employee.Department}"); }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; } public string Department { get; set; }}実行結果:
社員番号:1001氏名:山田太郎部署:営業部Employeeクラスの定義
Section titled “Employeeクラスの定義”次の部分が、社員を表すクラスです。
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; } public string Department { get; set; }}Employee クラスには、次の3つの情報を持たせています。
| プロパティ | 型 | 意味 |
|---|---|---|
EmployeeId | int | 社員番号 |
Name | string | 氏名 |
Department | string | 部署 |
このように、クラスの中に定義した情報を表すものを プロパティ と呼びます。
プロパティとは
Section titled “プロパティとは”プロパティは、オブジェクトが持つ情報を表します。
public int EmployeeId { get; set; }public string Name { get; set; }public string Department { get; set; }この段階では、次のように理解してください。
プロパティ → オブジェクトが持っている情報社員オブジェクトであれば、社員番号、氏名、部署がプロパティです。
オブジェクトを作成する
Section titled “オブジェクトを作成する”次のコードは、Employee クラスからオブジェクトを作成しています。
Employee employee = new Employee();new Employee() によって、Employee クラスをもとにした実際のオブジェクトが作られます。
Employeeクラス ↓ newemployeeオブジェクトプロパティに値を代入する
Section titled “プロパティに値を代入する”作成したオブジェクトのプロパティには、次のように値を代入できます。
employee.EmployeeId = 1001;employee.Name = "山田太郎";employee.Department = "営業部";これは、employee オブジェクトが持つ EmployeeId、Name、Department に値を入れています。
プロパティの値を表示する
Section titled “プロパティの値を表示する”プロパティの値は、変数と同じように参照できます。
Console.WriteLine($"社員番号:{employee.EmployeeId}");Console.WriteLine($"氏名:{employee.Name}");Console.WriteLine($"部署:{employee.Department}");補足:プロパティとメソッド
Section titled “補足:プロパティとメソッド”第6章では、配列の Length と GetLength() の違いに少し触れました。
scores.Lengthscores.GetLength(0)この章では、次のように考えてください。
| 種類 | 例 | ひとまずの見方 |
|---|---|---|
| プロパティ | employee.Name | 情報を参照している |
| メソッド | employee.PrintProfile() | 処理を呼び出している |
プロパティは情報、メソッドは処理です。
詳しい仕組みは後の章でも扱いますが、まずはこの区別を意識しましょう。
7-4 クラスとオブジェクトの違い
Section titled “7-4 クラスとオブジェクトの違い”クラスは設計図
Section titled “クラスは設計図”クラスは、オブジェクトを作るための設計図です。
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; } public string Department { get; set; }}このコードは、「社員は社員番号、氏名、部署を持つ」という設計を表しています。
ただし、これを書いただけでは、まだ具体的な社員データは存在しません。
オブジェクトは実体
Section titled “オブジェクトは実体”new を使うと、クラスからオブジェクトを作成できます。
Employee employee1 = new Employee();Employee employee2 = new Employee();employee1 と employee2 は、どちらも Employee クラスから作られた別々のオブジェクトです。
複数のオブジェクトを作る
Section titled “複数のオブジェクトを作る”次のコードを入力して実行してください。
using System;
class Program{ static void Main() { Employee employee1 = new Employee(); employee1.EmployeeId = 1001; employee1.Name = "山田太郎"; employee1.Department = "営業部";
Employee employee2 = new Employee(); employee2.EmployeeId = 1002; employee2.Name = "佐藤花子"; employee2.Department = "開発部";
Console.WriteLine($"社員番号:{employee1.EmployeeId}"); Console.WriteLine($"氏名:{employee1.Name}"); Console.WriteLine($"部署:{employee1.Department}");
Console.WriteLine($"社員番号:{employee2.EmployeeId}"); Console.WriteLine($"氏名:{employee2.Name}"); Console.WriteLine($"部署:{employee2.Department}"); }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; } public string Department { get; set; }}実行結果:
社員番号:1001氏名:山田太郎部署:営業部社員番号:1002氏名:佐藤花子部署:開発部employee1 と employee2 は、同じ Employee クラスから作られていますが、それぞれ別の値を持っています。
オブジェクト初期化子
Section titled “オブジェクト初期化子”プロパティへの代入は、オブジェクトを作るときにまとめて書くこともできます。
Employee employee = new Employee{ EmployeeId = 1001, Name = "山田太郎", Department = "営業部"};これを オブジェクト初期化子 と呼びます。
次のコードを入力して実行してください。
using System;
class Program{ static void Main() { Employee employee = new Employee { EmployeeId = 1001, Name = "山田太郎", Department = "営業部" };
Console.WriteLine($"社員番号:{employee.EmployeeId}"); Console.WriteLine($"氏名:{employee.Name}"); Console.WriteLine($"部署:{employee.Department}"); }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; } public string Department { get; set; }}実行結果:
社員番号:1001氏名:山田太郎部署:営業部オブジェクト初期化子を使うと、オブジェクト作成時にプロパティの値をまとめて設定できます。
クラスとオブジェクトの整理
Section titled “クラスとオブジェクトの整理”| 用語 | 意味 | 例 |
|---|---|---|
| クラス | 設計図 | Employee |
| オブジェクト | 設計図から作られた実体 | employee1 |
| インスタンス | オブジェクトとほぼ同じ意味で使われる | new Employee() で作られたもの |
| プロパティ | オブジェクトが持つ情報 | Name、Department |
この章では、オブジェクトとインスタンスはほぼ同じ意味として扱って構いません。
7-5 メソッドを定義する
Section titled “7-5 メソッドを定義する”メソッドとは
Section titled “メソッドとは”メソッドは、処理をまとめたものです。
これまでにも、メソッドを呼び出してきました。
Console.WriteLine("こんにちは");Console.ReadLine();int.Parse(input);これらは、C#や.NETが用意しているメソッドです。
この章では、自分でクラスの中にメソッドを定義します。
社員情報を表示するメソッド
Section titled “社員情報を表示するメソッド”社員情報を表示する処理を、Employee クラスの中にまとめます。
using System;
class Program{ static void Main() { Employee employee = new Employee { EmployeeId = 1001, Name = "山田太郎", Department = "営業部" };
employee.PrintProfile(); }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; } public string Department { get; set; }
public void PrintProfile() { Console.WriteLine($"社員番号:{EmployeeId}"); Console.WriteLine($"氏名:{Name}"); Console.WriteLine($"部署:{Department}"); }}実行結果:
社員番号:1001氏名:山田太郎部署:営業部PrintProfileメソッド
Section titled “PrintProfileメソッド”次の部分が、Employee クラスに定義したメソッドです。
public void PrintProfile(){ Console.WriteLine($"社員番号:{EmployeeId}"); Console.WriteLine($"氏名:{Name}"); Console.WriteLine($"部署:{Department}");}このメソッドは、社員情報を表示する処理をまとめています。
メソッドを呼び出す
Section titled “メソッドを呼び出す”メソッドを使うには、次のように呼び出します。
employee.PrintProfile();これは、employee オブジェクトに対して「プロフィールを表示してください」とお願いしているイメージです。
employee.PrintProfile(); ↓employeeの社員情報を表示するvoidとは
Section titled “voidとは”PrintProfile メソッドの定義には、void が書かれています。
public void PrintProfile()void は、このメソッドが値を返さないことを表します。
この章では、次のように理解してください。
void → 処理は行うが、呼び出し元に値は返さないPrintProfile は画面表示を行いますが、計算結果のような値を返すわけではありません。
戻り値のあるメソッド
Section titled “戻り値のあるメソッド”メソッドは、処理結果を呼び出し元に返すこともできます。
次の例では、社員情報の表示用文字列を返す GetProfileText メソッドを作成します。
using System;
class Program{ static void Main() { Employee employee = new Employee { EmployeeId = 1001, Name = "山田太郎", Department = "営業部" };
string profileText = employee.GetProfileText();
Console.WriteLine(profileText); }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; } public string Department { get; set; }
public string GetProfileText() { return $"{EmployeeId}:{Name}({Department})"; }}実行結果:
1001:山田太郎(営業部)returnとは
Section titled “returnとは”return は、メソッドの結果を呼び出し元に返すために使います。
public string GetProfileText(){ return $"{EmployeeId}:{Name}({Department})";}このメソッドは、string 型の値を返します。
そのため、メソッド名の前に string と書いています。
public string GetProfileText()引数のあるメソッド
Section titled “引数のあるメソッド”メソッドには、外部から値を渡すこともできます。
次の例では、部署名を変更する ChangeDepartment メソッドを作成します。
using System;
class Program{ static void Main() { Employee employee = new Employee { EmployeeId = 1001, Name = "山田太郎", Department = "営業部" };
employee.PrintProfile();
employee.ChangeDepartment("開発部");
employee.PrintProfile(); }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; } public string Department { get; set; }
public void PrintProfile() { Console.WriteLine($"社員番号:{EmployeeId}"); Console.WriteLine($"氏名:{Name}"); Console.WriteLine($"部署:{Department}"); }
public void ChangeDepartment(string newDepartment) { Department = newDepartment; }}実行結果:
社員番号:1001氏名:山田太郎部署:営業部社員番号:1001氏名:山田太郎部署:開発部次の部分が、引数を受け取るメソッドです。
public void ChangeDepartment(string newDepartment){ Department = newDepartment;}newDepartment は、メソッドを呼び出すときに渡される値を受け取る変数です。
employee.ChangeDepartment("開発部");この呼び出しにより、"開発部" が newDepartment に渡されます。
"開発部" ↓newDepartment ↓Department に代入売上金額を計算するクラス
Section titled “売上金額を計算するクラス”次は、売上情報を表す Sale クラスを作ります。
using System;
class Program{ static void Main() { Sale sale = new Sale { ProductName = "ノート", UnitPrice = 180, Quantity = 5 };
int amount = sale.GetAmount();
Console.WriteLine($"商品名:{sale.ProductName}"); Console.WriteLine($"金額:{amount}円"); }}
class Sale{ public string ProductName { get; set; } public int UnitPrice { get; set; } public int Quantity { get; set; }
public int GetAmount() { return UnitPrice * Quantity; }}実行結果:
商品名:ノート金額:900円GetAmount メソッドは、単価と数量から売上金額を計算し、int 型の値として返します。
7-6 メソッドの利点
Section titled “7-6 メソッドの利点”同じ処理を何度も書かなくてよい
Section titled “同じ処理を何度も書かなくてよい”メソッドを使うと、同じ処理を何度も書かずに済みます。
たとえば、社員情報を複数回表示したい場合を考えます。
メソッドがない場合、毎回次のような表示処理を書く必要があります。
Console.WriteLine($"社員番号:{employee.EmployeeId}");Console.WriteLine($"氏名:{employee.Name}");Console.WriteLine($"部署:{employee.Department}");メソッドにしておけば、次の1行で済みます。
employee.PrintProfile();複数のオブジェクトで同じメソッドを使える
Section titled “複数のオブジェクトで同じメソッドを使える”次のコードを入力して実行してください。
using System;
class Program{ static void Main() { Employee employee1 = new Employee { EmployeeId = 1001, Name = "山田太郎", Department = "営業部" };
Employee employee2 = new Employee { EmployeeId = 1002, Name = "佐藤花子", Department = "開発部" };
employee1.PrintProfile(); employee2.PrintProfile(); }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; } public string Department { get; set; }
public void PrintProfile() { Console.WriteLine($"社員番号:{EmployeeId}"); Console.WriteLine($"氏名:{Name}"); Console.WriteLine($"部署:{Department}"); }}実行結果:
社員番号:1001氏名:山田太郎部署:営業部社員番号:1002氏名:佐藤花子部署:開発部employee1 も employee2 も、同じ PrintProfile メソッドを呼び出しています。
ただし、それぞれのオブジェクトが持つ値は異なるため、表示結果も異なります。
処理の意味が分かりやすくなる
Section titled “処理の意味が分かりやすくなる”次のコードを見てください。
employee.PrintProfile();この1行を見るだけで、社員情報を表示していることが分かります。
一方、表示処理を直接書いている場合は、複数行を読まなければ意味を把握しにくくなります。
Console.WriteLine($"社員番号:{employee.EmployeeId}");Console.WriteLine($"氏名:{employee.Name}");Console.WriteLine($"部署:{employee.Department}");メソッドに名前を付けることで、処理の目的を分かりやすくできます。
修正しやすくなる
Section titled “修正しやすくなる”社員情報の表示形式を変更したい場合を考えます。
たとえば、次のように表示したいとします。
[1001] 山田太郎 / 営業部PrintProfile メソッドに表示処理をまとめていれば、修正する場所はメソッドの中だけで済みます。
public void PrintProfile(){ Console.WriteLine($"[{EmployeeId}] {Name} / {Department}");}メソッドを使うと、処理をまとめられるため、後からの変更にも対応しやすくなります。
7-7 変数のスコープ
Section titled “7-7 変数のスコープ”スコープとは
Section titled “スコープとは”スコープとは、変数を使える範囲のことです。
C#では、変数は宣言した場所によって使える範囲が決まります。
基本的には、変数は宣言された { } の中で使えます。
Mainメソッド内の変数
Section titled “Mainメソッド内の変数”次のコードを見てください。
using System;
class Program{ static void Main() { int number = 10;
Console.WriteLine(number); }}number は、Main メソッドの中で宣言されています。
そのため、Main メソッドの中で使えます。
メソッドが違うと使えない
Section titled “メソッドが違うと使えない”次のコードはエラーになります。
using System;
class Program{ static void Main() { int number = 10; }
static void PrintNumber() { Console.WriteLine(number); }}number は Main メソッドの中で宣言された変数です。
そのため、PrintNumber メソッドの中からは使えません。
このように、メソッド内で宣言した変数は、基本的にそのメソッドの中だけで使えます。
同じ名前の変数でも別物
Section titled “同じ名前の変数でも別物”次のコードを入力して実行してください。
using System;
class Program{ static void Main() { int number = 10;
Console.WriteLine(number);
PrintNumber();
Console.WriteLine(number); }
static void PrintNumber() { int number = 123;
Console.WriteLine(number); }}実行結果:
1012310Main メソッドの number と、PrintNumber メソッドの number は、同じ名前ですが別の変数です。
if文の中で宣言した変数
Section titled “if文の中で宣言した変数”次のコードはエラーになります。
using System;
class Program{ static void Main() { int score = 80;
if (score >= 60) { string result = "合格"; }
Console.WriteLine(result); }}result は、if 文の { } の中で宣言されています。
そのため、if 文の外では使えません。
if文の外でも使いたい場合
Section titled “if文の外でも使いたい場合”if 文の外でも使いたい場合は、外側で変数を宣言します。
using System;
class Program{ static void Main() { int score = 80; string result;
if (score >= 60) { result = "合格"; } else { result = "不合格"; }
Console.WriteLine(result); }}実行結果:
合格result を if 文の外で宣言しているため、if 文の後でも使えます。
for文のカウンタ変数
Section titled “for文のカウンタ変数”for 文の中で宣言したカウンタ変数は、for 文の外では使えません。
次のコードはエラーになります。
for (int i = 0; i < 5; i++){ Console.WriteLine(i);}
Console.WriteLine(i);i は for 文の中で宣言されているため、for 文の外では使えません。
スコープを意識する理由
Section titled “スコープを意識する理由”スコープを理解すると、次のようなミスを減らせます。
変数が見つからないエラー同じ名前の変数を別物として扱ってしまうミス必要以上に広い範囲で変数を使ってしまうミス変数は、必要な範囲でだけ使えるようにするのが基本です。
広すぎる範囲で変数を使うと、どこで値が変わったのか分かりにくくなります。
よくあるつまずき
Section titled “よくあるつまずき”この章でよくあるつまずきを確認します。
| つまずき | 原因 | 対応 |
|---|---|---|
| クラスとオブジェクトの違いが分からない | 設計図と実体の区別が曖昧 | クラスは設計図、オブジェクトは実体と考える |
new Employee() の意味が分からない | クラスからオブジェクトを作る処理に慣れていない | new は設計図から実物を作ると考える |
| プロパティと変数の違いが曖昧 | オブジェクトに属する情報かどうかを意識していない | employee.Name のようにオブジェクトに紐づく情報がプロパティ |
メソッドの呼び出しで () を忘れる | プロパティと混同している | メソッド呼び出しには () が付く |
return を書き忘れる | 戻り値のあるメソッドの理解が不十分 | 戻り値の型が string や int の場合は値を返す |
void の意味が分からない | 戻り値の有無を意識していない | void は値を返さないメソッド |
| 変数が使えない場所がある | スコープの範囲外で使っている | 変数を宣言した { } を確認する |
if の中で宣言した変数を外で使えない | ブロック内だけ有効な変数になっている | 外でも使うなら外側で宣言する |
| クラスの中に書く場所が分からない | Program クラスと自作クラスの位置関係に慣れていない | まずは Program クラスの下に自作クラスを書く |
学んだことチェック
Section titled “学んだことチェック”次の項目について、自分で説明できるか確認してください。
- オブジェクト指向とは何かをおおまかに説明できる
- クラスとは何かを説明できる
- オブジェクトとは何かを説明できる
- クラスとオブジェクトの違いを説明できる
-
Employeeクラスのような簡単なクラスを作成できる - クラスにプロパティを定義できる
-
newを使ってオブジェクトを作成できる - オブジェクトのプロパティに値を代入できる
- オブジェクト初期化子を使える
- クラスにメソッドを定義できる
- メソッドを呼び出せる
-
voidの意味をおおまかに説明できる -
returnを使って値を返せる - 引数のあるメソッドを作成できる
- スコープとは何かを説明できる
研修の進め方によっては、隣の人またはチーム内で説明確認を行います。
次の内容を、自分の言葉で説明してください。
- クラスとオブジェクトの違いは何ですか。
new Employee()は何をしているコードですか。- プロパティは何を表しますか。
- メソッドは何を表しますか。
voidはどのような意味ですか。returnは何のために使いますか。- スコープとは何ですか。
if文の中で宣言した変数を外で使えないのはなぜですか。
説明するときは、完全な答えでなくても構いません。
自分の言葉で説明しようとすることが大切です。
この章の演習課題に取り組みます。
制限時間は 70分 です。
時間内にすべて完成しなくても構いません。
できたところまでを保存し、Gitに提出してください。
提出について
制限時間になったら、完成・未完成に関わらず作業を止めます。 できたところまでをGitにcommitし、pushしてください。 未完成の場合は、どこまでできたかを報告できるようにしておきましょう。
まずは、全員が必須課題に取り組んでください。
課題7-1 Employeeクラスを作成する
Section titled “課題7-1 Employeeクラスを作成する”社員情報を表す Employee クラスを作成してください。
Employee クラスには、次のプロパティを定義します。
| プロパティ名 | 型 | 意味 |
|---|---|---|
EmployeeId | int | 社員番号 |
Name | string | 氏名 |
Department | string | 部署 |
Main メソッドで Employee オブジェクトを1つ作成し、プロパティに値を代入して表示してください。
実行結果例:
社員番号:1001氏名:山田太郎部署:営業部条件:
Employeeクラスを作成するnew Employee()を使う- プロパティに値を代入する
- プロパティの値を表示する
課題7-2 オブジェクト初期化子を使う
Section titled “課題7-2 オブジェクト初期化子を使う”課題7-1のコードを、オブジェクト初期化子を使う形に変更してください。
例:
Employee employee = new Employee{ EmployeeId = 1001, Name = "山田太郎", Department = "営業部"};条件:
- オブジェクト初期化子を使う
- 実行結果は課題7-1と同じでよい
課題7-3 PrintProfileメソッドを作成する
Section titled “課題7-3 PrintProfileメソッドを作成する”Employee クラスに、社員情報を表示する PrintProfile メソッドを追加してください。
実行結果例:
社員番号:1001氏名:山田太郎部署:営業部条件:
EmployeeクラスにPrintProfileメソッドを定義するMainメソッドからemployee.PrintProfile();を呼び出す- 表示処理は
PrintProfileメソッドの中に書く
課題7-4 複数の社員オブジェクトを作成する
Section titled “課題7-4 複数の社員オブジェクトを作成する”Employee オブジェクトを2つ作成し、それぞれの社員情報を表示してください。
実行結果例:
社員番号:1001氏名:山田太郎部署:営業部社員番号:1002氏名:佐藤花子部署:開発部条件:
Employeeオブジェクトを2つ作成する- それぞれ異なる値を設定する
PrintProfileメソッドを使って表示する
必須課題が終わった人は、発展課題に取り組んでください。
課題7-5 GetProfileTextメソッドを作成する
Section titled “課題7-5 GetProfileTextメソッドを作成する”Employee クラスに、社員情報を文字列として返す GetProfileText メソッドを作成してください。
実行結果例:
1001:山田太郎(営業部)条件:
- 戻り値の型は
stringにする returnを使うMainメソッド側で戻り値を受け取り、表示する
課題7-6 ChangeDepartmentメソッドを作成する
Section titled “課題7-6 ChangeDepartmentメソッドを作成する”Employee クラスに、部署を変更する ChangeDepartment メソッドを作成してください。
実行結果例:
変更前:営業部変更後:開発部条件:
ChangeDepartmentメソッドにstring型の引数を指定する- 引数で受け取った値を
Departmentプロパティに代入する - 変更前と変更後の部署を表示する
課題7-7 Saleクラスを作成する
Section titled “課題7-7 Saleクラスを作成する”売上情報を表す Sale クラスを作成してください。
Sale クラスには、次のプロパティを定義します。
| プロパティ名 | 型 | 意味 |
|---|---|---|
ProductName | string | 商品名 |
UnitPrice | int | 単価 |
Quantity | int | 数量 |
また、合計金額を返す GetAmount メソッドを作成してください。
実行結果例:
商品名:ノート合計金額:900円条件:
Saleクラスを作成するGetAmountメソッドを作成するGetAmountメソッドではUnitPrice * Quantityを返すMainメソッド側で戻り値を受け取って表示する
課題7-8 配列で複数のEmployeeを扱う
Section titled “課題7-8 配列で複数のEmployeeを扱う”Employee オブジェクトを配列に入れ、foreach 文で全員の情報を表示してください。
実行結果例:
社員番号:1001氏名:山田太郎部署:営業部社員番号:1002氏名:佐藤花子部署:開発部社員番号:1003氏名:鈴木一郎部署:総務部条件:
Employee[]を使うEmployeeオブジェクトを3つ作成するforeach文を使うPrintProfileメソッドを使って表示する
課題7-9 スコープを確認する
Section titled “課題7-9 スコープを確認する”次の条件で、変数のスコープを確認するプログラムを作成してください。
条件:
Mainメソッド内にint number = 10;を定義するPrintNumberメソッド内にint number = 123;を定義する- それぞれの
numberを表示する - 実行結果から、同じ名前でも別の変数であることを確認する
実行結果例:
1012310Gitへの提出
Section titled “Gitへの提出”課題が終わったら、できたところまでをGitに提出します。
まず、現在の状態を確認します。
git status変更されたファイルを追加します。
git add .コミットします。
git commit -m "Chapter07 クラスとオブジェクト指向の基礎"ファイルサーバー上のリポジトリへpushします。
git pushGitの操作でエラーが出た場合は、自己判断で同じ操作を繰り返さず、講師に確認してください。
提出前チェックリスト
Section titled “提出前チェックリスト”提出前に、次の項目を確認してください。
- プログラムをVisual Studioから実行できる
- 自分でクラスを作成できている
- クラスにプロパティを定義できている
-
newを使ってオブジェクトを作成できている - オブジェクトのプロパティに値を代入できている
- オブジェクト初期化子を使えている
- クラスにメソッドを定義できている
- メソッドを呼び出せている
- 戻り値のあるメソッドで
returnを使えている - 引数のあるメソッドを作成できている
- 変数のスコープを意識できている
- インデントが整っている
- Gitにcommitしている
- Gitにpushしている
この章のまとめ
Section titled “この章のまとめ”この章では、クラスとオブジェクト指向プログラミングの基礎について学習しました。
この章で学んだ主な内容は次の通りです。
- オブジェクト指向では、関連する情報と処理を1つのまとまりとして考える
- クラスは、オブジェクトを作るための設計図である
- オブジェクトは、クラスから作られた実体である
- インスタンスは、オブジェクトとほぼ同じ意味で使われる
- プロパティは、オブジェクトが持つ情報を表す
- メソッドは、オブジェクトに行わせる処理を表す
newを使うと、クラスからオブジェクトを作成できる- オブジェクト初期化子を使うと、プロパティの値をまとめて設定できる
voidは、値を返さないメソッドを表すreturnを使うと、メソッドから値を返せる- メソッドには、外部から値を受け取る引数を指定できる
- 変数には使える範囲があり、その範囲をスコープという
- 変数は、宣言された
{ }の中で使える
次章では、静的メソッド、静的プロパティ、静的クラス を学習します。
この章では、オブジェクトを作成してからプロパティやメソッドを使いました。
次章では、Console.WriteLine や int.Parse のように、オブジェクトを作らずに呼び出せる機能について学習します。