コンテンツへスキップ

クラス定義

APコンピュータサイエンスA · トピック 3

查看幻灯片 練習する
このトピックのビデオレッスン 動画ページを開く
7:26

クラス定義

aquí hay un estudiante, almacenado como tres variables sueltas: un nombre, un año y una calificación. Eso funciona. Ahora añade mil estudiantes. Necesitas tres mil variables…

英語ナレーション・英語+中文字幕 burning-in

3.1

アブストラクションとプログラム設計

シラバス

学習目標 3.1.A: 自然言語を使用するか、クラス図を作成することでプログラムの設計を表現する。図には、各クラスに含まれるデータおよび手続的抽象化(すべての属性と振る舞いを含む)を示す必要がある。

  • 3.1.A.1 抽象化 は、主要な概念に焦点を当てることで複雑さを軽減するプロセスである。現在の質問に関連しない詳細を隠し、関連して有用な詳細をまとめすることで、抽象化は複雑さを軽減し、概念への集中を可能にする。
  • 3.1.A.2 データ抽象化 は、データ型の抽象的特性とその表現の具体的な詳細との間に区別を提供する。データ抽象化は、表現の具体的な詳細を参照せずにデータに名前を与えることで複雑さを管理する。データは単一の変数として、またはクラスやデータセットなどのデータの集合体として存在する。
  • 3.1.A.3 属性 は、メソッドやコンストラクタの外でクラス内に定義されるデータ抽象化の一種である。インスタンス変数 は、クラスの各インスタンスごとに値が固有である属性である。クラス変数 は、クラスの全インスタンスで共有される属性である。
  • 3.1.A.4 手続的抽象化 はプロセスに名前を与え、メソッドがどのように動作するかではなく何をするのかを知っているだけで使用できるようにする。メソッド分解 を通じて、プログラマーはクラスにより大きな振る舞いをより小さな振る舞いに分解し、それぞれの小さな振る舞いを表すメソッドを作成する。手続的抽象化は、コードを複製する代わりに共通要素を抽出して機能を一般化することがある。これによりコード再利用が可能になり、複雑性の管理に役立つ。
  • 3.1.A.5 パラメータを使用することでプロシージャを一般化でき、異なる入力値や引数を用いてプロシージャを再利用できる。
  • 3.1.A.6 プログラム内で手続的抽象化を使用することで、メソッドの署名とメソッドが何をするかを維持している限り、メソッドユーザーに変更を通知することなく、メソッドの内部(速度向上、効率化、メモリ使用量の削減など)を変更できる。
  • 3.1.A.7 クラスを実装する前に、各クラスの属性と振る舞いを含めた設計に時間を割くことが有益である。この設計は自然言語や図で表現できる。

出典: College Board AP コースおよび試験説明書

進行中のジigsawパズル: クラスとメソッドは大きなプログラム設計におけるモジュール単位のピースです
進行中のジigsawパズル: クラスとメソッドは大きなプログラム設計におけるモジュール単位のピースです

抽象化とは、単純なインターフェースの背後に詳細を隠すことを意味します。Stringを使用する際、それがどのように文字を格納しているかを知る必要はありません。良い設計では問題をクラスに分解し、各クラスが一つの概念について責任を持ちます。このトピックでは、あなた自身がクラスを書くことについて扱います。

プログラムをモジュールとサブモジュールに分解した様子
プログラムをモジュールとサブモジュールに分解する
3.2

プログラム設計の影響

シラバス

学習目標 3.2.A: コンピューティングシステムの社会的・倫理的 implications を説明する。

  • 3.2.A.1 システム信頼性 とは、指定された条件下で故障なく予期したタスクを遂行できるプログラムの能力を指す。プログラマーは、多様な条件下でプログラム进行测试してシステム信頼性を最大化するよう努めるべきである。
  • 3.2.A.2 プログラムの作成は、社会、経済、文化に影響を与えます。これらの影響には、利益となるものと害をなすものとの両方が含まれます。特定のニーズを満たしたり問題を解決したりするために設計されたプログラムでも、その意図した用途を超えて予期せぬ有害な効果が生じることがあります。
  • 3.2.A.3 プログラムを作成する際、法的問題や知的財産に関する懸念が生じます。プログラマはしばしば、他の人が作成してオープンソースとして公開し無料で利用可能なコードを再利用します。オープンソースとして公開されていないコードを取り込む場合、プログラマはその使用許諾を取得し、統合する前に多くの場合、コードを購入する必要があります。

出典: College Board AP コースおよび試験説明書

設計上の選択は、コードが正しいか、読みやすいか、再利用可能かどうかに影響します。カプセル化 – データをプライベートに保ち、メソ要通过のみで公開する – はオブジェクトの状態を誤った使用から守り、内部を変更してもクラスのユーザーを破綻させません。 thoughtfulなネーミング、単一目的のメソッド、テストによりバグが減ります。

設計はコード以上の責任も伴います。システム信頼性 – 予期通りタスクを遂行し、失敗なしのプログラム – は、慎重な設計とテストを通じてprogrammableが最大化すべきものです。プログラムは社会、経済、文化に有益かつ有害の両方の現実的な影響を与えます。また、プログラムの作成は法的および知的財産の問題を提起します – programmersはよくオープンソースとして公開され無料で使えるコードを再利用しますが、ライセンスを尊重し、他者の作品をそのまま自分のものとしてコピーするのではなく、出典を示す必要があります。

3.3

クラスの解剖学

シラバス

学習目標 3.3.A: クラス、データ、コンストラクタ、およびメソッドに対するアクセスと可視性制約を指定するコードを作成する。

  • 3.3.A.1 データカプセル化とは、クラスの実装詳細を外部のクラスから隠蔽する技術である。キーワード public と private は、クラス、データ、コンストラクタ、およびメソッドへのアクセスに影響を与える。キーワード private は宣言クラス内でのみアクセスを制限し、キーワード public は宣言クラス以外のクラスからのアクセスを許可する。
  • 3.3.A.2 このコースでは、クラスは常に public として指定され、キーワード class を用いて宣言される。
  • 3.3.A.3 このコースでは、コンストラクタは常に public として指定される。
  • 3.3.A.4 インスタンス変数 はオブジェクトに属し、各オブジェクトはその変数の独自のコピーを持つ。
  • 3.3.A.5 カプセル化を実現するため、属性へのアクセスはクラス内部に留めるべきである。したがって、クラス仕様で別に定められていない限り、これらの属性に対応するインスタンス変数を private として指定することが良いプログラミング慣行である。
  • 3.3.A.6 ビヘイビア(振る舞い)へのアクセスは、クラス内部または外部のいずれか可以是である。 public として指定されたメソッドは、クラス内部および外部の両方からアクセス可能であるが、 private として指定されたメソッドはクラス内部のみからアクセス可能である。

出典: College Board AP コースおよび試験説明書

クラスには三つの部分があります:インスタンス変数(フィールド – オブジェクトのデータ)、コンストラクタ(オブジェクトの生成)、そしてメソッド(振る舞い)。フィールドは通常 private で、メソッドは通常 public です:

クラス図: プライベート属性とパブリックメソッド
クラス図: プライベート属性とパブリックメソッド
public class Student {
    private String name;      // instance variable
    private int score;

    public Student(String n, int s) {   // constructor
        name = n;
        score = s;
    }
    public int getScore() { return score; }   // accessor
}
青写真: クラスはその型のオブジェクトがどのように構築されるかを定義するテンプレートです
青写真: クラスはその型のオブジェクトがどのように構築されるかを定義するテンプレートです
探索

オブジェクトのフィールドをボックスとして視覚化する

クラスは関連するデータ(fields)とメソッドをグループ化します。各オブジェクトには独自のフィールドボックスのセットが割り当てられ、1つに代入しても対象となるオブジェクトのみが変化します。

English 日本語
Abstraction/əbˈstrækʃn/ 抽象化
Encapsulation/ɪnˌkæpsjʊˈleɪʃn/ カプセル化
System reliability/ˈsɪstəm rɪˌlaɪəˈbɪlɪti/ システム信頼性
legal and intellectual-property/ˈliːɡl ænd ˌɪntəˈlektʃuːəl ˈprɒpəti/ 法的および知的財産権
open source/ˈəʊpən sɔːs/ オープンソース
instance variables/ˈɪnstəns ˈveərɪəblz/ インスタンス変数
constructor/kənˈstrʌktə/ コンストラクタ
overloading/ˌəʊvəˈləʊdɪŋ/ オーバーロード
accessor (getter)/əkˈsesə/ アクセサ(ゲッター)
3.4

コンストラクタ

シラバス

学習目標 3.4.A: クラスのコンストラクタ本体において初期化する対象の属性に対応するインスタンス変数を宣言するコードを作成する。

  • 3.4.A.1 オブジェクトの 状態 は、ある時点におけるその属性およびその値を指し、オブジェクトに属するインスタンス変数によって定義される。これは、オブジェクトとインスタンス変数の間に has-a 関係が成立することを意味する。
  • 3.4.A.2 コンストラクタは、オブジェクトの初期状態を設定するために用いられ、すべてのインスタンス変数に対する初期値を含めるべきである。コンストラクタが呼び出されると、オブジェクトのためにメモリが割り当てられ、関連するオブジェクト参照が返される。コンストラクタのパラメータ(指定されている場合)は、インスタンス変数を初期化するためのデータを提供する。
  • 3.4.A.3 可変オブジェクトがコンストラクタパラメータである場合、インスタンス変数は参照先のオブジェクトのコピーで初期化されるべきである。このようにすることで、インスタンス変数は元のオブジェクトへの参照を持たず、メソッドによる元のオブジェクトの状態の変更を防ぐことができる。
  • 3.4.A.4 コンストラクタが書かれていない場合、Javaは引数なしのコンストラクタを提供し、インスタンス変数は属性のデータ型に応じてデフォルト値に設定される。このコンストラクタを デフォルトコンストラクタ と呼ぶ。
  • 3.4.A.5 int 型の属性のデフォルト値は 0 である。 double 型の属性のデフォルト値は 0.0 である。 boolean 型の属性のデフォルト値は false である。参照型の変数のデフォルト値は null である。

出典: College Board AP コースおよび試験説明書

コンストラクタはクラスと同じ名前を持ち、返り値の型はありません。new を書いたときに実行され、フィールドを初期化する役割があります。パラメータリストが異なる複数のコンストラクタ(オーバーロード)を持つことができ、引数なしのコンストラクタはデフォルト値を設定します。

3.5

メソッド: 書き方

シラバス

学習目標 3.5.A: プリミティブ値を用いてクラス内に書かれたメソッドを通じてオブジェクトの振る舞いを定義するコードを作成し、これらのメソッドを呼び出した結果を判定する。

  • 3.5.A.1 void メソッドは値を返さない。そのヘッダーには、メソッド名の前にキーワード void が含まれる。
  • 3.5.A.2 非voidメソッドは単一の値を返す。そのヘッダーには、キーワード void の代わりに返り値の型が含まれる。
  • 3.5.A.3 非voidメソッドでは、返り値の型と互換性のある返還式が評価され、その値が返される。これを 値による返還 と呼ぶ。
  • 3.5.A.4 return キーワードは、制御の流れをメソッドまたはコンストラクタが呼び出された地点へ戻すために用いられる。return文の後に続くコードは決して実行されない。選択文または反復文内でreturn文を実行すると、该文が停止し、メソッドまたはコンストラクタから退出する。
  • 3.5.A.5 アクセサメソッド は、他のクラスのオブジェクトがインスタンス変数またはクラス変数の値のコピーを取得できるようにするメソッドである。アクセサメソッドは非voidメソッドである。
  • 3.5.A.6 ミューテータ(修飾)メソッド は、インスタンス変数またはクラス変数の値を変更するメソッドである。ミューテータメソッドは多くの場合、voidメソッドである。
  • 3.5.A.7 パラメータを持つメソッドは、そのパラメータを通じて値を受け取り、その値を使用してメソッドのタスクを遂行する。
  • 3.5.A.8 引数がプリミティブ値である場合、パラメータはその値のコピーで初期化される。パラメータへの変更は対応する引数には影響しない。

出典: College Board AP コースおよび試験説明書

メソッドにはシグネチャ、返り値の型、本体があります。アクセサ(ゲッター) はオブジェクトを変更することなく情報を返します。ミューテータ(セッター) はフィールドを変更します。値を返すメソッドは、すべてのパスで適切な型のreturnを持つ必要があります;voidメソッドは何も返しません。

public void setScore(int s) { score = s; }   // mutator
public String toString() { return name + ": " + score; }
探索

メソッド呼び出しとその戻り値を追跡する

メソッドを呼び出すと、その引数を含むフレームがスタックに押し込まれます。returnに到達するとフレームがポップされ、値が呼び出し元に戻ります。

English 日本語
mutator (setter)/mjuːˈteɪtə/ ミューテータ(セッター)
static (class) variable/ˈstætɪk ˈveərɪəbl/ 静的(クラス)変数
3.6

オブジェクトへの参照の渡還と返却

シラバス

学習目標 3.6.A: オブジェクト参照を用いてクラス内に書かれたメソッドを通じてオブジェクトの振る舞いを定義するコードを作成し、これらのメソッドを呼び出した結果を判定する。

  • 3.6.A.1 引数がオブジェクト参照である場合、パラメータはその参照のコピーで初期化されますが、オブジェクト自体の新しい独立したコピーは作成されません。パラメータが可変なオブジェクトを指している場合、メソッドやコンストラクタはこの参照を使ってオブジェクトの状態を変更できます。仕様で必要とされない限り、パラメータとして渡された可変なオブジェクトを修改しないことが良いプログラミングの慣行です。
  • 3.6.A.2 返り値がオブジェクト参照を評価する場合、その参照が返されますが、オブジェクトの新しいコピーに対する参照が返されるわけではありません。
  • 3.6.A.3 パラメータがオブジェクトへの参照を持っている場合、そのパラメータがメソッドを包み込むクラスと同じ型でない限り、メソードはパラメータの private データや private メソッドにアクセスできません。

出典: College Board AP コースおよび試験説明書

= はオブジェクトそのものをコピーするのではなく参照をコピーします

オブジェクトをメソッドに渡すと、Javaは参照のコピーを取るため、メソッドは同じオブジェクトに対して動作し、そのフィールドへの変更は呼び出し主に visibility されます。(プリミティブは値によってコピーされるため、変更は反映されません。)メソッドはまた、オブジェクトへの参照を返すこともできます。String は不変体であるため、渡すことは安全ですが、可変なオブジェクトを渡すとメソッドが変更できます。

Javaは値渡し:メソッドはコピーを受け取ります。Javaには欠如している真の参照渡しであれば、呼び出し者の変数を再代入できます *Javaは常に値渡し(左):メソッドは参照のコピーを取得する。真の参照渡し(右)– Javaにはない – は、メソッドが呼び出し主自身の変数を再割り当てすることを可能にする。

試験技能: メソッド内でオブジェクトのフィールドを改変すると元の値に影響を与えるが、パラメータの再割り当て(param = new...)は呼び出し主に影響しないことを知っておく。

演習例。 sがStudentであり、得点が50であると仮定して、tweak(s)を呼び出します:

public static void tweak(Student a) {
    a.setScore(100);          // (1) mutates the shared object
    a = new Student("Z", 0);  // (2) repoints the local copy only
    a.setScore(5);            // (3) changes only the new local object
}

行(1)はs が指すオブジェクトを変更するため、呼び出し主は now 100 を見る。行(2)はメソッド自身の参照のコピーを新しいオブジェクトにポイントさせる – 呼び出し主の s は untouched – 、行(3)はその新しいオブジェクトのみに影響する。呼び出し後、s.getScore() は 100 である:mutationは残ったが、reassignmentは残らなかった。

3.7

クラス変数とクラスメソッド

シラバス

学習目標 3.7.A: クラスメソッドを通じてクラスの振る舞いを定義するコードを作成する。

  • 3.7.A.1 クラスメソッドは、パラメータ経由でクラスのインスタンスが渡されていない限り、インスタンス変数の値にアクセスしたり変更したり、インスタンスメソッドを呼び出したりすることはできません。
  • 3.7.A.2 クラスメソッドはクラス変数の値にアクセスしたり変更したりでき、他のクラスメソッドを呼び出すことができます。

学習目標 3.7.B: クラスに属するクラス変数を宣言するコードを作成する。

  • 3.7.B.1 クラス変数はクラスに属し、あるクラスのすべてのオブジェクトがそのクラス変数の単一のコピーを共有します。クラス変数は変数名の前に static キーワードが付与されます。
  • 3.7.B.2 public で指定されたクラス変数は、クラスに紐付いているため、クラスのオブジェクトではなく、クラス名とドット演算子を使用してクラス外からアクセスされます。
  • 3.7.B.3 変数が final で宣言された場合、その値は修改できません。

出典: College Board AP コースおよび試験説明書

*static vs インスタンスフィールド

static(クラス)変数は static でマークされており、クラスの全オブジェクトで共有される – 全体で一つのコピー(例:存在するオブジェクトのカウンター)。staticメソッドはクラスに属し、インスタンスフィールドを直接使うことはできません。クラス名でアクセスする:Student.getCount()。

3.8

スコープとアクセス

シラバス

学習目標 3.8.A: コード内で変数がどこで使用できるかを説明する。

  • 3.8.A.1 ローカル変数 は、コードブロックのヘッダーまたは本体に宣言された変数です。ローカル変数は、宣言されたブロック内でのみアクセスできます。コンストラクタとメソッドはコードブロックであるため、コンストラクタやメソッドのパラメータもローカル変数とみなされます。これらの変数はコンストラクタやメソッド内でのみ使用でき、public や private に宣言することはできません。
  • 3.8.A.2 インスタンス変数と同じ名前のローカル変数やパラメータが存在する場合、コンストラクタやメソッドの本体では変数名はインスタンス変数ではなくローカル変数を指します。

出典: College Board AP コースおよび試験説明書

スコープとは、名前が visibility される場所である。メソッド内で宣言されたローカル変数はその中にのみ存在し、パラメータはそのメソッド内にのみ存在し、インスタンス変数はオブジェクト全体で visibility される。アクセス修飾子はクラス間での visibility を制御する:private(このクラスのみ)対 public(どこでも)。ローカル変数は同名のフィールドをシャドウイングする – バグの原因になる。

グローバル変数はどこでも visibility される; ローカル変数はブロック内でのみ visibility される
グローバル変数はどこでも visibility される; ローカル変数はブロック内でのみ visibility される
English 日本語
Scope/skəʊp/ スコープ
3.9

this キーワード

シラバス

学習目標 3.9.A: 自身を参照する式のためのコードを作成し、これらの式の結果を決定する。

  • 3.9.A.1 インスタンスメソッドやコンストラクタ内で、キーワード this は現在のオブジェクトへの参照を持つ特殊な変数として機能します。これは、現在メソッドやコンストラクタが呼び出されているオブジェクトです。
  • 3.9.A.2 キーワード this を使用して、現在のオブジェクトをメソッド呼び出しの引数として渡すことができます。
  • 3.9.A.3 クラスメソッドには this 参照がありません。

出典: College Board AP コースおよび試験説明書

this は現在のオブジェクトを指します。同じ名前のパラメータと区別したり、同じオブジェクトの他のメソッドを呼び出したりするために使用します:

public Student(String name, int score) {
    this.name = name;      // this.name is the field; name is the parameter
    this.score = score;
}

試験対策: コンストラクタやセットメソッドのパラメータがフィールドと同じ名前の場合、this.field = param を必ず書く必要があります——this がなければ、代入は意味のある動作を行いません。

3.9

試験対策

  • メソッドとクラスを用いた設計:データをprivate フィールドとしてカプセル化し、公的メソッドを通じて振る舞いを公開する。
  • オブジェクトとそれに対応するクラスの違いを理解し、オブジェクトは値渡しで渡されることを知る——パラメータには参照のコピーが入るため、メソッド内でオブジェクトの状態を変更することはできるが、パラメータへの再割り当ては呼び出し側に影響しない(Javaには参照渡しはない)。
  • アレイとArrayList を安全にトラバースする——サイズはlength と.size() で異なり、ループ中に要素を削除するとインデックスがシフトする。
  • 再帰メソッドをトレースして結果を求める:まず基底ケースを見つけ、次に各再帰呼び出しが返す値まで追跡する(再帰コードの記述は試験範囲外)。
  • 継承に関する用語を理解する——スーパークラス、サブクラス、メソッドのオーバーライド、およびすべてのクラスがObject のサブクラスであること(継承の設計と実装は試験範囲外)。

このトピックのインタラクティブ授業

一歩ずつ進め、即時チェック付きの問題で学習します。

過去問

APコンピュータサイエンスA の他のトピック

ログインまたはアカウント作成

IGCSE, A-Level & AP