対象試験と出題頻度

クラス(Class)は、基本情報技術者・応用情報技術者で出題されるオブジェクト指向プログラミングの中核用語です。

「インスタンス」「継承」「ポリモーフィズム」といった関連用語との違いを正確に区別できるかが繰り返し問われています。

詳細をクリックして確認
対象試験:
基本情報技術者
応用情報技術者
出題頻度:
★★★★☆
ランクA(重要)必ず覚えておくべき

用語の定義

情報処理試験を勉強していると、「クラスって結局何?オブジェクトと何が違うの?」と混乱しがちです。

クラス(Class)とは、一言で言うと

 「オブジェクトの属性(データ)と操作(メソッド)をひとまとめに定義した設計図」

のことです。

 

イメージとしては、「たい焼きの金型」です。

 

金型(クラス)には「形」と「焼き方」が決まっていて、そこから実際のたい焼き(インスタンス)を何個でも作れます。あんこ入り・クリーム入りなど中身の違いはあっても、外側の形は金型が決めている。これがクラスとインスタンスの関係です。

📊 クラス(Class)の基本情報

項目 内容
英語名 Class(クラス)
分類 オブジェクト指向プログラミングの基本構成要素
構成要素 属性(フィールド/インスタンス変数)+ 操作(メソッド)
関連用語 インスタンス、継承、カプセル化、ポリモーフィズム

解説

オブジェクト指向が登場する以前のプログラミングでは、データとそれを処理する関数が別々に管理されていました。プログラムの規模が大きくなると「どのデータにどの関数を使うのか」が分かりにくくなり、バグの温床になります。

この問題を解決するために、「関連するデータと処理をひとつの単位にまとめよう」という発想が生まれました。このまとまりの定義がクラスです。

 

クラスの構造

クラスは「属性」と「メソッド」の2つで構成されます。属性はそのオブジェクトが持つデータ(例:名前、年齢)、メソッドはそのデータに対する操作(例:挨拶する、年齢を1つ増やす)です。

📊 クラスの構造イメージ(UMLクラス図風)

Person(クラス名)
– name : String
– age : int
+ greet() : void
+ incrementAge() : void

上段=クラス名 / 中段=属性 / 下段=メソッド

以下は、Pythonでこの「Person」クラスを定義し、インスタンスを生成する例です。

▼ Pythonによるクラス定義とインスタンス生成の例

class Person:
    def __init__(self, name, age):
        self.name = name   # 属性:名前
        self.age = age     # 属性:年齢

    def greet(self):
        return f"こんにちは、{self.name}です。"

# インスタンス生成(金型からたい焼きを作るイメージ)
taro = Person("太郎", 25)
hanako = Person("花子", 30)

print(taro.greet())    # → こんにちは、太郎です。
print(hanako.greet())  # → こんにちは、花子です。

このコードで Person がクラス(設計図)、tarohanako がインスタンス(実体)です。設計図は1つでも、名前や年齢の異なるオブジェクトを何個でも作れます。

 

クラスを支える3つの仕組み

クラスを中心としたオブジェクト指向には、以下の3つの特性が備わっています。それぞれの概要だけ押さえてください。

📊 オブジェクト指向の三大特性

特性 概要 一言で言うと
カプセル化 データとメソッドをクラス内に隠蔽し、外部には必要な操作だけを公開する 「中身を見せずに操作させる」
継承 既存のクラス(スーパークラス)の属性・メソッドを引き継いで新しいクラス(サブクラス)を作る 「親の性質を子が受け継ぐ」
ポリモーフィズム 同じメッセージを送っても、受け取るオブジェクトの種類に応じて異なる動作をする 「同じ指示で違う結果を返す」
▶ 継承のコード例(クリックで展開)

以下は、先ほどの Person クラスを継承して Student クラスを作る例です。

class Student(Person):  # Personクラスを継承
    def __init__(self, name, age, student_id):
        super().__init__(name, age)  # 親クラスの初期化を呼び出す
        self.student_id = student_id

    def greet(self):  # オーバーライド(メソッドの再定義)
        return f"学生の{self.name}です。ID: {self.student_id}"

s = Student("太郎", 20, "S001")
print(s.greet())  # → 学生の太郎です。ID: S001

StudentPerson の name と age を引き継ぎつつ、student_id という独自の属性を追加しています。greet() メソッドを再定義(オーバーライド)することで、同じメソッド名でも異なる動作を実現しています。

ここだけは確実に押さえてください。クラスは「設計図」であり実体ではありません。設計図からメモリ上に実体化したものがインスタンスです。

では、この用語が試験でどのように出題されるか見ていきましょう。

💡 クラスの核心を3行で

・属性(データ)とメソッド(操作)をまとめた「設計図」がクラス
・クラスから生成した実体がインスタンス(オブジェクト)
・カプセル化・継承・ポリモーフィズムの3特性がクラスを中心に成り立つ


試験ではこう出る!

クラスは、オブジェクト指向の基本用語を問う問題として各試験区分で繰り返し出題されています。

出題パターンは大きく2つに分かれます。

📊 過去問での出題実績

試験回 出題内容 問われたポイント
FE R7年度
科目A 問12
異なるクラスのオブジェクトを同一インタフェースで操作したとき、操作対象に応じた異なる動作を可能にする特徴の名称を問う問題。 ・正解は「多相性(ポリモーフィズム)」
・継承・委譲・コンポジションとの区別
FE R3年度
午前免除 問46
オブジェクト指向言語のクラスに関する記述のうち、適切なものを選ぶ問題。 ・「オブジェクトに共通する性質を定義したもの」が正解
・インスタンス変数やメソッドの説明がひっかけ
AP R6春
午前 問45
クラス間の関係のうち適切なものを選ぶ問題。 ・「サブクラスはスーパークラスの操作を再定義(オーバーライド)できる」が正解
・集約と継承の混同がひっかけ
AP H28秋
午前 問47
FE R3年度 問46と同一問題(流用)。クラスに関する記述の正誤判定。 ・FE/AP間で同一問題が出回る典型例

📝 IPA試験での出題パターン

パターン1:「クラスの説明として正しいものを選べ」
クラス・インスタンス変数・メソッド・スーパークラスに関する4つの記述が並び、正しいものを選ぶ形式。ひっかけとして「インスタンス変数には共有データが保存されている」「メソッドは共有データである」など、用語の定義を微妙にすり替えた選択肢が出る。

 

パターン2:「オブジェクト指向の特性名を答えよ」
FE R7年度のように、特性の説明文を示して名称を選ばせる形式。カプセル化・継承・ポリモーフィズム・委譲・コンポジションの5つの意味を正確に区別できれば即答できる。

 

試験ではここまででOKです。クラス図の詳細な記法やデザインパターンまで午前で問われることはないので、深追いは不要です。


【確認テスト】理解度チェック

ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。


Q. オブジェクト指向プログラミングにおける「クラス」の説明として、最も適切なものはどれでしょうか?

  • A. あるクラスの属性やメソッドを引き継いで新しいクラスを定義する仕組みであり、差分だけを記述すればよい。
  • B. オブジェクトに共通する属性と操作を定義した設計図であり、ここからインスタンスを生成する。
  • C. 同じメッセージを異なるオブジェクトに送ったとき、受け取る側に応じて異なる動作をする性質のこと。

正解と解説を見る

正解:B

解説:
クラスは、オブジェクトが持つ属性(データ)と操作(メソッド)をまとめて定義した設計図であり、この定義をもとにメモリ上にインスタンスを生成します。

選択肢Aは継承(インヘリタンス)の説明です。既存のスーパークラスの性質を引き継いで新しいサブクラスを作る仕組みであり、クラスそのものの定義ではありません。選択肢Cはポリモーフィズム(多相性)の説明です。同じインタフェースで操作対象に応じた異なる動作を実現する性質であり、クラスの定義とは別の概念です。


よくある質問(FAQ)

Q. 「クラス」と「オブジェクト」は同じ意味ですか?

違います。クラスは設計図、オブジェクトはその設計図から生成された実体(インスタンス)を指します。ただし、文脈によっては「オブジェクト」がクラスとインスタンスの両方を含む広い意味で使われることがあります。試験の選択肢で両者が出てきた場合は、「設計図なのか実体なのか」で判断してください。

Q. 「クラス変数」と「インスタンス変数」はどう違いますか?

クラス変数は、そのクラスから生成された全インスタンスで共有されるデータです。一方、インスタンス変数は各インスタンスが個別に保持するデータです。例えば「全社員の所属会社名」はクラス変数、「各社員の名前」はインスタンス変数で管理するイメージです。過去問ではこの2つの違いがひっかけ選択肢に使われるため、明確に区別しておくと得点につながります。

Q. 実務ではクラスをどう使い分けていますか?

Java、Python、C#などのオブジェクト指向言語では、機能ごとにクラスを分割してソースコードを管理します。例えばECサイトなら「商品クラス」「注文クラス」「ユーザークラス」のように業務の単位でクラスを設計し、それぞれの責務(データと処理)を明確に分離します。こうすることで、仕様変更時に修正箇所を最小限に抑えられます。

Q. 「抽象クラス」と「インタフェース」の違いは何ですか?

抽象クラスは、一部のメソッドに処理内容を持たない(抽象メソッド)クラスで、サブクラスに実装を強制します。インタフェースは処理内容を一切持たず、メソッドの名前と引数のみを定義した「契約」のようなものです。Javaでは「extends」で抽象クラスを継承し、「implements」でインタフェースを実装します。試験範囲で問われることはまれですが、科目Bのコード読解で登場する場合があります。