データ型: 単純型について

2002年6月30日(日)更新


■ビルトインデータ型

たけち: 前回は「データ型には単純型と複合型がある」ということを説明したよね。今日からその単純型についての説明をしようね。

さらら: 単純型といったら、xsd:string型とかxsd:int型とかxsd:positiveInteger型とかいったものが今まででてきたわね。それを知っていれば単純型は使えるんじゃないのかしら?

たけち: えーと(^^;) 確かにxsd:string型とかxsd:int型というのは、一番よく使う基本的な型なんだけれど、単純型はそれだけじゃないんだよ。xsd:positiveInteger型、つまり正の整数のデータ型があるということは、xsd:negativeInteger型、つまり負の整数のデータ型があってもいいよね。それから、実数のデータ型もあってもいいよね。

さらら: そう言われればそうね。

たけち: もう一つ考えておかないといけないのは、どれだけいろいろなデータ型が最初から用意されていても、あらゆる人のあらゆる要求には応えられないということだよね。例えばテストの点数を表す「テストの点数型」というのを考えると、たとえば0から100までの整数をとるのだけれど、こういうデータ型まで最初から用意していたらきりがないよね。

さらら: それはそうだわねぇ。

さらら

たけち: そこで前回「データ型には単純型と複合型がある」と説明したけれど、また別の分類でデータ型を分類することができるんだ。それはビルトインデータ型ユーザー派生データ型という分類方法だよ。

さらら: え〜っ、せっかくやっと「データ型には単純型と複合型がある」ということがわかったところなのに、また新しい分類が出てきたのね。なんか忘れちゃいそう。

たけち: うん、でもこれは難しいことじゃないんだよ。ビルトインデータ型というのは最初からあらかじめ用意されているデータ型のことで、ユーザー派生データ型というのは、XMLスキーマを使う人が自分で「あるデータ型を改造して作ったデータ型」のことなんだ。

さらら: なるほど、そういうことなのね。つまり「データ型を使う」ためには「最初から用意されている出来合いのデータ型(ビルトインデータ型)を使う」のか「自分で作ったデータ型(ユーザー派生データ型)を使う」のかのどちらかを選ぶということなのね。

さらら

単純型

たけち: そう、一般には、ビルトインデータ型を基本にしてユーザー派生データ型を作る、ということをするんだね。

さらら: そうなんだ。で、そのビルトインデータ型っていくつあるの?

たけち: えーと…、46個

さらら: え〜、46個も!? そんなに覚えられない!

たけち: そりゃそうだね。実際には46個一度に全部覚える必要はないよ。というか、僕自身も46個全部はわかっていないんだ(^^;) でも普段よく使うデータ型の数はたかが知れているから、ひとまず全部はわからなくても大丈夫。まず次の表を見てごらん。ひとまずこんなものがあるんだ、ということだけ眺めてみよう。

たけち

ビルトインデータ型一覧
原初型プリミティブ型派生型
anyType
(すべてのデータ型)
(すべての複合型)  
anySimpleType
(すべての単純型)
boolean
(true or false)
(1 or 0)
 
decimal
(10進数)
integer
(整数)
long
(64bit整数)
int
(32bit整数)
short
(16bit整数)
byte
(8bit整数)
nonNegativeInteger
(≧0)
unsignedLongunsignedIntunsignedShortunsignedByte
positiveInteger
(>0)
nonPositiveInteger
(≦0)
negativeInteger
(<0)
float
(IEEE754-1985 単精度32bit浮動少数)
 
double
(IEEE754-1985 倍精度64bit浮動少数)
 
string
(文字列)
normalizedStringtokenNameNCNameENTITYENTITIES
ID
IDREFIDREFS
NMTOKENNMTOKENS
language
(RFC1766言語コード(ja,en-US))
anyURI 
date
(ISO8601 年月日 (2002-06-02))
 
time
(ISO8601 時分秒 (16:27:15))
 
dateTime
(ISO8601 年月日時分秒
(2002-06-02T16:27:15))
 
gYear
(ISO8601 年 (2002))
 
gMonth
(ISO8601 月 (--06--))
 
gDay
(ISO8601 日 (---02))
 
gYearMonth
(ISO8601 年月 (2002-06))
 
gMonthDay
(ISO8601 月日 (--06-02))
 
duration
(ISO8601 期間時間 (P1Y2M3DT10H30M12.3S))
 
QName 
NOTATION 
base64Binary 
hexBinary 


■原初型、プリミティブ型、派生型

さらら: きゃ〜、わからない言葉がいっぱい。だめだわ私、やっぱりついてけない〜!

たけち: ちょっ、ちょっと、待って!(^^;) だから、わかるところから見ていけばいいんだよ。まずbooleanという型は、いわゆる「真か偽か」「正しいか間違っているか」「該当しているか、いないのか」といったことを示したいときに使うデータ型だよ。trueかfalse、もしくは1か0のどちらかしか取らないという、とても単純な単純型なんだ。こういう基本的なものが最初から「ビルトインデータ型」として用意されているんだ。

さらら: うっ、うん。確かにそう言われればそうね。でも、この原初型とかプリミティブ型とか派生型って、またわけのわからない言葉が出てきているけれど、これは何なの?

さらら

たけち: 原初型については後で説明したいけれど、原初型に書いてあるanyTypeというのは「すべてのデータ型」を意味するデータ型で、このデータ型を使うと、ありとあらゆるいかなるデータ型でも使えるようになるんだよ。

さらら: そんな何でもいいっていうようなデータ型って、どう使うのかしら。

たけち: これは後でお話しするから、ひとまず置いておこうね(^^;) それで、プリミティブ型と派生型なんだけれど、そうだねぇ。。。これはまず次の整数についての派生型について注目してみて。

整数の派生型

派生

たけち: これを見てもわかるように、10進数から小数部分のあるものを省いたのが整数と言えるし、整数から負の数を省いたものが0以上の整数だし、0以上の整数から0を省いたものが正の整数だよね。

さらら: それはそうだわ。

たけち: つまり、10進数(decimal)の範囲を制限したのが整数(integer)だし、整数の範囲を制限したのが0以上の整数(nonNegativeInteger)だし、0以上の整数の範囲を制限したのが正の整数(positiveInteger)だよね。

さらら: えぇ。わかるわ。

たけち: このように、あるデータ型を元にして別のデータ型を導くことを「派生」と言うんだ。この場合、元になるデータ型のことを「基準型」と呼ぶし、その「基準型」から派生して新しく導かれたデータ型のことを「派生型」と呼んでいるんだ。ビルトインデータ型の中でも、もっとも基準になる型を「ビルトインデータ型のプリミティブ型」と呼び、そこから派生しているビルトインデータ型のことを「ビルトインデータ型の派生型」とも呼んでいる。まあ呼び方はともかく、この「派生」という考え方を覚えておいてね。


■integer, intなど

さらら: へぇー、そうなんだ。あれ、ちょっと待って。。。。整数はintegerじゃなくてintだったんじゃないの? よく見たら、integerの派生型としてlongがあって、longの派生型としてintがあるわ。いったいこれは何なの!?

たけち: あっ、う。。えーと、これはね、これはね(^^;) integerというのは文字通り整数全体なんだけれども、ところがlongというのは「64bit整数」と言われるもので、9223372036854775807〜 -9223372036854775808までの整数なんだ。そしてintというのは「32bit整数」と言われるもので2147483647 〜 -2147483648までの整数のことなんだよ。ちなみにshortは32767 〜 -32768までの整数で、byteは127 〜 -128までの整数。つまり使える整数に、上の限界と下の限界があるんだね。

さらら

long
9223372036854775807〜 -9223372036854775808の整数
int
2147483647 〜 -2147483648の整数
short
32767 〜 -32768の整数
byte
127 〜 -128の整数

さらら: えーっ! そんな上と下の限界がある整数なんて不便じゃない。それより上やそれより下の整数は使えないってことでしょ。

たけち: それはそうだけれども、実際問題として2147483647より上の整数とか、-2147483648より下の整数って、まず使わないよね。

さらら: それはそうだけれど… でもこんな制限を設けて何か良いことがあるの?

たけち: でも、制限をつけない数値をコンピュータで扱うにはいったいどれくらいのメモリがあればいいんだろうね。

さらら: あっ、。。。

たけち: こういう上限、下限を設けると、メモリーを効率よく使ったり高速に演算したりすることができるよね。実際、C言語とかJavaなどの一般的なプログラミング言語で使われる整数は、このintのように上限、下限がある整数の方が一般的で、そういう限界を持たない整数は特殊な用途になるんだ。

さらら

さらら: じゃあ、integerとintのどちらを使えばいいの?

たけち: うっ、う〜ん。それはいろいろな考えがあって一概に言えないけれど(^^;) 例えば、今のXSLT1.0はXMLスキーマを見て計算しているわけじゃないから、integerとintのどちらを使っても処理の速さに差が出ることはないだろうね。けれど現在ワーキングドラフトとして検討されているXSLT2.0では、XMLスキーマを読み込むような仕様が案として出されているから、もしそうなると、XSLT2.0ではintを使った方が処理が速くなるといったようなXSLT処理系(XSLTを処理するソフトウェア)も将来出てくるかもしれないね。

さらら: ふーん、そうなんだ。じゃあ、このfloatとかdoubleっていう浮動少数だかというのもそうなの?

たけち: そう、このあたりもFortranやC言語やJavaのような一般的なプログラミング言語だと、実数を扱う上で、もっとも一般的に使用されるデータ型だよ。

さらら: anyURIって何なの?

たけち: これは「http://www.cityfujisawa.ne.jp/~yanai/xml/index.html」みたいな、URIのためのデータ型だよ。

さらら: それは便利そうね。あとdateというのは西暦なのね。

たけち: そう、2002-06-02と書くと「2002年6月2日」という意味になるよ。こういう基本的なものは最初から決めておくと、皆が勝手にいろいろな表記法を使わないですむから便利だね。

さらら: 「天平勝宝2年6月3日」みたいに書くデータ型がないのね。。。 (^ ^*

たけち: それはこれが世界の人がもっとも基準とするための「ビルトインデータ型」だから仕方がないよ。「ビルトインデータ型」はあくまで一番基準となるデータ型を定義しているだけだからね。そういう「ビルトインデータ型」にないようなデータ型は、自分で「ビルトインデータ型」から「派生」させて作ればいい。それが最初に言った「ユーザー派生データ型」なんだね。

さらら: うん。だいたいわかったわ。和暦については、ユーザー派生データ型をつくればいいのね。

たけち: というわけで、次回は「ユーザー派生データ型」の作り方について勉強するね。

さらら: は〜い。ありがと。

→ 次回は、単純型のユーザー派生データ型です。。。。 (^ ^)v

さらら


XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。