S-JIS[2007-12-01/2011-11-17] 変更履歴

データ型の変遷

コンピューターの進化に伴ってデータのとらえ方が色々変わってきたような気がします。
ちょっと整理してみました。ただし単語は気分で使っているので誤っている事も多いはず(爆)

  1. プリミティブ
  2. 配列 [/2008-03-07]
  3. 構造体
  4. クラス
  1. コレクション [/2011-11-17]
  2. アルゴリズム
  3. デザインパターン
  4. アンチパターン

プリミティブ

コンピューターの内部では、値の保持にはCPUのレジスターとメモリーを使う。

コンピューターの最小単位はビット(bit・b)で、0と1のみしか表せない。量子コンピューターは違うらしいけど(爆)
演算を効率よくする為に、ある程度まとめて「バイト(byte・B)」という単位で表す。
1バイトはコンピューターによっては7ビットだったり9ビットだったりするものがあったらしいが、現代では8ビットだと思ってまず間違いない。
(ちなみにオクテット(octet)は必ず8ビット。オクテットという単位は、通信の世界ではよく使われる)

CPUのレジスターとメモリー間のデータのコピーや演算は、1バイトとか2バイト・4バイトといった単位で行う。
レジスターを使って演算するのがコンピューターの中では最も高速なので、高級言語であっても、これらに該当する型を用意しているものが多い。例えばJavaではこれをプリミティブ型(基本的な型)と呼んでいる。

これらの型は、byte・integer・short・longといった単語で表される事が多い。

また、小数を表すために浮動小数という形式をサポートしているものもある。いわゆるfloat・double。

各言語の型名


配列

同一のデータ型をいくつかまとめて扱う為に配列を使う。
同一のデータ型のデータが順番に並んでいるのが特徴。なのでインデックス(index・添字(そえじ))で配列中のn番目の要素にアクセスする。

配列は、メモリーの一部分の連続領域が使用されるイメージ。

配列には同じ意味・使用目的のデータ、あるいは同一処理を繰り返して実行できるデータが入る。[2008-03-07]
したがって、配列の各要素の型が同じだからと言って、意味が異なるデータを入れるのは間違い。
また、インデックス番号に意味を持たせる使い方も良くない。
(例えば数値型の配列で、1番目が身長で2番目が体重で3番目が年齢で4番目が視力で5番目が握力、とか。そういうデータには構造体を使うのが筋。
↑ここまで無茶な使い方をする奴はいないだろうが、JavaのObject配列に対し、1番目にString、2番目にIntegerなんて使い方はたまに見かけるので、あえて書いてみた)

各言語の配列宣言


構造体

配列が同一のデータ型しか扱わないのに対し、色々な種類のデータをまとめて1つのものとして扱うのが構造体(レコード)。

例えば「名前(文字列)」「年齢(数値)」といった複数のデータ型をまとめて「個人」という構造体とする。
構造体にはプログラムのデータの種類(意味)に応じた定義をするので、データの使い道(意味)がはっきりしてくる。

各言語の構造体定義


クラス

構造体がデータの種類を定義しただけなのに対し、それらの操作についても定義したのがクラス(オブジェクト)。

構造体の場合、その内部のデータを操作する(書き換える)のは、別途定義されたサブルーチンの仕事になる。
クラスの場合はクラス内部に操作用サブルーチンが書かれるので、データ操作の責任範囲が明確になる。他人(他のクラス)が自分(のクラス内)のデータを勝手にいじることが無いし、自分が他人のデータ構造を知る必要も無い。

オブジェクト指向を押し進めると、コンピューター言語上はプリミティブ配列が一切出てこなくなる。

各言語のクラス定義


コレクション

データ群を、データ操作の方法に応じてまとめたのがコレクション
例えばスタック・リスト・キュー・マップ(連想配列・ディクショナリー)といったもの。

これらは、同一データ型の複数のデータを、使う側の目的に応じてまとめている。

名称 概要 使途
リスト データを順番に保持する。配列と似た感じ。 データ群の先頭(や途中・末尾)に新しいデータを追加したり、途中のデータを削除したりする必要がある場合に使う。
スタック 先に入れたデータが後に出る。
後に入れたデータが先に出る。
新しく入ったデータを先に処理したい場合に使う。
(コンピューターの再帰処理には不可欠な機能)
キュー 先に入れたデータが先に出る。 待ち行列を処理するのに適している。(先に並んだ人を先に処理する)
マップ データにキーを付けて保持し、キーを指定することでデータを取得する。 名前でもってデータを保持・取得したい場合に使う。
(限られた数値であれば、配列で充分)
セット 集合。値部分が不要なマップ[2011-11-17]
リストがデータを“順番に”保持するのに対し、セットは順不同で保持する。
リストは(順序も意味を持つので)同じデータを複数保持できるが、セットは1つずつしか保持しない。
キーが存在しているかどうかだけを知りたい(保持すればよい)場合に使う。

これらは、あくまでも意味的に(使用目的で)同一のデータを保持するのに使う。保持するデータの種類が異なるのは正しい使い方ではない。
例えば数値というデータ型が一致しているからといって、リストの1番目の要素に年齢、2番目に身長、3番目に体重…という使い方で「個人のデータ」を保持しようとするのは、誤り。
また、マップを使って、「年齢」というキーで年齢、「名前」というキーで名前を取得するような使い方もおかしい。(それは構造体クラスにしろという事だ。ただしコーディング上の利便性から、マップを使うことはよくある)

Javaのコレクション


アルゴリズム

データを操作する為の手順(で、定石となっているもの)。
例えばデータのソート(並べ替え)をする方法として、バブルソートだのクイックソートだのといった方法(手順)が考案されている。

どちらかと言えば手順に主眼を置いており、その操作対象となるデータ型にはあまりこだわらない。
(ソートについて言えば、大小関係が計算できればいい)


デザインパターン

アルゴリズムと似たような感じだが。
主にオブジェクト指向において、目的の処理を行う為にどういうデータ構造にしてどういう操作をすればいいかという定石。

オブジェクト指向ではデータに主眼をおく為、データの持ち方と操作方法の両方が考慮対象になる。
例えばIteratorパターンでは「next()とhasNext()というメソッドを持つオブジェクト(データ)が対象で、hasNext()を呼び出してデータが在ればnext()で取得する(メソッドの使用方法)」というパターンになっている。


アンチパターン

よく見かけられる間違いを集めたもの。「こんなプログラミングはすべきではない」という定石。
言葉としては「デザインパターン」より後に作られた、かな。


技術メモへ戻る
メールの送信先:ひしだま