科目Bのクラス・オブジェクト問題の解き方|インスタンスの中身を表で追う

公開日: 2026-10-04

この記事を共有

クラスとかインスタンスとか出てくると、どの変数が何を持っているのか分からなくなる。

科目Bで、ドットの付いた変数がたくさん並ぶコードを見て、手が止まったことはありませんか?

配列やループの問題なら追えるのに、クラスが出てくると急に別の言語を読んでいる気分になる。そう感じている人は多いのではないでしょうか。

大丈夫です。クラスの問題で必要なのは、オブジェクト指向の難しい理論ではありません。変数と、変数が指している箱を分けて表に書く、という手順だけです。

私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。実務のコードはほとんどがクラスでできていて、ユーザーや注文といったデータを1つの箱にまとめて扱っています。

そこで起きる不具合の多くは、2つの変数が同じ箱を指していることに気づかず、片方を書き換えてしまうことが原因です。この記事では、その見落としを防ぐ読み方を、科目Bの解き方に合わせて5つの段階で紹介します。

科目B全体の中で、クラスのような題材がどんな位置にあるのかを先に確かめたい人は、親記事から読んでおくと流れがつかみやすくなります。

【関連記事】基本情報技術者試験の科目Bとは?擬似言語・アルゴリズム対策を初心者向けに解説

クラスの問題は何を聞いているのか

最初に、クラスの問題がどんな形で出てくるのかを押さえておきましょう。何を問われているのかが分かれば、読むべき場所は自然と絞られます。

クラスとは、いくつかの変数と、それを操作する処理をひとまとめにした設計図のことです。設計図から実際に作られた1つ1つの箱を、インスタンスやオブジェクトと呼びます。

科目Bでクラスが出るとき、クラスそのものの書き方が問われることはあまりありません。問われるのは、クラスを使った処理を実行したあと、どの箱にどんな値が入っているかです。

よく出る題材と問われ方

クラスを使った問題には、いくつかの決まった型があります。代表的なものを表にまとめました。

題材 クラスの中身 問われやすいこと
連結リスト 値と次の要素への参照 要素を追加・削除したあとの並び
木構造 値と左右の子への参照 たどる順番、出力される値
データのまとまり 名前や個数などの項目 メソッドを呼んだあとの値
状態を持つ処理 カウンタや合計など 何回か呼び出したあとの結果

表のとおり、どの題材でも最後に問われるのは箱の中身です。クラスの問題は、箱の中身を正しく追えるかを確かめる問題だと考えてください。

変数は箱そのものではなく矢印

クラスの問題を読むうえで、いちばん大切な考え方があります。クラス型の変数は、箱そのものではなく、箱を指す矢印だということです。

整数型の変数なら、変数の中に数字がそのまま入っています。けれども、クラス型の変数に入っているのは、どの箱を指しているかという情報だけです。

そのため、クラス型の変数を別の変数に代入しても、箱はコピーされません。矢印が1本増えて、2つの変数が同じ箱を指すようになるだけです。

この一点を押さえておくだけで、クラスの問題の半分は解けたようなものです。メンバ変数やコンストラクタといった文法そのものを確認したい場合は、こちらの記事で先に整理しておくと安心です。

【関連記事】擬似言語のクラスとメソッドの読み方|科目Bで出るメンバ変数・コンストラクタを解説

まず目を付ける場所

設問の意味がつかめたら、次はコードのどこから読むかを決めます。クラスの問題では、目を付ける場所が3つあります。

ひとつ目はクラスの説明、ふたつ目は箱が作られる行、みっつ目は代入で矢印が付け替わる行です。この順番で見ていくと、全体の流れがはっきりします。

クラスの説明で箱の形をつかむ

科目Bでクラスが出てくるときは、問題文の中にクラスの説明が表の形で添えられていることが多くあります。メンバ変数の名前と型、コンストラクタの引数、メソッドの働きが書かれた部分です。

ここで確かめたいのは、箱の中にどんな項目があるかです。たとえば値と次の要素という2つの項目があるなら、トレース表にもその2つの列を用意します。

コードを読み始める前に、この説明を1分だけ眺めておくと、あとで出てくるドット付きの変数が何を表しているのかで迷わなくなります。

箱が作られる行と矢印が付け替わる行

次に見るのは、クラス名に引数を付けて呼んでいる行です。コンストラクタを呼んでいるこの行で、新しい箱が1つ作られます。

反対に、クラス型の変数どうしを代入している行では、箱は増えません。矢印の向きが変わるだけです。

この2種類の行を区別して読むのが、クラスの問題のいちばんのコツです。新しい箱ができる行に印を付けておくと、箱がいくつあるのかがすぐに数えられます。

例題:箱の中身はいくつになるか

ここからは、実際の例題で追い方を確かめます。この記事の例題は説明のために作成したもので、IPA の公開問題そのものではありません。

まず、例題で使うクラスの説明です。科目Bの問題文と同じように、表の形で示します。

項目 内容
クラス名 Box
メンバ変数 count(整数型):箱に入っている個数
コンストラクタ Box(整数型: n):count を n で初期化する
メソッド add(整数型: n):count に n を加える

このクラスを使って、次の関数を実行します。関数が返す値はいくつになるでしょうか?

○整数型: main()
  Box: a ← Box(3)
  Box: b ← Box(5)
  Box: c ← a
  a.add(2)
  c.add(4)
  b ← c
  b.add(1)
  return a.count

一見すると、a には 2 しか足していないので、答えは 5 になりそうに見えます。けれども、本当にそうでしょうか?

新しい箱ができる行に印を付ける

まずは、Box(3) と Box(5) の2行に印を付けます。この関数で作られる箱は、この2つだけです。

3行目の c ← a は、新しい箱を作っていません。c が、a と同じ箱を指すようになるだけです。

6行目の b ← c も同じです。b はもともと指していた箱から離れて、c と同じ箱を指すようになります。

変数と箱を分けてトレース表で追う

では、実際にトレース表を書いてみましょう。クラスの問題では、変数の列と箱の列を分けて書くのがコツです。

箱には、作られた順に箱1、箱2と名前を付けます。変数の列には、その変数がどの箱を指しているかを書きます。

実行した行 a b c 箱1の count 箱2の count
a ← Box(3) 箱1 ― ― 3 ―
b ← Box(5) 箱1 箱2 ― 3 5
c ← a 箱1 箱2 箱1 3 5
a.add(2) 箱1 箱2 箱1 5 5
c.add(4) 箱1 箱2 箱1 9 5
b ← c 箱1 箱1 箱1 9 5
b.add(1) 箱1 箱1 箱1 10 5

最後に a.count を返すので、答えは 10 です。a と c と b が、最終的にすべて箱1を指していたからです。

表にすると矢印の動きが見える

表を見ると、変数の列は途中で何度か変わっていますが、箱の列は add を呼んだときにしか変わっていません。代入で動くのは矢印、メソッドで動くのは箱の中身、とはっきり分かれています。

箱2の count は 5 のまま残っています。b ← c のあと、箱2を指す変数はなくなりましたが、箱の中身が消えたわけではありません。

頭の中だけで追うと、この区別がすぐにあいまいになります。トレース表の書き方そのものに不安がある場合は、こちらの記事で基本から確認できます。

【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説

箱が増える問題は図も添える

連結リストや木構造のように、箱の中に別の箱への矢印が入っている問題もあります。そうした問題では、表に加えて、箱を四角で描いて矢印でつなぐ図を添えると追いやすくなります。

考え方は、この記事の例題とまったく同じです。矢印が付け替わる行と、箱の中身が変わる行を分けて読みます。

箱どうしを矢印でつなぐ問題の追い方は、こちらの記事でくわしく扱っています。

【関連記事】科目Bの連結リスト問題の解き方|nextを図にして追う

間違いやすい選択肢の見分け方

クラスの問題では、よくある勘違いをそのまま答えにした選択肢が並びます。どんな勘違いが狙われやすいのかを知っておけば、選択肢を見た瞬間に候補を絞れます。

例題の関数について、勘違いごとに出てくる答えを表にまとめました。

勘違いの種類 頭の中で起きていること 出てくる答え
代入で箱がコピーされると思う c と a が別の箱になる 5
b ← c を見落とす b.add(1) が箱2に効くと思う 9
最後の代入だけを見る b の中身を答えにしてしまう 10 だが理由が違う
コンストラクタを読み飛ばす 初期値を 0 と思い込む 7

この中でも、特によく狙われるのが、代入で箱がコピーされるという思い込みです。順番に見ていきましょう。

代入で箱がコピーされるという思い込み

整数型の変数に慣れていると、c ← a で a の中身が c に写されたように感じます。その感覚のまま読むと、c.add(4) は a とは関係のない箱に効くことになり、答えは 5 になります。

選択肢に、メソッドの呼び出しを1つ分しか反映していない値があったら、この思い込みを狙ったものだと考えてください。代入した変数が同じ箱を指していないか、トレース表の変数の列で確かめれば見分けられます。

実務でも、この勘違いはよく見かけます。私も駆け出しのころ、元のデータを残しておくつもりで変数に代入し、そのあと書き換えたら元のデータまで変わってしまったことがありました。

同じ答えでも理由が合っているか

表の3行目のように、間違った考え方でも、たまたま正しい答えにたどり着くことがあります。この例題では、b の中身を答えにしても 10 になってしまいます。

試験では答えが合っていれば点になります。けれども、理由が違ったまま覚えてしまうと、少し形を変えた問題で必ず間違えます。

練習のときは、答えが合ったかどうかだけでなく、トレース表の変数の列が自分の予想どおりだったかも確かめてください。そこが合っていれば、本番で問題の形が変わっても落ち着いて追えます。

未定義の矢印に気をつける

クラスの問題では、どの箱も指していない変数が出てくることがあります。科目Bの擬似言語では、こうした状態を未定義の値として扱います。

未定義の変数に対してメソッドを呼んだり、メンバ変数を読んだりすることはできません。そのため、コードには未定義かどうかを先に確かめる条件分岐がよく入っています。

トレース表では、未定義の矢印を横線などで書き分けておくと、条件分岐でどちらに進むかを迷わずに判断できます。

Giji Academy のシミュレーターで動かす

紙のトレースで動きをつかんだら、最後は実際に動かして確かめましょう。矢印のように目に見えないものを扱う問題ほど、動かして見る効果は大きくなります。

Giji Academy の擬似言語シミュレーターでは、擬似言語のコードを1行ずつ実行し、変数の値が変わる様子を目で確かめられます。自分で書いたトレース表と見比べながら進めると、どの行で予想とずれたのかがすぐに分かります。

一致すれば理解できている証拠で、ずれたときはその行が次に練習すべき場所です。代入の行とメソッドの行のどちらでずれたのかを意識すると、弱点がはっきりします。

まずはGiji Academy の擬似言語シミュレーターで講座を選び、変数の値が1行ごとに変わる様子を確かめてみてください。

まとめ

科目Bのクラスの問題は、オブジェクト指向の知識を深く問うものではありません。変数は箱を指す矢印、という一文を軸に、変数と箱を分けて表で追っていけば必ず解けます。

この記事でお伝えした5つの段階を振り返っておきましょう。

段階 やること
1 設問を読む 最後にどの箱のどの値が問われているかを確かめる
2 目を付ける クラスの説明、箱が作られる行、矢印が付け替わる行を見る
3 トレースする 変数の列と箱の列を分けて、1行ずつ表に書く
4 選択肢を見分ける 箱がコピーされたと思い込んでいないかを確かめる
5 動かす シミュレーターで実際の動きと照らし合わせる

最初は、この記事の Box のような小さなクラスで十分です。箱を2つ、変数を3つほど用意して、代入とメソッドの呼び出しを自分で並べ替えてみるだけでも、良い練習になります。

ドットの付いた変数がたくさん並んでいても、中でやっていることは矢印を付け替えるか、箱の中身を変えるかのどちらかです。次にクラスの問題に出会ったら、まずはメモ用紙に箱を2つ描くところから始めてみてください。

擬似言語の基礎から応用まで学べる
Giji Academy

Giji Academyでは、擬似言語の基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。
また、ブラウザ上で直接擬似言語コードを試すことができ、実践的なスキルを身につけることが可能です。

Giji Academy の学習画面。左に教材、右にシミュレーター 擬似言語の学習を始める

擬似言語の学習をここから始めよう。