データの基本型

キーワード(予約語)(Keywords)

「キーワード」はJavaコンパイラに対して,データ型や命令文の意味を持ち,ユーザはこれを識別子としては使えません.Javaのキーワードには以下のものがあります.覚える必要はありません.

abstract boolean break byte case
cast catch char class compl
const continue default do double
else extends false final finally
float for future generic goto
if implements import inner instanceof
int interface long native new
null operator outer package private
protected public rest return short
static super switch sychronized this
throw throws transient true try
var void volatile while

識別子(Identifier)

「識別子」はユーザが「クラス」「変数(メンバ変数)」「メソッド(メンバ関数)」につける名前です.名前には「文字」「数字」「_」「$」が使えますが,キーワードと同じ名前は使えません.また,名前の先頭文字には「数字」,「_」は使えません. 識別子に付ける名前は慣習的に次のようになっています.

識別子の型 慣習 命名例
クラス名
各語の先頭は大文字,
単語をつないで表記します.
TextEditor
ErrorDialog
メンバ関数名
先頭語を小文字,
後の語の先頭を大文字で表記します.
addFisrt() hasNext()
メンバ変数名 メンバ関数名と同じ.
dayofWeek
summerVacation
定数
すべて大文字で表記し,
PI

基本データ型(Basic Data Types)

Javaでは変数を入れる箱の型を決める必要があります.箱の型を決める前に箱の名前,つまり変数名を決めなければなりません.変数名は中身にあった名前を付けるのが良いとされています.例えば,テストの回数を表す変数ならば,countやtestCountやtestTimesなどが良い名前です.

ここでは,変数testTimesがテストの回数を表すとしましょう.この場合,テストの回数は1,2,3…という整数なので,整数をしまっておく箱は整数型であると宣言します.例えば,

int testTimes;
と書きます.また,test_Averageがテストの平均だとすると,小数になる可能性があります.そこで,小数をしまっておくtest_Averageは,実数型であると宣言します.例えば,
float test_Average;
と書きます. しかし,テストの回数が2の32乗を超えるようであれば,intではまずいことになります.そのときはlongを用います.このように,箱に入る中身によってそれに見合った箱を用意できるようになっています. Javaなどのオブジェクト指向プログラミングでは,すべてが型で構成されているので,マスターしておきましょう.

基本型
 
論理型 文字型 整数型 浮動少数点型
bool char 'A'
byte
short
int
long
float
double

このあと,例題を交えながら基本データ型について細かく見ていきます.

論理型(Boolean Type)

論理型はfalseまたはtrueの2値しかとることができないときに用います.

例題 2..1   論理型
\framebox{
\begin{minipage}{13.65cm}
次のプログラムを実行するとどんな結果が得られるか調べなさい.
\end{minipage}}

class TrueOrFalse
{
public static void main(String[] args)
  {
    bool flag = false;
    cout << "flag = " << flag << endl;
    flag = true;
    cout << "flag =" << flag << endl;
  }
}

解答 Javaではfalse, trueは予約語で,falseは0,trueは1がプリントされます.

実行結果

\begin{figure}\centering\includegraphics[width=7.8cm]{JAVAFIG/TrueOrFalse.eps}
\end{figure}

文字型(Character Types)

文字型は文字'A'や桁数'8'などをあらわすときに用います.例えば,Aという文字を文字型cに代入するときには,

char c = 'A';

と書きます.文字Aを変数ではなく文字型として使用するときは,アポストロフィー( ' )が必要です.アポストロフィーなしでは変数と見なされ,エラーとなります.そこで,変数と区別するためにすでに学んだリテラルを用います.ここで, (int)c; とすると, (int)cは文字AのASCIIコードである65を表します.これはキャスト(cast)とよばれ,Javaでは変換後の型をカッコで囲み変換したい変数の前に書きます.

例題 2..2   文字型
\framebox{
\begin{minipage}{13.65cm}
次のプログラムの結果はどうなるか考えなさい.
\end{minipage}}

class Cast
{
  public static void main(String[] args)
  {
    char c = 'A';
    System.out.println("c = "+ c);
    System.out.println("c = "+ c);
    c = 't';
    System.out.println("c = "+ c);
    c = '\t';
    System.out.println("c = "+ c);
}

解答 文字'A'を表示しようとすると,整数65ではなく文字"A"が表示されます.

実行結果

\begin{figure}\centering\includegraphics[width=7.8cm]{JAVAFIG/Cast.eps}
\end{figure}

練習問題 2..1   文字型
文字YのASCIIコードを出力するプログラムを作成せよ.

整数型(Integer Types)

Javaには4個の整数型が用意されています.

例題 2..3   整数型の演算
\framebox{
\begin{minipage}{13.65cm}
{\rm Java}では次の5つのオペレータで算術の計算を行います.{\rm +, - ,* , /, \%}.そこで,次のプログラムの結果はどうなるか考えなさい.
\end{minipage}}

class Arithmetic
{
  public static void main(String[] args)
  {
    int m = 65;
    int n = 20;
    System.out.println("m+n = " + m + n);
    System.out.println("m+n = " + (m + n));
    System.out.println("m-n = " + (m - n));
    System.out.println("m*n = " + (m * n));
    System.out.println("m/n = " + (m / n));
    System.out.println("m%n = " + (m % n));
  }
}

解答 System.out.println("m+n =" + m + n);では'+'が左から順に処理されるので,最初の+mで整数65が6と5の並びとして処理され,その後,20が2と0の並びとして結合されるので,6520となります.残りの問題は,カッコ内を先に処理するため,演算子として処理されます.他に注意しなければならないのはm/nは商を表し,m%nはあまりを表すことでしょう.

実行結果

\begin{figure}\centering\includegraphics[width=7.8cm]{JAVAFIG/Arithmetic.eps}
\end{figure}

練習問題 2..2   整数型の演算
整数1234の末尾を消して,123を取り出すプログラムを作成しなさい.

増加と減少演算子(Increment and Decrement Operators)

++$–$演算子は演算を行います.数の前におくか後ろにおくかで意味が異なることに注意しましょう.

例題 2..4   増加演算子
\framebox{
\begin{minipage}{13.65cm}
前増加と後増加の違いを確認しなさい.
\end{minipage}}

class FrontAndBackIncrement
{
& nbsp; public static void main(String[] args)
& nbsp; {
    int m,n;
    m = 44;
    n = ++m;
   System.out.println("m = " + m + ", n = " + n );
    m = 44;
    n = m++;
    System.out.println("m = " + m + ", n = " + n);
}

解答 n = ++mは先にmの値を1増やし,それをnに代入するので前増加といいます.またn = m++はmの値を先にnに代入し,その後にmの値を1増やすので後増加といいます. ++mもm++も,ともにm = m+1のことであるが,m = m+1 とはほとんど書かないので,++$–$の使い方に慣れておきましょう.

実行結果

\begin{figure}\centering\includegraphics[width=7.8cm]{JAVAFIG/FrontAndBackIncrement.eps}
\end{figure}

練習問題 2..3   増加演算子
int m=44のとき,m/++mの値はいくつになるか考え,プログラムを組んで確認しなさい.

浮動小数点型(Floating-Point Types)

実数を表すのに用いられる型です. 例えば10進数13.75が与えられたとします.これをコンピュータはどう扱うか見てみよう.まず,10進数13.75は2進数に変換されます.
    13.75 = (8+4+1) + (1/2 + 1/4) = 1101.11

次に,少数点をいちばん左まで移動します.つまり4ビットの移動を行います.ので,
    13.75 = +0.1101112×24
書き直すと
    13.75 = 01101110100002
このとき,最初の0は符号部が正であることを表し,次の6桁は少数部(仮数部)を表し,次の6桁は指数部を表します.指数の最初の数字は符号を表します.一般に32ビットの浮動少数点型では,最初の1ビットが符号部,次の23ビットが少数部,残りの8ビットが指数部を表しています.ちなみに64ビットの double型では,最初の1ビットが符号部で,少数部には52ビットが割り当てられ,11ビットが指数部に割り当てられます.

浮動小数点型の算術計算は,整数型と異なり+,-,*,/の4種類で,普通の少数の計算と同じです.

例題 2..5   浮動小数点型の演算
\framebox{
\begin{minipage}{13.65cm}
次のプログラムの結果はどうなるか考えなさい.
\end{minipage}}

class FloatOperation
{
  public static void main(String[] args)

  {
    double x = 125.5;
    double y = 20.5;
    System.out.println("x = " + x + "and y = " + y );
    System.out.println("x+y =" + (x+y));
    System.out.println("x-y =" + (x-y));
    System.out.println("x*y =" + (x*y));
    System.out.println("x/y =" + (x/y));
  }
}

実行結果

\begin{figure}\centering\includegraphics[width=7.8cm]{JAVAFIG/FloatOperation.eps}
\end{figure}

浮動小数点算術はすべてdoubleで行われるので,double型の代わりにfloatを使うときは,保管場所とアクセスタイムを気にするくらい多くの実数を使うときだけです.

ここからは,基本形ではないのでJavaがはじめてのプログラミング言語の人は,さっと読んでおくだけでよいでしょう.6章から9章で詳しく取り扱います.

配列型(Array Type)

配列はオブジェクトです.つまり,配列はnew演算子を用いて新たに作成しないと使うことができません.配列の宣言は

  型名[ ] 配列名
で行なわれます.配列の宣言は データ型 配列名[]と書くこともできますが,推奨できません.

例えば,int[] argsと書くとargsという配列名は配列型であることを意味します.この配列に5個の整数型の要素を持たせるには,

int[] args = new int[5];
と書きます.new演算子により新たに配列を作成するには,要素の型と個数をnewの後に書きます.これにより,args[0], args[1], args[2], args[3], args[4]の5つの要素が作成されます.配列の要素の番号は0から始まるので,要素数が5ということは0から4までとなります.

配列を初期化する方法は2通りあります.1つは,次の例題で示します.

例題 2..6   配列への格納
\framebox{
\begin{minipage}{13.65cm}
{\rm 整数 \{2,3,5,7,11,13,17\} を{\rm prime}という配列名を持った配列に格納しなさい.}
\end{minipage}}

解答

  int prime[ ] = {2,3,5,7,11,13,17}
と書けばよい.

例題 2..7   配列の要素
\framebox{
\begin{minipage}{13.65cm}
{\rm 整数 \{2,3,5,7,11,13,17\}の5番目の要素11を{\rm k}という変数に代入し表示しなさい.}
\end{minipage}}

解答

class GetIntFromArray
{
  public static void main(String[] args)
  {
    int[] prime = {2,3,5,7,11,13};
    int k = prime[4];
    System.out.println("prime[4] = " + k);
  }
}

と書けばよいでしょう.配列は0から始まるのでprime[4]が5番目の11となります.

実行結果

\begin{figure}\centering\includegraphics[width=7.8cm]{JAVAFIG/GetIntFromArray.eps}
\end{figure}

練習問題 2..4   配列の要素
{0,1,1,2,3,5,8,13,21,34}を要素とする配列aを定義し,第3番目と4番目の要素の和を求めるプログラムを作成しなさい.

文字列型(String Tyep)

配列は同じ型の要素をまとめて扱うときに便利です.しかし,文字を配列として扱うよりも,文字を扱う型を用意したほうが便利さが増します.そこで,JavaにはString型とよばれる文字列を扱う型があります.String型は次のようにして用いることができます.

class StringType
{
  public static void main(String[] args)
  {
    String ss = "Hisashi";
    ss == ss + " Yokota";
    System.out.println(ss);;
  }
}

実行結果

\begin{figure}\centering\includegraphics[width=7.8cm]{JAVAFIG/StringType.eps}
\end{figure}

誤差(Error)

コンピュータのレジスタが有限桁数で演算をおこなうため,レジスタに入りきらない数値があると無視されたりして,演算結果と真の値に違いが出る.このような違いを誤差(Error)といいます.

オーバーフロー(Overflow)

ほとんどのマシンでは,long int 型は4バイトつまり,32ビットの領域が与えれています.しかし,これを超えるような計算をやらせると,間違った結果を表示します.これをオーバーフロー(overflow)といいます.

アンダーフロー(Underflow)

データ型で許されている最小値より小さい絶対値を持つ値が代入され,零になることをアンダーフロー(underflow)といいます.

まるめ誤差(Round-Off Error)

例えば,有理数1/3をコンピュータは0.333333としてメモリにしまう.このとき生まれる誤差をラウンドオフ エラーまたはまるめ誤差(round-off error)といいます.

例題 2..8   まるめ誤差
\framebox{
\begin{minipage}{13.65cm}
次のプログラムを実行するとどうなるか調べよ
\end{minipage}}

class Error
{
  public static void main(String[] args)
  {
    double x = 1000/3.0;
    double y = x - 333.0;
    double z = 3*y -1.0;
    if (z == 0) System.out.println("z = 0");
    else System.out.println("z != 0");
  }
}

解答 このプログラムを実行すると,z != 0が表示されます.紙の上での計算ではz=0のはずがコンピュータではz!=0になります.つまり,まるめ誤差のため,$z$は0とはなりません.つまり,プログラムで値が零なのかテストするには,z == 0ではなく,$\vert z\vert$ $<$ 10E-20などでテストしましょう.したがって,1点でのテストは控えるようにしましょう.条件文については次の章で説明します.

実行結果

\begin{figure}\centering
\includegraphics[width=7.8cm]{JAVAFIG/Error.eps}
\end{figure}

練習問題 2..5   まるめ誤差
次のプログラムを実行し,まるめ誤差がどこに潜んでいるのか見つけなさい.

class RoundError
{
public static void main(String[] args)
 {
double x = 1/9.0;
double y = 1/11.0;
double z = x - y;
double w = 99*z;
System.out,println("w = " + w);
if(w == 2) System.out.println("w = 2");
else System.out.println("w != 2");
 }
}

けた落ち(Cancelling in Digits)

ほぼ等しい数値どうしの引き算,絶対値がほぼ等しく符号が異なる2数の加算などを行った場合,有効桁数が急激に減少することがあります.このような現象をけた落ち(cancelling in digits)といいます.

$\displaystyle 345.678 - 345.666 = 0.012$

の計算では,6桁の有効桁数が引き算することにより,わずか2桁に減少しています.

情報落ち

大きな値と小さな値の加減算を行った場合に,小さい値のけたを大きな値のけたにそろえることによって,仮数部に入りきらない小さい値の情報の一部が落ちてしまうことがあります.このような現象を情報落ちといいます.

$\displaystyle 123456 + 12.3456 = 123468$

となるが,実際の値は123468.3456です.したがって,この計算では12.3456の0.3456の部分が計算結果に何の影響も及ぼさありません.

スコープ(scope) 宣言を行います.ことにより識別子は使えるようになります.このとき,識別子はプログラムテキストの特定部分でしか使えません.例えば,関数内で宣言された識別子の場合は,スコープは,宣言の位置から宣言が行われたブロックの末尾までです.ここで,ブロック(block)とは,{ }で区切られた部分です.

確認問題 2..1  

1. countが100を超えたら,"多すぎます" と表示する文を1行で書きなさい.

2. 次の式の値を求めなさい.ただし,mの値は25,nの値は7とします.

a. m - 8 - n
b. m = n = 3
c. m%n
d. m%n++
e. m%++n
f. ++m - n$--$

3. nから1を引くというコードを4つの方法で表しなさい.

4. どこが間違っているか.

a. if (x $<$ y) min = x

else min = y;

演習問題 2..1  

1. 次のプログラムの実行結果がどうなるか考えなさい.

class CharType
{
public static void main(String[] args)
{
char c = 'A';
int i;
int j = 0x41;
System.out.println("$\yen$nc=" + c);
i = (int)c;
System.out.println("$\yen$nc=" + i);
System.out.println("$\yen$nj=" + j);
i= 66;
System.out.println("$\yen$ni=" + i);
c=(char)i;
System.out.println("$\yen$nc=" + c );
}
}

2. 10個の大文字の母音と小文字の母音を表示するプログラムを例題2.2をまねて作成しなさい.