【ITエンジニア】(7)Javaの基礎 [1]

Javaについて

Javaとは

Javaとはプログラミング言語の1つで、習得したい言語として1位を記録するほどに期待度の高い言語となっています。

ここまで人気の高い理由として上げられるのは、

  • Javaが多くの現場で使用されている点
  • 汎用的でOSに依存しない点

が挙げられるでしょう

また、様々な言語の元になっているという点においてもJavaは優れているといってもいいでしょう。

Javaでどんなことができるの?

JavaはOSに依存しないことから、どんな環境でもソフトを動かすことができます。
例えば、今は見なくなってきているガラケーでも 、Javaを使ったアプリケーションを組むことができます。

また、Javaはサーバーサイドでも活躍しています。
サーバーサイドとはサーバー側で動くアプリケーションのことで、Web上のアプリケーションなどがよい例だといえるでしょう。

そのような意味ではJavaはWebと相性が良く、総じていえばどんなものにも搭載されているマルチな言語であるという事ができるでしょう。

Javaの種類

JavaにはSE(Standard Edition)と呼ばれるものとEE(Enterprise Edition)と呼ばれるものがあります。

【SE】

JavaSEはパソコン上で動作するゲームや便利なソフトを作ることができます。

パソコンでの用途以外では携帯電話や家電に仮想マシン(VM)と呼ばれる仕組みが搭載されていれば、Java言語を使ってアプリケーションの開発を行うことができます。

最近で言えばandroidを搭載したスマートフォンのアプリを作る際にJava言語を使用するためこのJavaSEの導入は必須となります。

【EE】

Webサイト(もしくはWebアプリケーション)を開発する際に用いられます。
では具体的にどのようなサイトで使うのでしょうか。

ユーザーがブラウザを使ってとあるサイトにアクセスしたとします。 Webサイト(もしくはWebアプリケーション)を開発する際に用いられます。
Webサイトが置いてあるサーバーはユーザーからのアクセスに応じてWebサイトの情報をユーザーに送ります。

この送る際に何か処理が必要な場合にJava EEの出番となります。

Javaを使うメリット
  • 処理速度が早い(※遅いといっているエンジニアもたまにいますが…)
  • スクリプト言語と比較するとコンパイル言語のほうが早い
  • プラットフォームに依存しない
  • オブジェクト指向である
  • プログラムの管理を細かく行うことができるので複数人で同じものを開発するときなど作業効率がよい
Javaを使うデメリット
  • プログラミング以外の作業が面倒(開発環境の設定、ミドルウェアの設定など)

Javaを動かしてみよう

Javaをインストールしよう

https://www.javadrive.jp/install/jdk/index1.html
https://www.javadrive.jp/install/jdk/index4.html

上記サイトを元にJavaのインストール及び環境変数の設定を行いましょう。

Javaを動かしてみよう

【Javaファイルを作る】

まずはメモ帳を開き、開いたら下のコードを入力してみましょう。

入力が終わったら保存をします。

このとき、

  • ファイル名:Test.java
  • ファイルの種類:すべてのファイル

で保存しましょう。

ここまででJavaのファイルができます。

【Javaファイルをコンパイルする】

先ほど作成したJavaファイルをJava仮想マシン(Java virtual machine、Java VM、JVM)で実行できるファイルに変換します。
これをコンパイルといいます。

コンパイルはコマンドプロンプトから行います。
こスタート]⇒[アクセサリ]⇒[コマンドプロンプト]  

以下のコマンドを入力し、先ほど作ったJavaファイルのディレクトリに移動しましょう。

ディレクトリの移動ができたら以下のコマンドでコンパイルをしてみましょう。

ここではコンパイルするファイルの拡張子までしっかりと書きましょう。

コンパイルが終わると同ディレクトリにTest.classというクラスファイルが出力されます。

【クラスファイルを実行する】

では以下のコマンドでプログラムを実行してみましょう。

実行時は拡張子の記載はいりません。Hello World!!と出力されたでしょうか。。
ここまでがプログラムを書いて実行するまでの流れとなります。

基本構文

Javaの基本構文を覚えよう

Javaの中身は基本的にクラスとメソッドといわれる二つの構成から成り立っています。
先のコードを使って説明していきましょう。

Test.java

                                                                                                                                                                                                                                                                                                                                                【クラス】

①⑤がクラス宣言になります。
基本的にclass クラス名{}で記載されます。
“{“と”}”の間にそのクラスに関する記述を行います。
クラス名はファイル名と同じになるので必ず大文字で作成してください。

そもそもクラスとは何なのか…簡単に説明すると設計図みたいなものになります。
クラスの中には具体的に何をさせたいのかを記述していきます
Test.javaでは1つしかメソッド(後に説明)がありませんが、複数の記載を行うことができます。
マリオでイメージすると下記のような感じになります。

【メソッド】

                                                                                                                                                                                                                                                                                                                                                                                                                                                  ②④がメソッドの構文です。基本的には戻り値の型 メソッド名{}で記載できます。

メソッドでは具体的な内容の記載をしていきます。
マリオでイメージすると下記のような感じになります。

                                                                                                                                                                                                                                                                                                                                                                                               今回②④で記載しているpublic static void main(String[] args){}は、SEでプログラムが読み込まれる際に一番最初に読まれるメソッドを定義する定型文となるので忘れないようにしましょう。

ではそのほかのメソッドはどのように定義すればよいのでしょうか。

上記が基本構文となっていますので覚えておきましょう。

【メンバ変数】

①②の間にデータ型の変数宣言を行った場合クラス内で使用する共通の変数を生成することができます。

これをメンバ変数または、クラス変数と呼びます。
これはオブジェクトが持つパラメータになっており、後述にて使用をします。

修飾子とは

色々な修飾子

ここでは色々な修飾子について覚えていきましょう。

【修飾子】

修飾子は主にクラス宣言やメソッド宣言で用いられるものです。
修飾子は何も指定しない場合デフォルトの修飾子を選択されたことになります。
また、修飾子は大きく分けて2つに分類されています。

【アクセス修飾子】

1つ目はアクセス修飾子です。
これはアクセス制御を実現する修飾子です。
パッケージ(ディレクトリ)やクラスを単位として、クラスやメソッドにアクセスできるか否かを制限するための修飾子です。

アクセス修飾子は以下の4種類が定義されています。

  • private … 自分自身が含まれるクラス内からしかアクセスが不可能
  • protected … 同じパッケージ及び継承するサブクラスからしかアクセスが不可能
  • public … 全ての場所からアクセスが可能
  • デフォルト … 以上のいずれも指定しない場合同じパッケージ内に属するクラス内からのみアクセスが可能

privateとprotectedについて説明していきます。

  • private … 自分自身が含まれるクラス内からしかアクセスが不可能

各メソッドがprivate修飾子のときで場合分けしてみましょう。

case1:メソッド①がprivateの場合

同クラス内にメソッドが存在しないためメソッド①にアクセスできるメソッドが存在しないことになります。

case2:メソッド②がprivateの場合

同クラス内にメソッド③が存在するのでメソッド③からのみアクセスすることが可能になります。

case3:メソッド③がprivateの場合

同クラス内にメソッド②が存在するのでメソッド②からのみアクセスすることが可能になります。

case4:メソッド④がprivateの場合

同クラス内にメソッドが存在しないためメソッド④にアクセスできるメソッドが存在しないことになります。

  • protected … 同じパッケージ及び継承するサブクラスからしかアクセスが不可能

protectedは同パッケージ内であればアクセス可能というのはなんとなくわかると思います。

しかし、サブクラスからアクセスが可能についてはわからないと思いますので上記を元に説明していきます。
上記ではMarioクラスがGameTitleクラスを継承し、MarioクラスのmarioGameからmarioRPGを呼び出そうとしていますが、この状態だと呼び出すことができません。
なぜならprotectedの意味は正確には「ケージ及びそのサブクラスからそのサブクラスへの参照を通してアクセスできる」になるからです。

なのでmarioRPGを呼び出すためには下記のどちらかのように記述しなければいけません。

【その他修飾子】

アクセス修飾子以外の修飾子。
メンバーの種類に応じて使用可能なものが変わります
定義されているのは次の6つです。

  • abstract … 抽象クラス、抽象メソッド。継承されて実装を記述されて初めてインスタンス化可能。
  • static … インスタンス化してもしなくても利用可能なクラス固有のメンバー。
  • final … 継承できずオーバーライドできない。
  • strictfp … FP厳密。浮動小数点数が、CPUの処理系に依存せずに厳密に同じ演算結果となる。
  • transient … 直列化不可能。JVMの外部に書き出し不能なメンバー。
  • volatile … マルチスレッドによるアクセス時に、必ずマスターコピーと同期を取る。

基本的にabstract、static、final辺りを覚えておけば問題ないです。

これらの修飾子は、同じものを複数指定することはできません。
異なるものでも、同時に指定できるものと排他的なものが存在します。
どこで何が使えるのか下記の一覧を覚えておきましょう。

パッケージ補足

【フォルダ構成とpackageの指定についての補足】

【protectedの実行例】

データ型

色々なデータ型と演算子】

<データ型>

まず以下に基本データ型を紹介していきます。

  • boolean … 1ビット … 真偽値falseまたはtrue
  • char … 16ビット … Unicode企画の文字、\u0000~\uFFFF
  • byte … 8ビット … 符号つき整数、-128~127
  • short … 16ビット … 符号つき整数、-32768~32767
  • int … 32ビット … 符号つき整数、-2147483648~2147483647
  • long … 64ビット … 符号つき整数、-9223372036854775808~9223372036854775807
  • float … 32ビット … (IEEE754)浮動小数点数、±3.40282347E+38~±1.40239846E-45
  • double … 64ビット … (IEEE754)浮動小数点数、±1.79769313486231570E+308~±4.94065645841246544E-324

はい、何いってるのかわかりませんね。
booleanが真偽値、charが半角1文字、intが整数値、longが整数値の桁数の多いやつ、floatが少数点以下を含む数値と覚えとけばOKです。

これに文字列を扱うStringを覚えておけば基本的なことはできるようになります。
これらを使って変数の宣言を行っていきます。

基本的には[A]のような宣言を行います。
変数名はユーザの任意の値なので命名規則に従うかわかりやすく命名しましょう。
適当ではありますが[B]のような感じです。

<配列>

同じ目的使用される複数の値を格納するのに便利なのが配列です。
配列の宣言方法は以下の2種類が主になります。

①では配列に入る値を初期化時に設定し配列の要素数も決めてしまうパターンです
②では配列を宣言した後、要素数を設定してから値を代入するパターンです。

①のパターンでは初期化時に要素数と値を同時に設定してしまうため、初期化時より要素数を増やしたい場合新たに配列を宣言しなければいけないのが難点になります。
②のパターンでは配列の要素数を決めてから値を代入していくため、初めに大きめに要素数を用意することができ宣言した分だけ要素を入れることができます。

また配列から値を取り出したい場合、宣言した要素数分箱は用意されているのですが、宣言した要素数をnとしたとき、取り出す際は0~n-1のカウントとなるので注意しましょう。
n-1以上の数値を[]内に記載するとエラーが発生します。

<型変換>

コードを書いている上で型の変換を行う場合が多々あります。
主に使われるのは数値⇔文字列の変換です。

・数値→文字列へ変換するとき
String.valueOf()を使うことで括弧内に記載された数値型変数を文字列変数へ変換することが可能になります。

・文字列→数値へ変換するとき
Integer.parseInt()を使うことでカッコ内に記載された文字列型変数を数値型変数へ変換することが可能です。

文字列から数値型に変換するとき以下のような場合、エラーが起きるので注意しましょう。
この場合”あいうえお”は数値ではないので数値型に変換することができません。
よってNumberFormatExceptionというエラーが発生します。

コレクションとは

コレクションとは、大きさが決まっていないが、配列のように多数の値をまとめて操作することができるものです。
大きさを初期宣言の段階で決めないので必要な量をデータとして格納することができます。
コレクションには以下のようなものが存在します。

  • List(リスト):順序通りに並べて格納
  • Set(セット):順序があるとは限らず格納
  • Map(マップ):ペアで対応づけて格納

ここでは各コレクションについて簡単に覚えていきましょう。

上記3つのコレクションはインターフェースであり大まかな仕様しか決まっていません。
なので初期化時にどのような仕様であるかコレクションクラスを用いて指定してあげる必要があります。

【Listの初期化】

これで型に準じたListの初期化ができます。
ここではArrayListというコレクションクラスを用います。
Listのオプションの操作をすべて実装しnullを含むすべての要素を許容することができます。       型をStringで初期化するとListの中にはStringしか格納はできないので型もしっかりと考えましょう。
このほかにもLinkedListなどがListのコレクションクラスに挙げられますが基本的にArrayListが使われるのでこちらを使用しましょう。

【Setの初期化】

これでSetの初期化ができます。
ここではHashSetというコレクションクラスを用います。。
型をStringで初期化するとListの中にはStringしか格納はできないので型もしっかりと考えましょう。。
また同一の要素は登録ができなく順序を持たないコレクションです。。
このほかにもTreeSetなどがMapのコレクションクラスに挙げられますが 基本的にHashSetが使われるのでこちらを使用しましょう。

【Mapの初期化】

これでMapの初期化ができます。
ここではHashMapというコレクションクラスを用います。
Mapのオプションの操作をすべて実装しnullを含むすべての要素を許容することができます。
Mapではキーと値に対し型を指定し、キーを元にそのキーに対する値を取得することができます。
また同一のキーは登録ができないのでエラーが出力されます。
ここではこのほかにもTreeMapなどがMapのコレクションクラスに挙げられますが基本的にHashMapが使われるのでこちらを使用しましょう。

いろいろなデータ型と演算子

Javaには算術演算子、比較演算子、論理演算子、インクリメント/デクリメント、再帰代入演算子、三項演算子があります。

【算術演算子】

  • [+] … 加法演算子 足し算
  • [-] … 減法演算子 引き算
  • [*] … 乗法演算子 掛け算
  • [/] … 除法演算子 割り算
  • [%] … モジュロ演算子 余り

法演算子を用いて、文字列の足し算をすることも可能です。
“Mario&Luigi”が出力されます。

【比較演算子】

  • [<] … 小なり
  • [>] … 大なり
  • [<=] … 小なりイコール
  • [>=] … 大なりイコール
  • [==] … 等しい
  • [!=] … 等しくない

【論理演算子】

  • [&&] … 論理積(かつ)
  • [||] … 論理和(または)

インクリメント/デクリメント】

  • [++] … +1をする
  • [–] … -1をする

インクリメント/デクリメントでは変数の前につけるか後につけるかで結果に変化が起きる。

【再帰代入演算子】

  • [+=] … 左辺に右辺を足し算したものを左辺に代入する
  • [-=] … 左辺に右辺を引き算したものを左辺に代入する
  • [*=] … 左辺に右辺を掛け算したものを左辺に代入する
  • [%=] … 左辺に右辺を割り算したものを左辺に代入する
  • [+=] … 左辺に右辺を割り算した余りを左辺に代入する

つまりどういうことか。
x=x+10としたとき左辺右辺ともにxが存在する。
結果としてはxに10を足したものをxに再度代入するわけだが、x+=10でも同じようにxに10足したものをxに再度代入する。

【三項演算子】

y = a ? x1 : x2     ・・・ aが真であればy=x1であり、aが偽であればy=x2になる
この演算子は条件演算子とも呼ばれaを評価し、それによってx1かx2をyに代入する演算子です。

上記のときaの部分はi>5という評価式になるのでi=1のことから評価は偽となる。
偽と評価されたので:の右側にある++iがiに代入され、2が出力される。

条件分岐(1)

【if文】

ここではif文について学んでいきましょう。
if文の書き方は以下のようになります。

if文では条件式を評価しtrueだった場合”{“から”}”までの間に記述されたプログラムを実行します。
条件式は主に比較演算子や論理演算子を用いて記述します。
また条件式がfalseだった場合の処理を以下のようにすることで合わせて記述することができます。

ここまでは条件を1つのみで分岐を行ってきましたが、複数の条件を使い複雑な条件式を書くことができます。

このように複数の条件を使う場合、上の条件式から順番に評価を行っていきます。
条件式1がtrueの場合、条件式1がtrueのときの処理を行ってif文を終了します。
条件式1がfalseの場合、初めて条件式2が評価されます。
また、条件式1、2がfalseの場合に実行されるelse句は必要がなければ省略することが可能です。
何を言ってるのかわからない方へMarioで説明すると、

みたいな感じになります。余計わかりづらい気がしなくもないです。

条件分岐(2)

【switch文】

ここではswitch文について学んでいきましょう。switch文の書き方は以下のようになります。

式にはint、short、char、byte、enum、Stringの変数、または前述の計算結果を持つ演算式を記述することができます。
定数には文字通り定数を指定する必要があり変数の入力するとコンパイルエラーが発生します。
switch文ではまず式を評価し、評価結果と一致するcaseの処理へと移行します。
caseへ移行するとbreakが記載されている部分まで処理を行い、switch文が終了となります。
また、一致するcaseが存在しないときdefaultの処理へと移行します。
defaultは必ず書く必要はなく任意で記載を行うことができます。

*注意点*
breakは必ず記載しましょう。
上記の場合breakが記載されていないと定数1の処理が行われたとき、後述の定数2、定数3defaultの処理も行われてしまいます。
サンプルとしてマリオで説明をしましょう。

使い方的にはif文とあまり変わりませんが、switch文ではcaseが被って記述されている場合コンパイルエラーが起きるので早い段階でミスに気がつくことができます。
また、式がNULLだった場合はNullPointerExceptionが発生するので注意が必要となります。

条件分岐の使い分け

【使い分け】

さて、ここまでif文とswitch文について学びましたが、この二つの条件分岐はどのように使い分けるのでしょうか。

基本的にif文では二分岐、switch文では多分岐というように使い分けるのですが、多分岐の場合でもif文を使うことがあります。

二分岐の場合上記のようになり、if文の方が可読性がよくなります。
では多分岐の場合ではどうでしょうか。

多分岐では上記のようになりステップ数はswitch文の方が多いですが、switch文の方が可読性がよくみられます。
また、多分岐の場合switch文のほうが評価回数が少ないため処理速度が速いといわれています。
if文では範囲で評価することができるのですが、switch文では定数での一致を評価するためif文が使われることが多いようです。
例えとして出すのであれば1~3のときと4~6のときとそれ以外で処理を分けるときif文とswitch文では以下のようになります。

こんな場合にswitch文を使うのは馬鹿らしくなってしまいますね。
あくまでswitch文は条件式がNULLにならなく、定数が決まっている場合のみ 使用すると可読性もコードも良くなると考えられます。

繰り返し(1)

【for文】

ここではfor文について学んでいきましょう。
for文の書き方は以下のようになります。

for文では条件式を評価しtrueだった場合”{“から”}”までの間に記述されたプログラムを条件式がfalseになるまで実行します。
初期化式にはfor文の中でしか使わないものを記載したり、for文の外で使っていた変数の値を変化させたりすることができます。

上記は二つとも同じ処理を行いますが変数iを宣言している場所が違うため、
パターン1では外で宣言しているためfor文が終わった後も利用できるが、
パターン2では内で宣言しているためfor文の中だけで使えるローカル変数になります。

変化式には主にインクリメント、デクリメントの記載が行われますが、変化式はfor文の一番最後に行われる処理という認識で大丈夫です。
パターン2の場合初期化式で宣言されたiが0からスタートし、実行処理を行った後にi++が行われ条件式を評価します。

【拡張for文】

ここでは拡張for文について学んでいきましょう。
for文の書き方は以下のようになります。

ではどのようなときにfor文ではなく拡張for文を使うのでしょうか。
例えば以下のようなfor文を書いたとしましょう。

これは最初に宣言した配列の中身をすべて出力する処理です。
拡張for文では以下のように書き換えることができます。

拡張for文ではコレクションに指定された配列などの値をひとつずつfor文で指定した変数に代入しコレクションの最終値まで処理が終わるとfor文を抜け後続の処理を行うというものです。

大きなメリットとしては配列の要素数が増減してもfor文自体を変更する必要がないという部分になります。

また、コレクションにはListやMapも指定できることから汎用性が大きいとも言えるでしょう。
サンプルとしてマリオで説明をしましょう。

使い方的にはif文とあまり変わりませんが、 switch文ではcaseが被って記述されている場合コンパイルエラーが起きるので早い段階でミスに気がつくことができます。
また、式がNULLだった場合はNullPointerExceptionが発生するので注意が必要となります。

条件式がfalseだった場合の処理を以下のようにすることで合わせて記述することができます。

ここまでは条件を1つのみで分岐を行ってきましたが、
複数の条件を使い複雑な条件式を書くことができます。

このように複数の条件を使う場合、上の条件式から順番に評価を行っていきます。
条件式1がtrueの場合、条件式1がtrueのときの処理を行ってif文を終了します。
条件式1がfalseの場合、初めて条件式2が評価されます。
また、条件式1、2がfalseの場合に実行されるelse句は必要がなければ省略することが可能です。
何を言っているかわからない方へマリオで説明すると

みたいな感じになります。余計わかりづらい気がしなくもないです。

繰り返し(2)

【while文】

ここではwhile文について学んでいきましょう。
while文の書き方は以下のようになります。

while文では条件式を評価しtrueだった場合”{“から”}”までの間に記述されたプログラムを条件式がfalseになるまで実行します。

【do~while文】

ここではdo~while文について学んでいきましょう。
do~while文の書き方は以下のようになります。

do~while文では必ず1回は処理を行うという点がwhile文との違いになります。

1回処理を行った後、条件式の評価を行います。
trueの場合は再度実行処理を行い、falseの場合は後続処理へと移ります。
サンプルとしてマリオで説明をしましょう。

使い方的にはif文とあまり変わりませんが、switch文ではcaseが被って記述されている場合コンパイルエラーが起きるので早い段階でミスに気がつくことができます。

また、式がNULLだった場合はNullPointerExceptionが発生するので注意が必要となります。
条件式がfalseだった場合の処理を以下のようにすることで合わせて記述することができます。

ここまでは条件を1つのみで分岐を行ってきましたが、複数の条件を使い複雑な条件式を書くことができます。

このように複数の条件を使う場合、上の条件式から順番に評価を行っていきます。
条件式1がtrueの場合、条件式1がtrueのときの処理を行ってif文を終了します。
条件式1がfalseの場合、初めて条件式2が評価されます。
また、条件式1、2がfalseの場合に実行されるelse句は必要がなければ省略することが可能です。

何を言っているかわからない方へMarioで説明すると

みたいな感じになります。余計わかりづらい気がしなくもないです。

※最新の情報の取得・更新に努めておりますが、掲載内容については、その正確性、完全性、有用性、最新性等についていかなる保証もするものではありません。

タイトルとURLをコピーしました