01_Javaとは
対象:C言語経験者 / Javaの背景・思想・仕組みを理解します
■ 1. Javaが生まれた背景
● 1990年代のプログラミング事情
C言語を学んだ今なら分かると思うが、当時は次のような問題があった。
| 問題 | 具体的に何が起きるか |
| OSごとに書き直す | Windows用・Linux用・Mac用と別々にコンパイルが必要 |
| メモリ管理ミス | free()忘れ・二重free・未初期化ポインタでクラッシュ |
| 配列の境界チェックなし | a[10](サイズ3の配列)が書けてしまい、メモリ破壊 |
Javaはこれらの問題を「仕組みで解決する」言語として1995年に登場した。
名前の由来:もともとは「Oak(オーク)」という名前だったが商標登録済みだった。
チームがよく通ったコーヒーショップで議論中、ジャワコーヒーから「Java」に決定。技術的な意味はない。
■ 2. Javaの3つの目標
Javaの設計思想の3本柱
■ 3. なぜ「どこでも動く」のか
● C言語とJavaの実行フローの違い
左:C言語はOS専用の実行ファイルを生成 / 右:JavaはJVMが差を吸収してどこでも動く
本質:JavaはOSの上ではなく「JVMの上」で動く。
JVMさえあればどのOSでも同じ.classファイルが動く。これがWORA(Write Once, Run Anywhere)。
● JDK / JRE / JVMの関係
JDK ⊃ JRE ⊃ JVM の包含関係
| 用語 | 役割 | コマンド |
| JVM | .classを読んで実行する仮想マシン | 内部で動く |
| JRE | JVM+標準ライブラリ。実行に必要なセット | — |
| JDK | JRE+開発ツール(javacなど)。開発に必要 | javac / java |
■ 4. C言語との安全性の違い
● C言語の「危険な操作」とJavaの対応
Javaはそもそも「危険な操作をできない設計」にしています
安全な代わりに少し遅い(GCが動くため)。これはトレードオフ。
Cは速いが危険。Javaは安全だが少し遅い。用途で使い分ける。
■ 5. 誤解しやすいポイント
● JavaとJavaScriptは別物
| Java | JavaScript |
| 開発元 | Sun Microsystems(現Oracle) | Netscape |
| 主な用途 | 企業システム・Android・Webバックエンド | Webページの動的処理 |
| 実行環境 | JVM | ブラウザ(またはNode.js) |
| 名前の関係 | 当時Javaが流行っていたので名前を似せただけ。技術的関係なし。 |
● 現在のJavaの用途
| 得意 | 苦手 |
大規模企業システム Webアプリ(サーバーサイド) Androidアプリ | 高速数値処理(Cより遅い) ハードウェア直接制御 |
■ 6. 試験(問1)との対応
問1 頻出ポイント
| よく問われること | 正しい答え |
| Javaプログラム実行時、最初に呼び出されるメソッド | mainメソッド(startでもrunでもない) |
| JREとは何か | Javaプログラムの実行に必要なソフトウェア |
| ソースファイルの拡張子 | .java(.jvではない) |
| プログラム内部の文字コード | Unicode |
| WORAの仕組み | あるJVMで動くプログラムは別のJVMでもそのまま動く |
| コメントの種類 | //と/* */と/** */の3種類(//だけではない) |
第67回 問1(1)〜(6)の正答確認
| 設問 | 記述 | 正誤 | 理由 |
| (1) | JREはJavaプログラムの実行に必要なソフトウェアです | 正しい | JREは実行環境 |
| (2) | ソースファイルの拡張子を".jv"にする必要があります | 誤り | 正しくは.java |
| (3) | プログラム内部の文字コードはUnicodeです | 正しい | |
| (4) | 最初に呼び出されるメソッドはstartメソッドです | 誤り | 正しくはmainメソッド |
| (5) | あるJVMで動くプログラムは別のJVMでもそのまま動く | 正しい | WORAの説明 |
| (6) | 基本データ型は整数型・浮動小数点型・文字型・論理型 | 正しい | |
■ まとめ
| キーワード | 一言で言うと |
| WORA | 1回書けばどこでも動く(目的) |
| JVM | OS差を吸収する仮想マシン(手段) |
| JRE | JVM+標準ライブラリの実行環境セット |
| JDK | JRE+開発ツール。これを入れれば開発できます |
| javac | .javaを.classに変換するコンパイラ |
| java | .classをJVMで実行するコマンド |
| GC | メモリ自動解放(free()不要) |
| main | JVMが最初に呼び出す入口 |