学習3日目:初めて自作のプログラムを作成。

学習時間について。

  • Day:3
  • Today:10h
  • Total:26h

今日の学習内容。

変数のデータ型。

  • 基本データ型(プリミティブ型)
    • byte
    • short
    • int
    • long
    • float
    • double
    • char
    • boolean
  • 数値型
    • 整数
    • 浮動小数点数(実数)
  • ※整数と小数に違いがある
  • ※小数を明示しない限り使えない
整数型
  • int
    • 32ビット(4バイト)
    • デフォルト値:0
    • 整数 -2147483648~2147483647(約21億)の値を扱える
    • Java8以降で符号なしの値にした場合は0〜4,294,967,295
  • long
    • 64ビット(8バイト)
    • デフォルト値:0
    • 整数 -9223372036854775808~9223372036854775807(約100京)の値を扱える
    • Java8以降で符号なしの値にした場合は0〜18,446,744,073,709,551,615
    • 数字の値の後に「i」もしくは「I」
    • 小文字の「i」は数字の「1」と間違えやすいため一般的には大文字の「L」を使う
    • 例:long num = 17232185782435249L;
  • byte short
    • 性能の低い環境(昔のコンピュータ)でのみ利用を検討する価値がある
    • 現在ではintを普段使い

longは便利であるけど全ての整数にlongを使えばメモリに負担がかかってしまう。なので必要なときに限ってlongを使い、普段はintを使うようにする。

小数型(浮動小数点数)
  • float
    • 32ビット(4バイト)
    • デフォルト値:0.0
    • 数字の値の後に「f」もしくは「F」
  • double
    • 64ビット(8バイト)
    • デフォルト値:0.0
    • 小数を扱うときはdoubleがほとんど
    • 数字の値の後に「d」もしくは「D」
    • 省略した場合はdouble型とみなされる
真偽値型
  • boolean(ブーリアン)
    • 1ビット
    • デフォルト値:false
    • true、もしくはfalseを表す真偽値
      • TやFと略されることもある
文字型
  • char(キャラ、チャー)
    • 16ビット(2バイト)
    • デフォルト値:¥u0000(空文字)
    • Unicodeが持つ1文字
    • 「’」(シングルクォーテーション)で1文字を囲むことでchar値を指定可

参照型:前日扱ったString(文字を扱う)は基本データ型ではなく、参照型と呼ばれるもの。基本データ型以外の型はすべて参照型。参照とは、データが置かれているメモリ上の場所のことを指す。

null:指し示す場所が何もないということ。NullPointerException=エラー。2ちゃんの「ぬるぽ」はこれが語源らしい。

1 :仕様書無しさん:02/06/20 15:09  
 
   ∧_∧  
  ( ´∀`)< ぬるぽ

2 :仕様書無しさん:02/06/20 15:11

   ( ・∀・)   | | ガッ
  と    )    | |
    Y /ノ    人
     / )    <  >__Λ∩
   _/し' //. V`Д´)/ ←>>1
  (_フ彡        /

参照元:NullPointerExceptionを「ぬるぽ」と呼ぶスレ
基本データ型のラッパークラス

基本データ型を参照型として扱うこともできる=ラッパークラス。

基本データ型ラッパークラス
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean
  • intchar以外は先頭の文字を大文字に変えるだけ
    • intがInteger、charがCharacter
  • 変換は自動的に行われる
    • 明示的に変換の命令を記述する必要はない(可能ではある)
  • 参照型の初期値はnull

四則計算+α。

計算には算術演算子を使用する。

算術演算子説明
+足す
引く
*掛ける
/割る
%割った余りを求める
++1増加させる
1減少させる
public class Sample01 {

    public static void main(String[] args) {
        int num1 = 131;
        int num2 = 19;
        int result = num1 + num2;
        System.out.println("num1 + num2 = " + result);
        result = num1 - num2;
        System.out.println("num1 - num2 = " + result);
        result = num1 * num2;
        System.out.println("num1 * num2 = " + result);
        result = num1 / num2;
        System.out.println("num1 / num2 = " + result);
        result = num1 % num2;
        System.out.println("num1 % num2 = " + result);
    }
}

/* 結果

num1 + num2 = 150
num1 - num2 = 112
num1 * num2 = 2489
num1 / num2 = 6
num1 % num2 = 17

*/
  • 元のコードでは5つの変数があったが、それだと5倍のメモリを必要とする。よって、1つの変数resultに置き換えた
  • 文字列同士、もしくは文字列と数値のデータに + を使うと、文字列の連結が可能
  • 整数と整数の割り算の商は、整数値(小数点以下が切り捨て)
    • 3 / 2 を計算した結果は 1 
    • 小数値が必要な場合はキャストを行う(下記のコード)
public class Sample01 {

    public static void main(String[] args) {
        int a = 3;
        int b = 2;

        System.out.println(a / b);
        System.out.println((double) a / b);
        System.out.println((double) (a / b));
    }
}

/* 結果

1
1.5
1.0

*/
  • キャストとはある変数の型を処理の途中で一時的に別の型に変換した上で処理を行う仕組みのこと
    • 割り算全体を double にキャストするのはダメ(9行目)
      • 計算式ではなくデータ(変数)へ
public class Sample01 {

    public static void main(String[] args) {
        System.out.println("処理開始");

        try {
            System.out.println("割り算開始");
            int a = 10 / 0;
            System.out.println(a);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } finally {
            System.out.println("割り算終了");
        }

        System.out.println("処理終了");
    }
}

/* 結果

処理開始
割り算開始
割り算終了
処理終了
java.lang.ArithmeticException: / by zero
	at Sample01.main(Sample01.java:8)

*/
  • 通常であれば0の割り算はエラーが表示される
    • ArithmeticException(算術エラー)
  • 例外処理を入れることでエラーが発生しても最後まで処理される
  • try:例外が発生しそうな箇所を囲む
  • catch:終了することなくcatch ブロック内の処理を実行
    • printStackTrace:発生した例外の内容をログへ残す際に使われる命令
    • 例外発生時の処理が不要であれば空でも良い
  • finally:特定の終了処理を必ず行ってほしい際に使用
    • try 内で例外が発生しようが正常に処理が完了したとしても
    • 必ずしも必要ではない
  • 利用するJava標準の命令によっては、例外処理(try と catch)を必ずつけなければならないものがあるので注意

メソッド。

  • メソッド:自分がしたいこと=機能をひとまとめにしたブロック
    • 独自に作ることが可能
 public static void sumMethod1(int num1, int num2) {
        int result = num1 + num2;
        System.out.println(result + "method1");
    }
  • メソッド名:sumMethod1
  • 処理内容:{}で囲われている箇所
  • メソッドを使うことで、再利用できるような仕組み化が可能
  • 引数(ひきすう):メソッド内部で処理をするために必要な値を、受け渡しをするための仕組み
    • 例:メソッド名の後の()内にあるint num1int num2
    • 外部から数値や文字などの入力がない場合は無くてもよい
  • 外部からデータをもらう必要があるときに引数は必要
 public static int sumMethod2(int num1, int num2) {
        int result = num1 + num2;
        return result;
    }
  • return:戻り値。計算結果を呼び出し元に戻すことが可能
    • 1行目の3単語目が戻り値の指定(int
      • 戻り値が不要:void
      • 文字列に戻したいとき:String
  • メソッドの戻り値と実際の戻り値の型は一致している必要がある
    • 例:intと書いてあれば、Stringには戻せない
  • 戻り値があることで、その結果を利用して、さらに次の処理ができる(下記例)
public class Sample01 {

    public static void main(String[] args) {
        int num1 = 100;
        int num2 = 10;
        int result;
        result = sumMethod2(num1, num2);
        System.out.println(result + "method2");

    }

    public static int sumMethod2(int num1, int num2) {
        int result = num1 + num2;
        return result;
    }
}

/* 結果

110method2

*/
  1. int num1 = 100;100を宣言(4行目)
  2. int num2 = 10;10を宣言(5行目)
  3. 変数 result を宣言(6行目)
  4. result = sumMethod2(num1, num2);の右辺でsumMethod2を実行(7行目)
  5. さきほど宣言した10010を引数として持って、sumMethod2本体へ処理が移行
  6. 引数の10010sumMethod2内部のnum1num2に引き渡される
  7. int result = num1 + num2;で足し算される
  8. その結果は左辺のresultに格納
  9. 最後のreturnresult(計算結果)を元のメインメソッド6行目に戻す
  10. result = sumMethod2(num1, num2);(7行目)の左辺のresultに、計算結果の110が代入される
public class Sample03 {

    public static void main(String[] args) {
        int num1 = 100;
        int num2 = 10;
        sumMethod1(num1, num2);

        int result;
        result = sumMethod2(num1, num2);
        System.out.println(result + "method2");

    }

    public static void sumMethod1(int num1, int num2) {
        int result = num1 + num2;
        System.out.println(result + "method1");
    }

    public static int sumMethod2(int num1, int num2) {
        int result = num1 + num2;
        return result;
    }

}

/* 結果

110method1
110method2

*/

途中でエラーが発生していて実行できなかったので時間を喰った。原因はクラス名とファイル名が異なるという初歩的なミス。また、なぜか全てのコードをdeleteするとEclipseが落ちる。。

  • sumMethod1 sumMethod2:メソッド名
  • (int num1, int num2)のカッコ内のnum1num2:引数
    • 引数は何個でもよい(ゼロでも)
  • sumMethod1void
    • 戻り値なし
  • sumMethod2int
    • 戻り値あり
      • 型を指定(intString
  • return:メソッドの外に処理を戻す
  • 定義されていないメソッドを実行するとエラーになる
    • 例:メソッド sumMethod3(int, int) は型 Sample02 で未定義です

「1ヶ月内の経過秒数計算機」を作ってみた。

public class Clock {

    public static void main(String[] args) {
        int seconds = getSecond(13, 14, 38, 32);
        System.out.println(seconds);

    }

    public static int getSecond(int d, int h, int m, int s) {
        int result = 86400 * d + 3600 * h + 60 * m + s;
        return result;
    }

}

/* 結果

1175912

*/

このコードを書いたときの時間は13日14時38分32秒でした(よって1,175,912秒)。初めは1年の経過秒数を作ろうとしたけど、閏年や30、31日が月によって違うために諦めた。。たぶん条件分岐とか使うのかな。

税込価格を求めるプログラムを作成。

public class Tax2 {

    public static void main(String[] args) {
        int tax = 10; //税率
        int nonTaxed = 1500; //税抜価格
        double result;
        result = taxMethod(tax, nonTaxed);
        double taxIncluded = result + nonTaxed; //税込価格
        System.out.println(nonTaxed + "円の商品の税込価格は" + (int)taxIncluded + "円(消費税は" + (int)taxMethod(tax, nonTaxed) + "円)です。");
    }

    public static double taxMethod(int tax, int nonTaxed) {
        double result = nonTaxed * (tax * 0.01); //消費税
        return result;
    }
}

/* 結果

1500円の商品の税込価格は1650円(消費税は150円)です。

*/
条件
  • 課題:○○円の商品の税込価格は○○円(消費税は○○円)です。と表示するプログラム
  • mainメソッドとtaxメソッドは切り分ける
  • taxメソッドでは消費税計算(10%)のみ行う
  • mainメソッドはtaxメソッドから戻り値の消費税(10%)を受ける
  • 消費税に小数が含まれる場合は切り捨てるなどして、整数で表示させる
  • 税率の数字を変更するだけでプログラムを書き直す必要がないようにする

doubleに翻弄された。。税率のところに小数点を使わなかったのがポイント。しかし、doubleを使ってるからどうしても.0が出てきてしまう。これを消すにはDecimalFormatを使う方法など様々あるようだが、できれば使いたくないよな。今はとりあえず置いておこう。

※int型でキャストしたら解決した。

コンピュータとJavaプログラム。

  • CPUは0と1しか解釈できない(2進数)
  • なので機械語への翻訳が必要
    • コンパイラ型(事前にまとめて翻訳)
    • インタープリター型(逐次一行ずつ翻訳)
  • コンパイラ型について
    • メリット:処理速度が速い
    • デメリット:プログラムコードを一文字でも変更すれば、コンパイルしなおす必要がある
  • インタープリター型について
    • メリット:都度プログラムコードを変更しても即時実行できる(コンパイラ不要)
    • デメリット:処理速度が遅い
  • Javaは両方の言語である
    • 1:Javaコンパイラ(javac)で中間言語(バイトコード)という、どのハードウェアやOSにも依存しない機械語に変換
    • 2:バイトコードを、実行するハードウェアやOSに合わせたJavaVMが読み込んで機械語に変換し実行
    • さまざまなハードウェアやOS上で実行可能
      • 実行するまでは中間言語
  • 分類的にはインタープリター型
  • 変数と宣言は、メモリ上にデータを展開するため必要
  • 参照型はメモリを指し示すのでポインタとも呼ぶ

気になった点。

floatの方がサイズは小さいのにdoubleを使うよう推奨されるのはなぜ?
  • floatの使用によりオーバーフローが発生することも考えられるから
    • 昔であればメモリが限られていたので使い分ける必要があったが、現在ではその必要はない
  • doubleは、計算時により多くのスペースを取るが、より正確

今日の反省と明日に向けて。

自分でメソッドを作れるのは様々な選択肢が生まれるので面白いと思った。しかし、戻り値やキャストのところがイマイチ理解できていなかったので、復習する必要がある。明日は制御構文に入るのでより複雑になっていくだろうが、地道にトレースして感覚を掴んでいきたい。

閉じる