レコード(構造体、複合データ)とは
レコードは、
計算機科学における基本的な
データ構造の一つで、
構造体や複合データとも呼ばれます。
データベースやスプレッドシートでは「行」として表現されることが一般的です。
概要
レコードは、複数のフィールド(データの格納場所)の集合体であり、各フィールドは異なる
データ型を持つことができます。これは、同じ
データ型の要素が並ぶ
配列とは異なります。例えば、日付を表現するレコードは、年(数値型)、月(数値型)、日(数値型)のフィールドを持つことができます。人事レコードであれば、名前(文字列型)、給与(数値型)、等級(文字列型)など、異なる
データ型を持つフィールドが含まれるでしょう。また、円を表現するレコードは、中心座標(点レコード)と半径(数値型)で構成できます。
レコード型は、これらのフィールドを組み合わせた値を記述するための
データ型です。通常、フィールド数は固定されており、各フィールドには名前と
データ型が定義されています。
現代のプログラミング言語では、プログラマーが独自のレコード型を定義できます。この定義には、各フィールドの
データ型と、フィールドにアクセスするための
識別子(名前またはラベル)の指定が含まれます。
レコードの利用
レコードは、メモリやストレージデバイスなどのさまざまな場所に保存できます。多くの
データ構造、特に連結
データ構造の基本的な構成要素です。ファイルは、通常、論理レコードの
配列として編成され、効率化のためにより大きな物理レコード(ブロック)にグループ化されます。
関数や
プロシージャのパラメータは、レコードのフィールドと考えることもできます。また、関数呼び出し時に渡される引数は、レコードの値として解釈できます。
コールスタックにおける各エントリ(アクティベーションレコードまたはコールフレーム)は、関数パラメータ、ローカル変数、戻りアドレスなどの内部情報を持つレコードです。
オブジェクト指向言語におけるオブジェクトは、そのオブジェクト自身の処理に特化した
プロシージャを含むレコードと見なすことができます。実際、
オブジェクト指向機能を導入した言語では、オブジェクト型はレコード型を拡張したものであることが多いです。多くの
オブジェクト指向言語では、レコードはプレーンオールド
データ構造(PODS)またはパッシブ
データ構造と呼ばれるオブジェクトの特殊なケースとして扱われます。
キー
レコードには、
識別子として機能する「キー」が含まれることがあります。キーは、レコード内の特定のフィールドまたはフィールドの組み合わせです。一意のキーは「主キー」または「レコードキー」と呼ばれます。例えば、従業員ファイルの従業員番号は主キーとして機能します。主キーに加えて、「セカンダリキー」や「代替キー」などの補助的なキーも使用されることがあります。キーは、レコードの検索を効率化するためにインデックスとして使用されることもあります。
使用法
レコードを使用する際には、以下のような操作が可能です。
新しいレコード型の宣言(各フィールドの位置、型、名前を含む)
特定のレコード型を持つ変数と値の宣言
指定されたフィールド値からレコード値を作成
レコードの明示的な名前を持つフィールドを選択
レコード変数へのレコード値の代入
2つのレコードを比較して等しいかどうかを確認
レコードのハッシュ値の計算
レコード値からフィールドを選択して値を取得
一部の言語では、レコードのすべてのフィールドを列挙する機能も提供されています。この機能は、デバッガーやガベージコレクター、シリアル化などのサービスの実装に役立ちます。
メモリ内の表現
レコードのメモリ内での表現はプログラミング言語によって異なりますが、通常、フィールドは宣言された順序でメモリの連続した位置に格納されます。複数のフィールドが同じメモリワードに格納されることもあります。コンパイラは、マシンの制約に合わせて、見えない余白フィールドを追加することがあります。一部の言語では、フィールドを指すアドレス
配列としてレコードが実装されることもあります。
自己定義のレコード
自己定義レコードは、レコード型を識別し、情報を見つけるための情報を含むレコードです。これには、要素のオフセットなどが含まれる場合があります。自己定義レコードでは、要素を任意の順序で格納したり、省略したりすることができます。
例
以下は、いくつかのプログラミング言語でのレコード定義の例です。
PL/I
Algol 68
algol68
mode date = struct (int year, int month, int day);
C
Fortran
Go
Pascal
Rust
Haskell
Julia
Standard ML
COBOL
Java(
Javaのレコード型は、実際にはクラスで実現される糖衣構文です)
関連項目
ブロック (データ)
複合
データ型
データ階層
オブジェクトコンポジション
パッシブデータ構造
共用体型