javaの基礎① (Java開発の流れ/コンパイル/ブロック)

Java

Javaは私にとって、とっつきにくくてわかりにくい印象がありました。
しかし、改めて基礎からしっかり理解したいと思い、本当に初歩の部分から学んでいくことにしました。
これからJavaを学ぶ皆さんの少しでも助けになれば嬉しいです!

Java開発の流れ

① ソースコードを書く(人間が読めるコード)
→ファイル名の拡張子は「.java」

② コンパイルする(Javaコンパイラがソースコードをバイトコードに変換)
→ファイル名の拡張子は「.class」

③ 実行する(JVM:Java Virtual Machineがバイトコードを読み込み、解釈しながら必要に応じてJITコンパイルしてマシンコードに変換し、CPU上で実行)

※コンパイル:コンパイラというソフトウェアを用いて、ソースコードの文法チェックも行われる。
※JVM:OSやハードウェアに依存しない実行環境を提供。
この仕組みがJavaの「Write Once, Run Anywhere(1度書けばどこでも動く)」の基盤です。
※バイトコード:JVM専用の中間言語で、バイナリ形式(1と0)で保存されます。人間には直接読めません。

Ami
Ami

JITコンパイルを経て生成されるコードが、いわゆる機械語(CPUが直接理解できるネイティブコード)です。
一方、javac を使ってコンパイルした後にできるバイトコードは機械語ではないため、この2つを混同しないよう注意が必要です。
※「機械語(ネイティブコード)」はCPUが直接理解できる命令のことです

コンパイル 2回やるってこと??

そのように思う方もいるかもしれません。
確かにJavaでは「コンパイルが2回ある」と感じることがあるけど、実際はちょっと違います。

Javaの「2回のコンパイル」っぽい部分

  1. 最初のコンパイル
    javac コンパイラがソースコード(.java)をバイトコード(.classファイル)に変換すること。この作業は開発者が行う「コンパイル」と呼ばれるもの。
  2. JVM内部のJITコンパイル
    実行時にJVMがバイトコードを「ネイティブ(マシン)コード」に変換。これは「JITコンパイラ(Just-In-Timeコンパイラ)」という仕組みで、必要な部分だけをその場でコンパイルし、高速に動かす。

つまり、、、

  • 最初のコンパイルはプログラマが行う「ソース→バイトコード」のコンパイル
  • 実行時にJVMが行う変換は「JITコンパイル」と呼ばれる別の工程

イメージ例

  • 1回目:紙の設計図(ソースコード)を工場用の仕様書(バイトコード)に翻訳する
  • 2回目:実際の機械(JVM)がその仕様書を見て、動かすための操作指示(マシンコード)に変換しながら動かす

ブロック

javaのソースコードでは度々、波カッコ「{…}」で囲われる部分が見られます。

外側のブロック:クラスのブロック(クラス定義を囲む)
内側のブロック:メソッドのブロック(メソッドの処理を囲む)

上記の二重構造を持っていることが多く、命令する内容を書くのは、これらのブロックの中です。

何度もソースコードを書いていると慣れてきますが、ブロックを開いたときは、必ず閉じることを癖づけるとカッコ忘れでエラーになることを減らすことができると思います!

コラム ~ public class クラス名 の意味 ~

Javaでクラスを定義するとき、よくこのように書きます。

public class Test {
    // クラスの中身
}

ここには3つの情報が含まれています。

public
「このクラスはどこからでもアクセスできます」という意味の修飾子です。
アクセス修飾子には以下の種類があります。

修飾子アクセス範囲
publicどこからでもアクセス可能
(なし:デフォルト)同じパッケージ内からのみアクセス可能
protected同じパッケージ内と、異なるパッケージのサブクラスからアクセス可能
private同じクラス内からのみアクセス可能

class
「これからクラスを定義しますよ」というJavaのキーワードです。
クラスは、変数やメソッドなどをひとまとめにした設計図のようなもの。

クラス名
クラスの名前です。publicが付いている場合は、ソースファイル名と完全に一致させる必要があります(大文字・小文字も区別します)。
例:ファイル名が Test.java → クラス名は Test

  • クラス名は慣習として大文字で始めるのがJavaのコーディング規約(Java Naming Conventions)で推奨されています。
  • publicは最も開放的なアクセス修飾子ですが、必要以上に公開すると設計上のリスクがあります。

修飾子

  • static
    クラスに属するメンバーを表します。インスタンス(オブジェクト)を作らなくても使える。
  • final
    変更不可を意味します。変数なら再代入禁止、メソッドならオーバーライド禁止、クラスなら継承禁止。
  • abstract
    抽象クラスや抽象メソッドを宣言するために使う。具体的な実装はサブクラスに任せる。
  • synchronized
    マルチスレッド環境での排他制御を行う。
  • volatile
    変数の値が複数スレッド間で正しく共有されることを保証する。

識別子

プログラミングで変数や関数(メソッド)、クラスなどの名前を指します。
要するに「プログラム内で特定のものを区別するための名前」のこと。

< 識別子の特徴・ルール(Javaの場合)>

  • 英数字(A〜Z、a〜z、0〜9)とアンダースコア(_)、ドル記号($)が使える
  • ただし、数字で始めることはできない(例:1countは×)
  • 大文字・小文字は区別される(countCount は別の名前)
  • Javaの予約語(classpublicifなど)は識別子として使えない
  • 基本的には意味のある名前をつける(例:ageuserNameなど)
例)
int count;        // 識別子は count
String userName;  // 識別子は userName
public class Car { // クラス名 Car も識別子
    void drive() { // メソッド名 drive も識別子
    }
}

予約語

言語仕様で特別な意味を持つため、変数名やクラス名などの識別子として使うことができない単語があります。

Java SE標準の予約語を書き出してみました!(Java 17基準、代表的なもの)
abstract, assert, boolean, break, byte,case, catch, char, class, const,continue, default, do,double, else,enum, extends, final, finally, float,for, goto, if, implements, import,instanceof,int, interface, long, native,new, package, private, protected, public,return, short, static, strictfp,super,switch, synchronized, this, throw, throws,transient, try, void, volatile, while

Ami
Ami

予約語って結構ありますよね!
全てを覚えるというよりは、出会うたびにどういう意味を持っているのか、どう使うのかを知っていくのが良いと思います!

まとめ

前提知識だけでも結構覚えることがありますよね。
用語を知らなくても、問題ない場合もありますが、何年かエンジニアにしていて、皆さんの話を理解するためにも識別子や拡張子、予約語など、言葉と意味を結びつけておくことをお勧めします!

私は、なんとなくでやってきてしまいましたが、用語がわからないことで困るシーンもあるため、これを気に覚えることにしました。
ぜひ、皆さんも一緒に覚えてみてください!

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