擬似言語のクラスとメソッドの読み方|科目Bで出るメンバ変数・コンストラクタを解説
クラス、メンバ変数、コンストラクタ。用語が並んだ瞬間に、問題文が読めなくなる。
擬似言語の問題を開いたら、いつもの手続とは違う書き出しだった、という経験はありませんか?
配列と繰返しなら追えるようになったのに、クラスと書かれた行が出てきたとたん、どこから読めばいいのか分からなくなる。そんな相談をよく受けます。
でも大丈夫です。クラスは新しい難しい仕組みではなく、これまで別々に置いていた変数と手続を、一つの箱にまとめただけのものです。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。実務のコードはほとんどがクラスで組み立てられていて、どの箱がどのデータを持っているかを見失うと、修正すべき場所すらたどり着けません。
裏を返せば、箱の中身さえ把握できれば読み方は今までと同じです。処理を一行ずつ追う作業に変わりはありません。
この記事では、擬似言語のクラスを、部品の名前を押さえるところから順に組み立てていきます。
擬似言語のクラスとは、データと処理をまとめた箱¶
まずは全体像から押さえましょう。クラスとは、関係のあるデータと、そのデータを扱う処理を一つにまとめた部品のことです。
たとえば商品を扱うプログラムなら、名前と価格というデータがあり、税込価格を計算するという処理があります。これらはいつも一緒に使われます。
ばらばらの変数として置くより、商品という箱にまとめておくほうが扱いやすい。この考え方がクラスです。
擬似言語では、その箱に入っているデータをメンバ変数、箱が持っている処理をメソッドと呼びます。呼び名が変わっただけで、正体は変数と手続です。
用語の対応が頭に入っていないと、問題文の一行目でつまずきます。ここで一度整理しておきましょう。
| 擬似言語での呼び名 | これまでの呼び名 | 役割 |
|---|---|---|
| クラス | ― | データと処理をまとめた設計図 |
| メンバ変数 | 変数 | その箱が持っているデータ |
| メソッド | 手続・関数 | その箱が持っている処理 |
| コンストラクタ | ― | 箱を作るときの初期設定 |
| インスタンス | ― | 設計図から実際に作られた箱 |
見比べると、新しく覚える言葉は三つだけだと分かります。メンバ変数とメソッドは、名前が違うだけの旧知の相手です。
設計図と実物の違い¶
少しだけ引っかかりやすいのが、クラスとインスタンスの関係でしょう。ここは家の図面と、建った家の関係にたとえると腑に落ちます。
クラスは図面です。商品という箱には名前と価格が入る、と決めているだけで、まだ中身はありません。
実際にノートという名前と200という価格を持った箱が作られたとき、それがインスタンスです。図面は一枚でも、家は何軒でも建てられます。
問題文では、すでに作られたインスタンスが変数に入った状態で渡されることがよくあります。その場合、図面のほうを読むのは中身の型を確かめるときだけで十分です。
同じ図面から作られた箱でも、中身はそれぞれ別に持っています。ノートの箱の価格を書き換えても、鉛筆の箱の価格は影響を受けません。
変数の型としてクラス名が出てくる¶
もう一つ、初見で戸惑うのが宣言の書き方です。整数型や文字列型が来るはずの場所に、クラス名が書かれていることがあります。
これは、その変数には商品の箱が入る、という意味です。型の位置に来るものが増えただけだと考えてください。
宣言の読み方そのものがあいまいなままだと、この先で必ず迷います。整数型や論理型の書き分けに不安がある人は、こちらで土台を固めておくと読みやすくなります。
【関連記事】擬似言語の変数宣言とデータ型の読み方|整数型・実数型・文字列型・論理型の違いを解説
クラスの定義を実際に読んでみる¶
ここから具体的なコードを見ていきます。商品を表すクラスを、宣言の部分から順に読んでみましょう。
クラス: 商品
メンバ変数
文字列型: 名前
整数型: 価格
コンストラクタ
商品(文字列型: n, 整数型: p)
名前 ← n
価格 ← p
メソッド
○整数型: 税込価格()
return 価格 + 価格 × 10 ÷ 100
三つの区画に分かれています。上からデータの一覧、箱を作るときの手順、箱が持つ処理という並びです。
メンバ変数の欄は、いつもの変数宣言とまったく同じ形をしています。文字列型の名前と、整数型の価格を持つ箱だと宣言しているだけです。
税込価格のところも、戻り値のある関数の書き方そのものです。引数を取らず、自分が持っている価格を使って計算し、その結果を返しています。
ここで注目したいのは、税込価格の中に価格という変数がどこにも宣言されていない点です。これはメンバ変数の価格を指しています。
同じ箱の中にあるデータは、わざわざ引数で受け取らなくても使えます。これがクラスにまとめる最大の利点です。
引数と戻り値の関係があいまいだと、メソッドの読み方も揺らぎます。手続と関数の違いを一度整理しておくと、この形がすんなり入ってきます。
【関連記事】擬似言語の手続と関数の違いとは?引数・戻り値と変数の有効範囲を解説
コンストラクタは箱を作るときの初期設定¶
真ん中のコンストラクタが、いちばん見慣れない部分でしょう。これは箱が作られる瞬間に一度だけ動く、特別なメソッドです。
名前がクラス名と同じになっているのが目印です。商品というクラスなら、コンストラクタの名前も商品になります。
役割は初期設定です。受け取った値をメンバ変数に入れて、使える状態の箱に仕上げます。
上の例では、引数で受け取ったnとpを、それぞれ名前と価格に代入しています。この二行が終わった時点で、箱の中身が決まります。
問題によっては、引数とメンバ変数に同じ名前を使い、thisを付けて区別する書き方も出てきます。その場合もやっていることは同じで、外から来た値を自分の中に取り込んでいるだけです。
点(.)は箱の中をたどる記号¶
クラスが出てくる問題では、変数の後ろに点が付いた書き方が頻繁に登場します。この点の意味を押さえれば、読解の山は越えたようなものです。
点は、その箱の中にあるものを指す記号です。商品Aという箱の価格を見たいなら、商品A.価格 と書きます。
配列の添字と役割が似ています。配列が何番目かで中身を指すのに対して、点は名前で中身を指すという違いだけです。
メソッドを呼ぶときも同じ形です。商品A.税込価格() と書けば、その箱が持つ計算処理が動きます。
配列の添字とあわせて整理しておくと、指し方の違いが立体的に見えてきます。要素の位置で迷いやすい人は、こちらも読んでおいてください。
【関連記事】擬似言語の配列と添字がわからない人へ|要素数・二次元配列の読み方を解説
大域変数で渡されたインスタンスを扱う¶
科目Bの問題では、あらかじめ用意されたインスタンスが大域変数に入った状態で出題されることがあります。ここが実戦で読む形です。
大域変数とは、プログラム全体のどこからでも使える変数のことです。問題文に、この変数にはこういうデータが入っていると説明が添えられます。
次のコードは、大域変数として渡された商品の箱を使って、指定した個数ぶんの税込合計を求める処理です。
大域: 商品: 対象商品
○整数型: 税込合計(整数型: 個数)
整数型: 小計
小計 ← 対象商品.価格 × 個数
return 小計 + 小計 × 10 ÷ 100
一行目で、対象商品という大域変数に商品の箱が入ると宣言しています。中身が何なのかは問題文が教えてくれます。
処理の中では、対象商品.価格 という形で箱の中の値を取り出しています。取り出した後は、ただの整数として計算しているだけです。
読むときのコツは、点から先をひとかたまりの値として見ることです。対象商品.価格 を、単に価格という数値だと思って読み進めれば、いつもの計算と変わりません。
慣れないうちは、問題用紙の余白に 対象商品.価格 は200 と書き出してしまうのも手です。そのメモがあれば、以降は数値だけを見て計算を進められます。
もう一つ、箱の中身が処理の途中で書き換わるかどうかにも目を配ってください。読み取るだけなら値は変わりませんが、代入の左側に点付きの名前が来ていたら、その時点で箱の中身が更新されます。
値の動きを表で追う¶
言葉だけでは動きがつかみにくいところでしょう。対象商品の価格が200、個数が3のときに、どう進むかを表にします。
| 行 | 実行内容 | 小計 | 戻り値 |
|---|---|---|---|
| 開始前 | 対象商品.価格 は 200 | 未定 | ― |
| 小計への代入 | 200 × 3 | 600 | ― |
| return | 600 + 600 × 10 ÷ 100 | 600 | 660 |
点が付いた書き方でも、表に起こしてしまえば普通の変数と同じだと分かります。最初の一行で値を確定させてしまうのがコツです。
この一枚を書く習慣があるかどうかで、クラスが出てくる問題の正答率は大きく変わります。書き方の手順に自信がない人は、こちらの記事が助けになります。
【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説
配列で持つ場合と何が違うのか¶
同じデータは、クラスを使わずに配列で持つこともできます。両者を並べると、クラスが選ばれる理由が見えてきます。
| 項目 | 配列で持つ場合 | クラスで持つ場合 |
|---|---|---|
| 名前の指し方 | 名前[1], 価格[1] | 商品A.名前, 商品A.価格 |
| 対応づけ | 添字が同じもの同士 | 同じ箱の中にある |
| ずれの起きやすさ | 添字を間違えると崩れる | 箱ごと動くので崩れにくい |
| 処理の置き場所 | 別の手続として外に置く | メソッドとして箱の中に置く |
配列は位置で結びつけ、クラスは箱で結びつけます。データが増えるほど、箱にまとめたほうが取り違えが起きにくくなります。
試験の場では、どちらが優れているかを考える必要はありません。問題文がどちらの形で渡してきたかを見て、その指し方に合わせて読むだけで十分です。
実務でも、関連する値をばらばらの変数で持ち回った結果、片方だけ更新されて食い違う不具合をよく見てきました。まとめておく設計には、それを防ぐ狙いがあります。
Giji Academy の擬似言語シミュレーターなら、こうした処理を一行ずつ進めながら、変数の値が切り替わる瞬間を目で追えます。点の付いた書き方に慣れるには、実際に動かしてみるのがいちばんの近道です。
つまずきやすい場所を三つ¶
最後に、クラスが出てくる問題で私が目にしてきたつまずきを挙げておきます。どれも仕組みの誤解ではなく、読み方の癖の問題です。
一つ目は、クラスの定義を隅から隅まで理解しようとしてしまうことです。設問で問われているのは多くの場合その中の一つのメソッドで、定義全体は辞書のように必要な箇所だけ引けば足ります。
二つ目は、点の左側を読み飛ばすことです。商品A.価格 と 商品B.価格 は別物なので、どの箱の話をしているかを毎回確かめる必要があります。
三つ目は、メソッドの中に出てくる変数の出どころを取り違えることです。引数なのか、メソッドの中で宣言した変数なのか、メンバ変数なのかで、値の残り方が変わります。
判断に迷ったら、メソッドの宣言行と、その上のメンバ変数の欄を見比べてください。どちらにも載っていない名前なら、メソッドの中で宣言された一時的な変数です。
こうした読み違いは、慌てているときほど起こります。確認の型を持っておくと、失点がぐっと減ります。
【関連記事】擬似言語でケアレスミスが多い人へ|よくある間違いと確認方法
なお、箱と箱を点でつないでいく考え方は、連結リストの問題でそのまま使います。次の要素をたどる処理に不安がある人は、あわせて読んでおくと理解が重なります。
【関連記事】擬似言語のリスト(連結リスト)がわからない人へ|ノードと参照のたどり方を解説
まとめ¶
ここまでの内容を振り返ります。
クラスは、関係のあるデータと処理を一つの箱にまとめた部品です。箱が持つデータをメンバ変数、箱が持つ処理をメソッドと呼びます。
コンストラクタは、箱が作られる瞬間に一度だけ動く初期設定の処理でした。名前がクラス名と同じになっているのが目印です。
点は、箱の中にあるものを名前で指す記号です。対象商品.価格 のような書き方は、ひとかたまりの値として読み進めれば怖くありません。
科目Bでは、すでに用意されたインスタンスが大域変数として渡される形が出てきます。中身は問題文が説明してくれるので、そこを読んでから処理に入るのが安全です。
新しい用語が並ぶと身構えてしまいますが、動いているのはこれまでどおりの代入と条件分岐と繰返しです。今日の一問から、この点の左側はどの箱かと口に出して確かめてみてください。