Java-4 ?>

Java-4

色々なクラスを使ってみよう

Java4では基礎編の仕上げとして、Java言語でのプログラミングでよく使用されるクラスの実装とその内容を学習していきます。

Javaプロジェクトを作成しよう

Java4のプロジェクトを作成します。

Javaプロジェクトの作成

ラッパークラスを使って型を違う型に変換しよう!

よく利用されるラッパークラスを使用したクラスの型変換です。ラッパークラスについてはJava2で解説していますので、適宜読み返してください。

Java-2

Integer型を変換

String型に変換

Long型に変換

int型を変換

String型

Long型

long型

キャスト変換とは

小さな型を大きな型に代入(たとえば、int型の値をlong型に代入)することです。
しかし、その逆の大きな型から小さな型にそのままでは不可です。long型の値がint型に格納できるとは限らないからです。そこで、明示的にlong型の値をint型にキャストする必要があります。

課題:Integer型を変換しましょう

Java4のプロジェクトにRenshu1.javaを作成して、Integer型を変換しましょう。

型変換した後の変数の値を出力して、エラーがなければ上手く変換できていることになります。ラッパークラスの変数を扱う場合とプリミティブ型の変数を扱う場合では、変換方法が異なっているので気をつけましょう。

スクリーンショット 2017-03-21 午後1.58.00

String型を変換

Integer型に変換

Integer.parseIntまたはInteger.valueOfを使うことでInteger型に変換できます。Integer.parseIntはプリミティブ型であるint型を戻り値としているため、Integer i1に格納される際はオートボクシングの機能が働いています。詳しい説明は下記の参考記事を確認してください。

【Java】オートボクシング、アンボクシング
http://qiita.com/chihiro/items/870eca6e911fa5cd8e58
parseIntとvalueOfの違いって何!?
http://tomoprog.hatenablog.com/entry/2016/02/03/182803
Long型に変換

Long型にもInteger型と同様なメソッドが用意されています。下記の記事はそれぞれの実行速度なども考察しているので、実践的なプログラミングでの参考になります。

Long.parseLong(s)とLong.valueOf(s)の違い
http://monokurotamago.hatenablog.com/entry/2014/02/16/153556

課題:String型を変換しましょう

Java4のプロジェクトにRenshu2.javaを作成して、String型を変換しましょう。

作成したJavaファイルは実行して動作結果を確かめてください。

スクリーンショット 2017-03-21 午後2.26.58

日付 Date型について

Date型を使おうとするとこのようなエラーが出ます。

スクリーンショット 2017-03-21 午後2.30.57

エラーを解消するには横にある、エラー電球をクリックしてください。

スクリーンショット 2017-03-21 午後2.32.20

Dateをインポートします(java.util)を選択してください。するとエラーがなくなります。

スクリーンショット 2017-03-21 午後2.34.47

コードにimport java.util.Date;が追加されエラーがなくなります。

importについて

特定のパッケージに含まれるクラスを参照したい場合、このように書けます。

しかし、Date型を何度も使用したい場合、毎回java.util.Dateを書くのは大変です

このような特定のパッケージに含まれるクラスを参照したい場合、importを使用します。import文は以下のように書きます。
import パッケージ名 . (ドット)クラス名;

また、参照したいパッケージ全体をインポートするには以下のように書きます。
import パッケージ名 . *;

下記の参考記事も確認しておきましょう。

Javaの実案件に必須のパッケージとインポートを知る
http://www.atmarkit.co.jp/ait/articles/0908/28/news104.html

Data型を使ってみよう

Date型からいろんな値を設定・取得

値の取得

このように値を取得することができますが、取り消し線がついています。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-04-16-34-48
このような取り消し線のあるのは非推奨といって、Javaがこのメソッドを使うのを勧めていません。Date型の値の操作はほとんど非推奨とされています。

課題:Date型を使ってみましょう

Java4のプロジェクトにRenshu3.javaを作成して、Date型を使ってみましましょう。

作成したJavaファイルを実行して動作を確認してください。

スクリーンショット 2017-03-21 午後2.51.12
次項で解説していくCalender型の登場によって、Date型で提供されていた日付操作メソッドは全て非推奨となりましたので、Date型のメソッドでプログラムを記述することはありません。一応、Date型にもこのようなメソッドが存在していることを頭の隅に入れておきましょう。

Calender型

Calender型とは

Date型をサポートするクラスがCalender型となります。このjava.util.Calenderをインポートして使うことで日付の値の入出力を行うことができます。

値の入出力

上記のプログラムを実行すると下記のような実行結果が得られます。間違えやすい部分ですが、Calenderクラスで月を設定する時は0~11で考える必要があります。

スクリーンショット 2017-03-21 午後3.25.17

課題:Calender型を使ってみましょう

Java4のプロジェクトにRenshu4.javaを作成して、Calendar型を使ってみましましょう。プログラムを実装したら、実行して出力結果を確かめてください。

日付をフォーマットする

先ほどの誕生日の出力を行う場合、年月日を1つずつ取得して表示していますが、java.text.SimpleDateFormatを使うことで指定したフォーマットに出力できます。では先ほどのソースを修正しましょう。

SimpleDateFormat("フォーマット");を使用することで、簡単に日付を出力することができます。フォーマットについては、これらのパターン文字を使って出力したい情報をフォーマットに設定します。

文字 説明
G 紀元 AD
y 1996, 96
M July, Jul, 07
w 年における週 27
W 月における週 2
D 年における日 189
d 月における日 10
F 月における曜日 2
E 曜日 Tuesday, Tue
a 午前/午後 PM
H 一日における時(0~23) 0
k 一日における時(1~24) 24
K 午前/午後の時(0~11) 0
h 午前/午後の時(1~12) 12
m 30
s 55
S ミリ秒 978
z タイムゾーン Pacific Standard Time, PST, GMT-08:00
Z タイムゾーン -0800
  • パターン文字の連続する数によりフォーマットが決まります。yyの場合は年を2桁で表します。yyyyの場合は年を4桁で表します。
  • 年を2桁で表す場合、オブジェクトが生成された年の前80年以内、後20年以内の範囲の年が認識されます。2000年にオブジェクトを生成した場合、21年は1921年と解釈され、15年は2015年と解釈されます。
  • 月を表すパターン文字において、パターン文字の連続が3文字以上(MMM)の場合は、月をテキスト(July, Jul)で表示します。2文字以内(MM)の場合は、数字(07)で表します。

課題:日付をフォーマットしてみましょう

Renshu4.javaを修正して、日付をフォーマットしてみましましょう。

修正したプログラムを実行して出力結果を確認してください。コードはシンプルになりましたが、出力結果は同じになっていると思います。

スクリーンショット 2017-03-21 午後3.48.05

日付 LocalDate型について

java.time.LocalDateはJavaのバージョン8から導入された新しいクラスです。Date型Calender型が合わさったような日付クラスとなります。
Date型やCalender型と違い、年に1900を足したり、月に1を足したりという処理が不要になります。

課題:LocalDate型を使ってみましょう

Java4のプロジェクトにRenshu5.javaを作成して、LocalDate型を使ってみましましょう。

プログラムを実行すると、以下のような出力結果が得られます。

スクリーンショット 2017-03-21 午後4.18.43

JavaSE7以前の日付APIは少し不便な実装しか出来ませんでしたが、JavaSE8から導入されたtimeAPIを使用することによって煩わしさが解消されてきました。新規のシステム開発ではtimeAPIを利用した日付操作が一般的になってくるかと思いますが、既存システムの保守などでは古い日付操作の実装が残っています。特にCalenderクラスを使用した日付操作は頻繁に利用されてきたので、細かな仕様なども理解しておくように努めましょう。


例外処理

Javaではコンパイル時に発生するコンパイルエラーと実行時に発生する実行時エラーがあります。ここでは実行時に発生するエラーに対して別途記述した処理を行わせたい場合に使われる例外処理について確認していきます。

不正な値を変換すると

String型からInteger型に変換する場合を例にしてエラーを発生させてみます。以下のサンプルコードでは、String型に数値文字列ではない通常の文字(型変換出来ない値)を代入して、それをInteger型に変換しています。

するとコンソールにこのような結果がでます。
スクリーンショット 2017-03-22 午前9.52.04
これは例外処理といって、予期していない処理が行われた時に発生します。

例外処理

例外とはプログラム動作における予期せぬ事象(エラー)のことを言います。Javaでは例外が発生した時、あらかじめ用意されているエラーメッセージを表示しプログラムを終了します。

例外を「キャッチ」する

Javaが例外を見つけることを 「例外をキャッチする」と言います。例外をキャッチするにはtry - catch文を使用します。では先ほどの処理にtry - catch文を追加してみましょう。

すると、例外をキャッチし数値に変換できない不正な値が設定されています。が表示されます。

スクリーンショット 2017-03-22 午前9.57.59

finally文

tryまたはcatchの処理が終わった後、例外が発生するしないに関わらず実行する処理をfinallyといいます。先ほどのソースに処理を追加してみます。

実行してみると、finallyに記述した内容が出力されることが確認できます。

スクリーンショット 2017-03-22 午前10.02.04

課題:不正な値を入れて例外処理を使ってみましょう

Java4のプロジェクトにRenshu6.javaを作成して、エラーをキャッチするプログラムを実装してみましょう。

作成したJavaファイルは実行してプログラムの動きを確認してください。
スクリーンショット 2017-03-22 午前10.12.50

例外を複数設定

例外の種類によってエラーメッセージを表示させたい場合、catchを複数使うことで対応できます。

例外の種類

すべての例外クラスはThrowableクラスの子孫クラスです。

種類 特徴 詳細
Error 処理の継続不可・致命的なエラー 処理の継続が難しい致命的な場合であるため、例外処理も記述できません。
Exception 検査例外 コンパイル時に例外処理の実装が強制される
RuntimeException 実行時例外 コンパイル時に例外処理の実装が強制されません.

実際にスローされるクラスは、「Throwable」クラスを直接継承しているのではなく、上記3種類(Exception、RuntimeException、Error)のクラスのいずれかから派生しています。各クラスの階層構造は次の通りです。
untitled

キャッチできる例外

多くの例外処理は親クラスのExceptionでキャッチできますが、エラー別にキャッチすることが可能です。そのエラーの種類を紹介します。

NumberFormatException

先ほどの例外処理で文字列を数値に変換した時、数値以外の値の場合発生します。

NullPointerException

操作しようとした値がnullの場合発生します。
例:

ArrayIndexOutOfBoundsException

不正なインデックスを使って配列にアクセスしようとすると発生するエラー
例:

課題:いろんなエラーを使ってみましょう

Java4のプロジェクトにRenshu7.javaを作成して、エラーをキャッチしてみましょう!

作成したJavaファイルは実行してプログラムの動作を確かめてください。
2パターンの例外があるので、片方をコメントアウトしながら、それぞれの動作結果を確かめてください。
スクリーンショット 2017-03-22 午前10.49.39
スクリーンショット 2017-03-22 午前10.54.18


正確な計算処理をおこなうクラス

Java を使って浮動小数を計算する場合は、BigDecimal クラスを利用します。float 型 や double 型では、誤差が出る可能性があることを理解しておきましょう。
実務の中で厳密なお金の計算をする場合、特に外貨などを扱う必要が場合は、BigDecimal クラスは必須です。

普通の計算の仕方と違うので、慣れるまで難しいと思うかもしれませんが、厳密な計算をするためには必要ですので、課題をこなしてマスターしましょう。

浮動小数点型のデメリット

丸め誤差

Java4のプロジェクトにRenshu8.javaを作成して、以下のコードを実行してください。

答えは1.7ですが、出力されるのは1.7000000000000002と誤差が発生します。このような現象を丸め誤差と言います。

floatdoubleは2進浮動小数点型とも言われており、例えば「0.5」という10進数を2進数で表すと「0.1」になります。他にも10進数「0.625」は2進数「0.101」、10進数「0.75」は2進数「0.11」となります。

しかし、10進数「0.1」は2進数「0.0001100110…….」と2進数の小数では表現しきれないものがあり、誤差が発生します。その結果、先ほどのような値が出力されます。

情報欠落

情報欠落とは,2つの数の加減算を行うための桁あわせにより,一方の数値の仮数部が表現可能範囲から押し出されてしまうことです。
例:

浮動小数点型を使った計算には、他にもオーバーフロー、アンダーフロー、桁落ち、打ち切り誤差が発生します。このようなエラーや誤差に対応した型をBigDecimal型と言います。

BigDecimal型

先ほどのようなエラーを発生させない為、正確な値を使用する場合はjava.math.BigDecimalを使用します。

Renshu8.javajava.math.BigDecimalを使用して先ほどの丸め誤差の処理を修正しましょう。

なぜBigDecimalを使わなければならないのか
http://javazuki.com/articles/bigdecimal-why.html
BigDecimalの使い方
http://javazuki.com/articles/bigdecimal-usage.html

複雑な計算

Mathクラス

指数関数、対数関数、平方根、および三角関数といった基本的な数値処理を実行するためのMathクラスについて簡単に紹介します。Mathクラスには以下のようなメソッドが用意されていて、複雑な計算処理も一行で完結することがほとんどです。Javaにはこのようなクラスが標準で提供されているということを覚えておくと実務でも役立ちます。


演習問題

Enshu.javaを作成して問題を解いてください。

問題1:コンソールに今日の日付(例:2017/04/01)を表示して下さい。
問題2:あなたの生まれた誕生日の曜日を表示して下さい。(例:月曜)
問題3:String型9,9999-100五十三をそれぞれ2倍した値を出力して下さい。数値型に変換できない場合は0を表示するようにして下さい。
問題4:1.03から0.42の値を引いた結果を出力して下さい。
問題5:直径が10cmの円の円周と面積を求めて下さい。
問題6:0~99をランダムで取得した値によってこれらを表示して下さい。

  • 0~4場合大凶
  • 5~19場合
  • 20~29場合小吉
  • 30~59場合
  • 60~89場合中吉
  • 90~99場合大吉

解答:a-4