はじめに
1.1 AI時代に1から言語を学習する意味
最近は、生成AIに
こういうプログラムを書いて
とお願いすれば、かなり完成度の高いコードをすぐに出してくれるようになりました。
昔なら、プログラミングを始めるには本を読んで、文法を覚えて、サンプルコードを書き、エラーが出れば原因を調べる……と、かなりの時間をかけて学ぶ必要がありました。
今は、分からないことをAIに聞き、コードを書いてもらい、エラーの原因まで調べてもらうことができます。
では、そんな時代に、わざわざプログラミング言語を1から勉強する意味はあるのでしょうか。
私は、あると思っています。
例えば、AIに次のようなコードを書いてもらったとします。
try {
// 何らかの処理
} catch (Exception e) {
// エラーを無視する
}
コードだけを見れば、それらしく動きます。
しかし、
- なぜここで例外を捕まえているのか?
- この例外を無視して本当に大丈夫なのか?
- ここでエラーが発生した場合、利用者にはどう見えるのか?
と考えるには、Javaの文法だけでなく、例外処理とは何か、
プログラムはどのように動くのかという基礎的な理解が必要になります。
AIはコードを生成できます。
しかし、そのコードを採用してよいか判断することまで任せていいとは限りません。
もちろん、
- 全部自分でコードを書けるようになるまでAIを使ってはいけない
という話ではありません。
むしろ、AIは積極的に使えばいいと思います。
- 分からない文法を質問する。
- サンプルコードを作ってもらう。
- エラーの原因を調べてもらう。
- 自分が書いたコードをレビューしてもらう。
こうした使い方は、プログラミング学習を大きく効率化してくれます。
重要なのは、コードを正しく書けるかではなく、
何を正解とするのかを決められるかだと思っています。
例えば、AIに次のような依頼をしたとします。
CSVから売上データを読み込み、合計金額を計算するプログラムを作ってください
AIはコードを書き、テストコードまで作ってくれるでしょう。
しかし、そのテストが確認しているのは、あくまでAIが想定した仕様の中で正しく動くかです。
実際には、例として以下のような問題があります。
- キャンセルされた注文は売上に含めるのか
- 税込み金額と税抜き金額のどちらを集計するのか
- 空欄や不正なデータがあった場合はどうするのか
- 同じ注文が重複していた場合はどうするのか
これは「Javaのコードを正しく書けるか」という問題ではありません。
そもそも、プログラムに何をさせるべきなのかという問題です。
AIは、与えられた条件からコードを作ることはできます。
しかし、その条件自体が間違っていたら、どれだけきれいなコードを書いて、どれだけ大量のテストを通しても、正しいプログラムにはなりません。
だからこそ、プログラミングを学ぶ意味は「AIより速くコードを書くこと」ではないと思います。
- プログラムがどのように動くのか。
- データがどのように扱われるのか。
- エラーが起きると何が問題になるのか。
- クラスやオブジェクトは何のためにあるのか。
こうした仕組みを理解していることで、AIに何を依頼すべきか、AIの提案をどう評価すべきか、そして問題が起きた時にどこを疑うべきかを考えられるようになります。
Javaでは、変数やデータ型といった基本的な考え方から、
- クラスとオブジェクト
- 継承
- ポリモーフィズム
- 抽象クラス
- インターフェース
- 例外処理
- コレクション
- Stream API
など、プログラミングの基本からオブジェクト指向まで、比較的体系的に学ぶことができます。
2.1 プログラムとは何か
そもそも「プログラム」とは何でしょうか。
簡単に言えば、コンピュータに「何をするのか」を指示するための命令の集まりです。
例えば、
画面にHello, World!と表示する
という処理もプログラムです。
人間であれば、
画面にHello, World!と表示して
と言われれば意味を理解できます。
しかし、コンピュータは人間の言葉をそのまま理解して動いているわけではありません。
コンピュータが理解できる形に命令を変換し、その命令に従って処理を実行します。
プログラミングとは、そのための命令をコンピュータが実行できる形で記述していくことです。
2.2 コンピュータはどうやって命令を実行するのか
コンピュータの内部では、最終的にはCPUが命令を読み取り、計算やデータの読み書きなどを行っています。
CPUが直接扱っているのは、非常に単純な機械語と呼ばれる命令です。
しかし、人間がいきなり機械語を書いてプログラムを作るのは大変です。
そこで、プログラミング言語を使って人間が理解しやすい形でプログラムを書き、コンピュータが実行できる形式へ変換する仕組みが使われています。
人間が理解しやすいプログラミング
↓
コンパイル
↓
コンピュータが実行できる形式
↓
CPUがプログラム実行
Javaも、この仕組みを利用するプログラミング言語の一つです。
2.3 ソースコードとは何か
私たちがJavaで書くプログラムは、まず「ソースコード」という形で保存します。
例えば、次のようなコードです。
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
このように、人間が読んで理解できる形で書かれたプログラムがソースコードです。
Javaの場合、通常は .java という拡張子のファイルに保存します。
今回の例なら、
Main.java
というファイルになります。
2.4 Javaではどのように実行されるのか
では、この Main.java をそのままコンピュータが実行できるのでしょうか。
Javaでは、基本的にソースコードを一度「コンパイル」します。
コンパイルとは、Javaのソースコードを、JVM(Java仮想マシン)が実行できる形式に変換する処理です。
Main.java
↓
コンパイル
↓
Main.class
コンパイルによって作られる .class ファイルには、バイトコードと呼ばれる命令が含まれています。
そして、このバイトコードを読み込んでプログラムを実行するのが
Java仮想マシン(JVM)です。
Javaソースコード
↓
javac
↓
バイトコード
↓
JVM
↓
実行
Javaでは、このようにJVMを介してプログラムを実行します。
2.5 Javaがさまざまな環境で動く理由
JVMは、Windows、macOS、Linuxなど、それぞれの環境向けに用意されています。
そのため、Javaでは、
一度コンパイルしたJavaのプログラムを、JVMが動作するさまざまな環境で実行できる
という特徴があります。
Javaの有名な考え方である、
Write Once, Run Anywhere
一度書けばどこでも動く
というJavaの有名な考え方も、こうした仕組みに関係しています。
2.6 実際にJavaをインストールしてみる
ここからは実際にJavaをインストールして、プログラムを動かしてみます。
今回は、Javaの開発に必要な JDK(Java Development Kit) をインストールします。
JDKには、Javaのプログラムをコンパイルするための javac や、プログラムを実行するための java など、Java開発に必要なツールが含まれています。
2.6.1 JDKをダウンロードする
Javaのプログラムを書くためには、まずJDK(Java Development Kit)が必要です。
JDKには、いくつかの提供元があります。
今回は、Javaの公式実装を提供しているOracle JDKを使用します。
まず、Oracleの公式サイトからJDKをダウンロードします。
今回はWindows 64bit環境を前提に、JDK 26を使用します。
Windowsのダウンロード一覧から、
x64インストーラー(.exe)
をダウンロードしてください。
以下のような項目です。
x64インストーラー
jdk-26_windows-x64_bin.exe
ダウンロードしたインストーラーをダブルクリックし、画面の指示に従ってインストールします。
基本的には、設定を変更せず、そのまま進めて問題ありません。
インストールが完了したら、JDKの準備は完了です。
2.6.2 Javaがインストールされたか確認する
インストールが完了したら、Windowsのスタートメニューから
「コマンドプロンプト(cmd)」を起動します。
次のコマンドを実行します。
java -version
Javaのバージョンが表示されれば、Javaのインストールは完了しています。
続けて、Javaコンパイラも確認します。
javac -version
こちらもバージョンが表示されればOKです。
例えば、
java version "26.0.2"
javac 26.0.2
のように表示されればOKです。
2.6.3 VS Codeをインストールする
次に、Javaのコードを書くためのエディタとしてVisual Studio Codeを使用します。
Visual Studio Code 配布サイト
https://forest.watch.impress.co.jp/library/software/vscode/
Windows版をダウンロードして、インストールしてください。
または、コマンドプロンプトから以下のコマンド
winget install -q vscode --scope machine
2.6.4 Javaの拡張機能をインストールする
VS Codeには、Java開発をサポートする拡張機能があります。
左側の「拡張機能」アイコンをクリックし、検索欄に、
Extension Pack for Java
と入力します。
Microsoftが提供している「Extension Pack for Java」をインストールしてください。
これをインストールすると、
- Javaのコード補完
- エラー表示
- デバッグ
- テスト
- Javaプログラムの実行
などをVS Code上で簡単に行えるようになります。
2.7 最初のJavaプログラムを書いてみる
Javaが使えるようになったので、実際にプログラムを書いてみましょう。
まず、適当な場所に作業用のフォルダを作ります。
例えば、
java-practice
というフォルダを作ります。
その中に、
Main.java
というファイルを作成してください。
ファイルの中に、次のコードを書きます。
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
コードを入力したら、VS Codeの自動整形機能を使ってインデントを整えてみましょう。
Windowsの場合は、
Shift + Alt + F
を押します。
すると、コードが自動的に整形されます
このように、VS Codeにはコードのインデントや書式を自動的に整えてくれる機能があります。
最後に Ctrl + S で保存してください。
2.8 Javaプログラムを実行する
それでは、先ほど作成したJavaプログラムを実行してみましょう。
今回はVS Codeを使って、できるだけ簡単に実行します。
Main.javaを開くと、mainメソッドの上に、
Run | Debug
という表示があるはずです。
今回は 「Run」 をクリックしてください。
すると、VS Codeの下側にあるターミナルに、
Hello, World!
2.9 VS Codeでは何が起きているのか
今回はVS Codeの「Run」をクリックするだけで、Javaプログラムを実行できました。
しかし、Javaのプログラムが直接実行されているわけではありません。
VS Codeは、先ほどインストールしたJDKを利用して、Javaのコンパイルや実行を行っています。
つまり、裏側では、
┌───────────────┐
│ Main.java │
│ ソースコード │
└──────┬────────┘
│
│ コンパイル(javac)
▼
┌───────────────┐
│ Main.class │
│ バイトコード │
└──────┬────────┘
│
│ JVM(java)
▼
┌───────────────┐
│ JVM │
│ Java仮想マシン │
└──────┬────────┘
│
▼
プログラム実行
Javaの開発を便利にしてくれる開発環境により、
VS Codeの「Run」をクリックするだけで、この処理を簡単に実行できます。
3. 変数とデータ型
- 変数とは
-
int/long/double/boolean/String - 型がある意味
- 型変換
作成中
上記のような感じで再度まとめる予定です
4. 関数とメソッド
- メソッドとは
- 引数と戻り値
- 処理を分割する意味
-
staticメソッド
作成中
5. クラスとオブジェクト
- クラスとは
- オブジェクトとは
- フィールドとメソッド
- コンストラクタ
- 「設計図」と「実体」だけで終わらせない
作成中
6. 継承
- 継承とは
extends- 「共通部分をまとめる」という考え方
作成中
7. オーバーライドとポリモーフィズム
- オーバーライド
- 親クラス型で子クラスを扱う
- ポリモーフィズムとは何か
- オブジェクト指向の重要ポイント
作成中
8. 抽象クラス
- 抽象クラスとは
abstract- 継承との関係
- どんなときに使うのか
作成中
9. インターフェース
- インターフェースとは
implements- 抽象クラスとの違い
- 「何ができるか」を定義する
作成中
10. 例外処理
- エラーと例外
try-catchfinallythrows- 例外を「握りつぶす」ことの危険性
作成中
11. コレクション
- 配列との違い
ListSetMap- どれを使えばいいのか
作成中
12. Stream API
- Streamとは
filtermapforEachcollect- 従来のfor文との比較
作成中
13. ファイル操作
- ファイルの読み書き
PathFiles- try-with-resources
- 実際にファイルを読み書きする
作成中
14. 日時処理
LocalDateLocalDateTimeDuration- 日付の計算
- 古い
Dateとの違い
作成中
15. キュー構造
- キューとは
- FIFO
QueueDeque- 実際のプログラムでどう使うのか
作成中
16. ガベージコレクション
- メモリとは
- オブジェクトとメモリ
- ガベージコレクションとは
-
newしたものはいつ消えるのか - Javaがメモリ管理を自動化している意味
作成中
17. final
-
final変数 -
finalメソッド -
finalクラス - 「変更できない」とはどういうことか
作成中
18. ロギング
-
System.out.printlnだけではなぜダメなのか - ログとは何か
- ログレベル
- Javaでのロギング
- 実際の開発ではどう使うのか
作成中