Skip to content

第7章 クラス/オブジェクト指向プログラミングの基礎

この章では、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 “この章でできるようになること”

この章を終えると、次のことができるようになります。

  • オブジェクト指向プログラミングの考え方をおおまかに説明できる
  • クラスとは何かを説明できる
  • オブジェクトとは何かを説明できる
  • クラスとオブジェクトの違いを説明できる
  • 自分で簡単なクラスを作成できる
  • クラスにプロパティを定義できる
  • クラスからオブジェクトを作成できる
  • オブジェクトのプロパティに値を代入できる
  • オブジェクトのプロパティを表示できる
  • クラスにメソッドを定義できる
  • メソッドを呼び出せる
  • 戻り値のあるメソッドを作成できる
  • 引数のあるメソッドを作成できる
  • 変数のスコープを説明できる

項目内容
開発環境Visual Studio 2022
プロジェクト種類コンソール アプリ
対象フレームワーク.NET 8
プロジェクト名Chapter07_ClassBasics

作業を始める前に、次の内容を確認してください。

  • Visual Studio 2022でコンソールアプリを作成できる
  • .NET 8.0 を選択できる
  • intstringbool などの変数を使える
  • if 文を使った条件分岐が書ける
  • for 文や foreach 文を使った繰り返しが書ける
  • 配列の基本を説明できる
  • class Programstatic void Main() の形に見慣れている
  • 第6章の内容をGitに提出済みである

オブジェクト指向プログラミングとは、プログラムを もの の集まりとして考える方法です。

ここでいう「もの」は、現実世界にある物体だけではありません。

たとえば、次のようなものもプログラム上の「もの」として扱えます。

社員
商品
注文
顧客
タスク
予約
売上

これらの「もの」には、情報があります。

たとえば、社員には次のような情報があります。

社員番号
氏名
部署
メールアドレス
在籍中かどうか

また、社員に関する処理もあります。

社員情報を表示する
氏名を取得する
部署を変更する
在籍状態を確認する

オブジェクト指向では、このような 情報処理 を1つのまとまりとして扱います。


社員を例にすると、次のように考えられます。

社員
├─ 情報
│ ├─ 社員番号
│ ├─ 氏名
│ └─ 部署
└─ 処理
├─ 社員情報を表示する
└─ 表示用の名前を作る

C#では、このようなまとまりを クラス として定義します。

そして、そのクラスから実際に作られたものを オブジェクト または インスタンス と呼びます。


この章では、まず次のように考えてください。

用語ひとまずの説明
クラス設計図
オブジェクト設計図から作られた実物
プロパティオブジェクトが持つ情報
メソッドオブジェクトに行わせる処理

たとえば、社員クラスを設計図と考えると、実際の社員データがオブジェクトです。

Employeeクラス
社員を表す設計図
employee1
山田太郎さんを表すオブジェクト
employee2
佐藤花子さんを表すオブジェクト

まず、クラスを使わずに社員情報を扱ってみます。

using System;
class Program
{
static void Main()
{
int employeeId = 1001;
string name = "山田太郎";
string department = "営業部";
Console.WriteLine($"社員番号:{employeeId}");
Console.WriteLine($"氏名:{name}");
Console.WriteLine($"部署:{department}");
}
}

実行結果:

社員番号:1001
氏名:山田太郎
部署:営業部

このコードは問題なく動作します。

しかし、社員が増えるとどうなるでしょうか。


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人分の情報がまとまっていない
変数名が増えて読みにくい
表示処理が重複している
後から項目を追加しにくい

たとえば、メールアドレスを追加したくなった場合、すべての社員について変数と表示処理を追加しなければなりません。


配列を使うと、複数の値をまとめられます。

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つのまとまりになっていない

そこで、クラスを使います。


社員情報をまとめて扱うために、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
氏名:山田太郎
部署:営業部

次の部分が、社員を表すクラスです。

class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public string Department { get; set; }
}

Employee クラスには、次の3つの情報を持たせています。

プロパティ意味
EmployeeIdint社員番号
Namestring氏名
Departmentstring部署

このように、クラスの中に定義した情報を表すものを プロパティ と呼びます。


プロパティは、オブジェクトが持つ情報を表します。

public int EmployeeId { get; set; }
public string Name { get; set; }
public string Department { get; set; }

この段階では、次のように理解してください。

プロパティ
→ オブジェクトが持っている情報

社員オブジェクトであれば、社員番号、氏名、部署がプロパティです。


次のコードは、Employee クラスからオブジェクトを作成しています。

Employee employee = new Employee();

new Employee() によって、Employee クラスをもとにした実際のオブジェクトが作られます。

Employeeクラス
↓ new
employeeオブジェクト

作成したオブジェクトのプロパティには、次のように値を代入できます。

employee.EmployeeId = 1001;
employee.Name = "山田太郎";
employee.Department = "営業部";

これは、employee オブジェクトが持つ EmployeeIdNameDepartment に値を入れています。


プロパティの値は、変数と同じように参照できます。

Console.WriteLine($"社員番号:{employee.EmployeeId}");
Console.WriteLine($"氏名:{employee.Name}");
Console.WriteLine($"部署:{employee.Department}");

第6章では、配列の LengthGetLength() の違いに少し触れました。

scores.Length
scores.GetLength(0)

この章では、次のように考えてください。

種類ひとまずの見方
プロパティemployee.Name情報を参照している
メソッドemployee.PrintProfile()処理を呼び出している

プロパティは情報、メソッドは処理です。

詳しい仕組みは後の章でも扱いますが、まずはこの区別を意識しましょう。


7-4 クラスとオブジェクトの違い

Section titled “7-4 クラスとオブジェクトの違い”

クラスは、オブジェクトを作るための設計図です。

class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public string Department { get; set; }
}

このコードは、「社員は社員番号、氏名、部署を持つ」という設計を表しています。

ただし、これを書いただけでは、まだ具体的な社員データは存在しません。


new を使うと、クラスからオブジェクトを作成できます。

Employee employee1 = new Employee();
Employee employee2 = new Employee();

employee1employee2 は、どちらも Employee クラスから作られた別々のオブジェクトです。


次のコードを入力して実行してください。

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
氏名:佐藤花子
部署:開発部

employee1employee2 は、同じ Employee クラスから作られていますが、それぞれ別の値を持っています。


プロパティへの代入は、オブジェクトを作るときにまとめて書くこともできます。

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
氏名:山田太郎
部署:営業部

オブジェクト初期化子を使うと、オブジェクト作成時にプロパティの値をまとめて設定できます。


用語意味
クラス設計図Employee
オブジェクト設計図から作られた実体employee1
インスタンスオブジェクトとほぼ同じ意味で使われるnew Employee() で作られたもの
プロパティオブジェクトが持つ情報NameDepartment

この章では、オブジェクトとインスタンスはほぼ同じ意味として扱って構いません。


メソッドは、処理をまとめたものです。

これまでにも、メソッドを呼び出してきました。

Console.WriteLine("こんにちは");
Console.ReadLine();
int.Parse(input);

これらは、C#や.NETが用意しているメソッドです。

この章では、自分でクラスの中にメソッドを定義します。


社員情報を表示する処理を、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
氏名:山田太郎
部署:営業部

次の部分が、Employee クラスに定義したメソッドです。

public void PrintProfile()
{
Console.WriteLine($"社員番号:{EmployeeId}");
Console.WriteLine($"氏名:{Name}");
Console.WriteLine($"部署:{Department}");
}

このメソッドは、社員情報を表示する処理をまとめています。


メソッドを使うには、次のように呼び出します。

employee.PrintProfile();

これは、employee オブジェクトに対して「プロフィールを表示してください」とお願いしているイメージです。

employee.PrintProfile();
employeeの社員情報を表示する

PrintProfile メソッドの定義には、void が書かれています。

public void PrintProfile()

void は、このメソッドが値を返さないことを表します。

この章では、次のように理解してください。

void
→ 処理は行うが、呼び出し元に値は返さない

PrintProfile は画面表示を行いますが、計算結果のような値を返すわけではありません。


メソッドは、処理結果を呼び出し元に返すこともできます。

次の例では、社員情報の表示用文字列を返す 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 は、メソッドの結果を呼び出し元に返すために使います。

public string GetProfileText()
{
return $"{EmployeeId}{Name}{Department}";
}

このメソッドは、string 型の値を返します。

そのため、メソッド名の前に string と書いています。

public string GetProfileText()

メソッドには、外部から値を渡すこともできます。

次の例では、部署名を変更する 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 に代入

次は、売上情報を表す 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 型の値として返します。


同じ処理を何度も書かなくてよい

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
氏名:佐藤花子
部署:開発部

employee1employee2 も、同じ PrintProfile メソッドを呼び出しています。

ただし、それぞれのオブジェクトが持つ値は異なるため、表示結果も異なります。


処理の意味が分かりやすくなる

Section titled “処理の意味が分かりやすくなる”

次のコードを見てください。

employee.PrintProfile();

この1行を見るだけで、社員情報を表示していることが分かります。

一方、表示処理を直接書いている場合は、複数行を読まなければ意味を把握しにくくなります。

Console.WriteLine($"社員番号:{employee.EmployeeId}");
Console.WriteLine($"氏名:{employee.Name}");
Console.WriteLine($"部署:{employee.Department}");

メソッドに名前を付けることで、処理の目的を分かりやすくできます。


社員情報の表示形式を変更したい場合を考えます。

たとえば、次のように表示したいとします。

[1001] 山田太郎 / 営業部

PrintProfile メソッドに表示処理をまとめていれば、修正する場所はメソッドの中だけで済みます。

public void PrintProfile()
{
Console.WriteLine($"[{EmployeeId}] {Name} / {Department}");
}

メソッドを使うと、処理をまとめられるため、後からの変更にも対応しやすくなります。


スコープとは、変数を使える範囲のことです。

C#では、変数は宣言した場所によって使える範囲が決まります。

基本的には、変数は宣言された { } の中で使えます。


次のコードを見てください。

using System;
class Program
{
static void Main()
{
int number = 10;
Console.WriteLine(number);
}
}

number は、Main メソッドの中で宣言されています。

そのため、Main メソッドの中で使えます。


次のコードはエラーになります。

using System;
class Program
{
static void Main()
{
int number = 10;
}
static void PrintNumber()
{
Console.WriteLine(number);
}
}

numberMain メソッドの中で宣言された変数です。

そのため、PrintNumber メソッドの中からは使えません。

このように、メソッド内で宣言した変数は、基本的にそのメソッドの中だけで使えます。


次のコードを入力して実行してください。

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);
}
}

実行結果:

10
123
10

Main メソッドの number と、PrintNumber メソッドの number は、同じ名前ですが別の変数です。


次のコードはエラーになります。

using System;
class Program
{
static void Main()
{
int score = 80;
if (score >= 60)
{
string result = "合格";
}
Console.WriteLine(result);
}
}

result は、if 文の { } の中で宣言されています。

そのため、if 文の外では使えません。


if 文の外でも使いたい場合は、外側で変数を宣言します。

using System;
class Program
{
static void Main()
{
int score = 80;
string result;
if (score >= 60)
{
result = "合格";
}
else
{
result = "不合格";
}
Console.WriteLine(result);
}
}

実行結果:

合格

resultif 文の外で宣言しているため、if 文の後でも使えます。


for 文の中で宣言したカウンタ変数は、for 文の外では使えません。

次のコードはエラーになります。

for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
Console.WriteLine(i);

ifor 文の中で宣言されているため、for 文の外では使えません。


スコープを理解すると、次のようなミスを減らせます。

変数が見つからないエラー
同じ名前の変数を別物として扱ってしまうミス
必要以上に広い範囲で変数を使ってしまうミス

変数は、必要な範囲でだけ使えるようにするのが基本です。

広すぎる範囲で変数を使うと、どこで値が変わったのか分かりにくくなります。


この章でよくあるつまずきを確認します。

つまずき原因対応
クラスとオブジェクトの違いが分からない設計図と実体の区別が曖昧クラスは設計図、オブジェクトは実体と考える
new Employee() の意味が分からないクラスからオブジェクトを作る処理に慣れていないnew は設計図から実物を作ると考える
プロパティと変数の違いが曖昧オブジェクトに属する情報かどうかを意識していないemployee.Name のようにオブジェクトに紐づく情報がプロパティ
メソッドの呼び出しで () を忘れるプロパティと混同しているメソッド呼び出しには () が付く
return を書き忘れる戻り値のあるメソッドの理解が不十分戻り値の型が stringint の場合は値を返す
void の意味が分からない戻り値の有無を意識していないvoid は値を返さないメソッド
変数が使えない場所があるスコープの範囲外で使っている変数を宣言した { } を確認する
if の中で宣言した変数を外で使えないブロック内だけ有効な変数になっている外でも使うなら外側で宣言する
クラスの中に書く場所が分からないProgram クラスと自作クラスの位置関係に慣れていないまずは Program クラスの下に自作クラスを書く

次の項目について、自分で説明できるか確認してください。

  • オブジェクト指向とは何かをおおまかに説明できる
  • クラスとは何かを説明できる
  • オブジェクトとは何かを説明できる
  • クラスとオブジェクトの違いを説明できる
  • Employee クラスのような簡単なクラスを作成できる
  • クラスにプロパティを定義できる
  • new を使ってオブジェクトを作成できる
  • オブジェクトのプロパティに値を代入できる
  • オブジェクト初期化子を使える
  • クラスにメソッドを定義できる
  • メソッドを呼び出せる
  • void の意味をおおまかに説明できる
  • return を使って値を返せる
  • 引数のあるメソッドを作成できる
  • スコープとは何かを説明できる

研修の進め方によっては、隣の人またはチーム内で説明確認を行います。

次の内容を、自分の言葉で説明してください。

  1. クラスとオブジェクトの違いは何ですか。
  2. new Employee() は何をしているコードですか。
  3. プロパティは何を表しますか。
  4. メソッドは何を表しますか。
  5. void はどのような意味ですか。
  6. return は何のために使いますか。
  7. スコープとは何ですか。
  8. if 文の中で宣言した変数を外で使えないのはなぜですか。

説明するときは、完全な答えでなくても構いません。
自分の言葉で説明しようとすることが大切です。


この章の演習課題に取り組みます。

制限時間は 70分 です。

時間内にすべて完成しなくても構いません。
できたところまでを保存し、Gitに提出してください。

提出について

制限時間になったら、完成・未完成に関わらず作業を止めます。 できたところまでをGitにcommitし、pushしてください。 未完成の場合は、どこまでできたかを報告できるようにしておきましょう。


まずは、全員が必須課題に取り組んでください。


課題7-1 Employeeクラスを作成する

Section titled “課題7-1 Employeeクラスを作成する”

社員情報を表す Employee クラスを作成してください。

Employee クラスには、次のプロパティを定義します。

プロパティ名意味
EmployeeIdint社員番号
Namestring氏名
Departmentstring部署

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 プロパティに代入する
  • 変更前と変更後の部署を表示する

売上情報を表す Sale クラスを作成してください。

Sale クラスには、次のプロパティを定義します。

プロパティ名意味
ProductNamestring商品名
UnitPriceint単価
Quantityint数量

また、合計金額を返す 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 メソッドを使って表示する

次の条件で、変数のスコープを確認するプログラムを作成してください。

条件:

  • Main メソッド内に int number = 10; を定義する
  • PrintNumber メソッド内に int number = 123; を定義する
  • それぞれの number を表示する
  • 実行結果から、同じ名前でも別の変数であることを確認する

実行結果例:

10
123
10

課題が終わったら、できたところまでをGitに提出します。

まず、現在の状態を確認します。

Terminal window
git status

変更されたファイルを追加します。

Terminal window
git add .

コミットします。

Terminal window
git commit -m "Chapter07 クラスとオブジェクト指向の基礎"

ファイルサーバー上のリポジトリへpushします。

Terminal window
git push

Gitの操作でエラーが出た場合は、自己判断で同じ操作を繰り返さず、講師に確認してください。


提出前に、次の項目を確認してください。

  • プログラムをVisual Studioから実行できる
  • 自分でクラスを作成できている
  • クラスにプロパティを定義できている
  • new を使ってオブジェクトを作成できている
  • オブジェクトのプロパティに値を代入できている
  • オブジェクト初期化子を使えている
  • クラスにメソッドを定義できている
  • メソッドを呼び出せている
  • 戻り値のあるメソッドで return を使えている
  • 引数のあるメソッドを作成できている
  • 変数のスコープを意識できている
  • インデントが整っている
  • Gitにcommitしている
  • Gitにpushしている

この章では、クラスとオブジェクト指向プログラミングの基礎について学習しました。

この章で学んだ主な内容は次の通りです。

  • オブジェクト指向では、関連する情報と処理を1つのまとまりとして考える
  • クラスは、オブジェクトを作るための設計図である
  • オブジェクトは、クラスから作られた実体である
  • インスタンスは、オブジェクトとほぼ同じ意味で使われる
  • プロパティは、オブジェクトが持つ情報を表す
  • メソッドは、オブジェクトに行わせる処理を表す
  • new を使うと、クラスからオブジェクトを作成できる
  • オブジェクト初期化子を使うと、プロパティの値をまとめて設定できる
  • void は、値を返さないメソッドを表す
  • return を使うと、メソッドから値を返せる
  • メソッドには、外部から値を受け取る引数を指定できる
  • 変数には使える範囲があり、その範囲をスコープという
  • 変数は、宣言された { } の中で使える

次章では、静的メソッド、静的プロパティ、静的クラス を学習します。

この章では、オブジェクトを作成してからプロパティやメソッドを使いました。
次章では、Console.WriteLineint.Parse のように、オブジェクトを作らずに呼び出せる機能について学習します。