Java

『プロになるJava―仕事で必要なプログラミングの知識がゼロから身につく最高の指南書』を執筆 | これからJavaを勉強する方にも、最新技術を体系的に学びたい方にも! #projava

きしださん杉山さん、と共著で新しい本『プロになるJava』を著しました。私にとっては『Twitter APIポケットリファレンス』、『IntelliJ IDEAハンズオン』に続いて3冊目となります。

各種書店やサムライズム(私の会社)やAmazon、楽天などでご購入いただけます。
よろしければ色々とオマケのつくサムライズムよりどうぞ

サムライズム: 書籍 – プロになるJava (500円割引きクーポン付き)

対象は
・これからプログラミング、Javaを学びたい入門者
・Javaの入門書を読んだが、次に何を進めれば良いか迷っている方
・日頃Javaを扱っているが、最新のJava 17の文法やGit/JUnit/Maven/IntelliJ IDEAといった現在では標準となりつつあるツールやSpring Bootを体系的に学びたい方
です。

対話環境で学び、実践的な環境で習得する

入門者にはJavaやIDEをインストールするところからはじめ、JShellを使いながら対話的にプログラムの動作の様子を体験しながらJavaの基本を体系的に学んでいただけます。
JShellで基本を確認したらIDEを使って補完操作を行いながら文法を習得してもらう流れになるので、「コマンドプロンプトやオンラインの簡易環境で学んだが実践的な開発環境を扱えない」ということにはなりません。

文法のその先も学ぶ

「Javaの文法はなんとなく理解したが、書籍のサンプルコードを超えたプログラムを書くことが出来ない」という入門者がよくいらっしゃいます。文法を習得することと、プログラムの組み方を理解することは別だからです。この本では、繰り返しや状態の管理を用いて、いかに実際のプログラム/システム開発で必要な構造/アルゴリズムを実装していくかという考え方も学び、『プロになる』上で不安のないプログラミングスキルを習得することができます。

ツールを学ぶ

実際のアプリケーション開発現場ではjavac/javaやIDEを使ってプログラムをコンパイル、実行出来るだけでは足りません。プログラムのバージョン管理を行い、ライブラリの依存関係を定義し、仕様の読み書きを行い、自動テストを行い、IDEの補完機能を使いこなして少ないタイプ数で間違い無くこコードを書く、といったスキルが必要となります。

この本ではモダンな開発現場で広く採用されているGit、Maven、Javadoc、JUnit、IntelliJ IDEAについて説明しています。どのツールもそれぞれ一冊の本が出来てしまうような代物ですが、「まず使いこなせるようになる」上で個別の書籍は少々重たいのではないかと思いますが、「必要十分に」使いこなしていただけるように重要なエッセンスをまとめています。この本を眺めるだけでなく、実際にこれらのツールを書籍を見ながら動かして、実践して貰えれば幸いです。

Webアプリケーション開発を学ぶ

Javaを書けるようになったら、次のステップとしてWebアプリケーション開発を学びたいところです。書店にはいにしえの技術であり、現在では新規採用されることはないサーブレット/JSPの書籍が数多くあります。また現在広く使われているSpring Bootの書籍は、書籍内で説明されていない前提となる知識が多く、「Java入門者が次に読む本」としては難しいものが多いです。

この本のSpring Bootの部では、前提となる知識は同じ本の中にすべて書いてあります。「フォールトトレラントでクラウドネイティブでマイクロサービスなカッコイイSpring Bootアプリケーション開発」は別の本に任せるとして、「データベースと連携するSpring Bootアプリケーションを一通り構築できるようになる」という必要十分な知識を体系的に身につけることが出来ます。

また、ネットワークプログラミングを通じて簡単なWebサーバを作るパートもあります。「Webとは、HTTPとは何なのか」/「世の中のWebアプリケーションがどのようにして動いているのか」を把握した上でSpring Bootアプリケーション開発に着手することは、深い理解に繋がります。

Java 17を採用

これまで、Javaの入門書はJava 8をターゲットとしたものがほとんどでした。ラムダ式が目玉のJava 8では必要十分で、広く使われているということもありますが、Java 8はすでにリリースから8年も経過しており、いささか古さを感じずにはいられません。ちなみに長く使われたソフトウェアの代表格であるWindows XPはリリースから8年弱でサポート終了となりました(延長サポートはリリースから13年)。

すでにJava 8のシェアは37%まで落ちており、1年以内にJava 17へ移行する予定と62%のプロジェクトが回答しているという最新の調査があります。

採用しているJVM言語/バージョン


いつJava 17に移行するか

Perforce 2022 Java Developer Productivity Reportより

大きな目玉機能の無かった(または目玉のJigsawは特に嬉しくなかった)Java 11をスキップするのはわかります。しかし、数多くの嬉しい機能を含み、かつ長期サポートバージョン(LTS)であるJava 17は今後標準として良いでしょう。新しく学ぶ方も、Java 8やそれ以前で開発をしている方もこの本でJava 17の快適なプログラミングを学んで頂ければ幸いです。

最前線で活躍するJavaエンジニア達による執筆

私も含め、Javaエンジニアとして最前線で活躍する人たちによる執筆です。「ぶっちゃけそんな機能使わないよ」みたいなパートは一片もなく、実践的な内容になっているのはもちろんのこと、Java界隈の最新事情を踏まえたコラムもふんだんに入れました。
「普段・時々なんとなくJavaを扱っているだけで最新事情が良くわかららない」、という方も是非ご一読頂ければと幸いです。

挿絵がかわいい

各章の扉にあるDukeの絵は著者らで書きました(章がたくさんあり、家族にもちょっと助けて貰いました)。プロにデザインしてもらったコーヒーカップの絵も良かったのですが、我々のDukeに対する思いを込めた楽しい絵を掲載していただく運びとなりました。章の内容にもそれなりに結びつく絵になっています。何を意味しているかも想像しながら読み進めていただけると嬉しいです。

感謝・感謝・感謝

仕事を幾分おろそかにしながら、夜更かしをしながらなんとかこの本を書き上げました。会社の皆様にも家族にも、そしてもちろん共著者や編集担当、組版、校正、印刷、流通に関わる方々全てに感謝です!
もちろんこれからご購入いただく皆様にも感謝!

Amazon: プロになるJava―仕事で必要なプログラミングの知識がゼロから身につく最高の指南書

目次

以下に目次を記します。コラム記事も充実していますよ!

第1部 Javaを始める準備

第1章 Java ってなんだろう

1.1 Javaとは
1.1.1 プログラミング言語とは
1.1.2 Javaはどんなプログラミング言語なの?
1.1.3 Javaで何ができるの?
1.1.4 Javaの仕様とJDKディストリビューション
1.2 Javaの情報源
コラム Java 公式キャラクター Duke

第2章 開発環境の準備と最初の一歩

2.1 Oracle JDKのインストール
2.1.1 Oracle JDKのダウンロード
2.1.2 Oracle JDKのインストール
2.2 IntelliJ IDEAのインストールと設定
2.2.1 初心者の段階からIDEを!
コラム Oracle 社はJavaを有償化した?
2.2.2 IntelliJ IDEAとは
2.2.3 IntelliJ IDEAのダウンロードとインストール
2.2.4 Toolbox Appの設定とIDEの起動
コラム IntelliJ IDEAのエディション
2.2.5 IntelliJ IDEAの初期設定
2.3 最初のプログラムを書いてみよう
2.3.1 プロジェクトの作成
2.3.2 IntelliJ IDEAの初期画面
2.3.3 クラスの作成
2.3.4 mainメソッドの実装
コラム 近年のJava IDE 事情

第2部 Javaの基本

第3章 値と計算

3.1 JShellの起動
3.1.1 ターミナルの起動
3.1.2 JShellの起動
3.1.3 JShellの終了
3.2 値と演算
3.2.1 整数
3.2.2 構文エラー
3.2.3 実数
3.2.4 文字列
3.2.5 例外
3.2.6 プログラムがうまく動かない3 段階
3.3 メソッドの呼び出し
3.3.1 メソッドの呼び出し
3.3.2 文字列の掛け算や引き算?
3.3.3 メソッドのシグネチャ
3.3.4 メソッドの使い方がわからないとき
3.3.5 文字列のフォーマット
3.3.6 formattedメソッドでの例外

第4章 変数と型

4.1 変数
4.1.1 複合代入演算子
4.1.2 値に名前を付けるメリット
4.2 型
4.2.1 変数の型
4.2.2 基本型と参照型
4.2.3 変数の型を指定する
4.2.4 文字を扱う型
4.2.5 数値の型変換
4.2.6 型の役割

第5章 標準API

5.1 日付時刻
5.1.1 APIとライブラリ
5.1.2 現在日時を取得する
5.1.3 パッケージとimport
5.1.4 日付時刻の操作
5.1.5 指定した日付時刻を扱う
5.1.6 日付時刻の整形
5.1.7 staticメソッドとインスタンスメソッド
5.2 BigDecimal
5.2.1 実数計算の誤差
5.2.2 BigDecimalでの計算
5.2.3 newによるBigDecimalオブジェクトの生成
5.2.4 BigDecimalオブジェクト生成時の注意
5.2.5 オブジェクトの生成の仕方の違い

第6章 SwingによるGUI

6.1 Swingでのウィンドウ表示
6.1.1 Swing
6.1.2 ウィンドウを表示してみる
6.1.3 入力領域の配置
6.1.4 2つ目の入力領域
6.1.5 ボタンを配置
6.1.6 クラスとオブジェクト,インスタンス
6.1.7 参照を扱う
6.2 画面に絵を描いてみる
6.2.1 ウィンドウの準備
6.2.2 画像の準備
6.2.3 図形の描画
6.3 Javaの基本文法
6.3.1 Javaの文法
6.3.2 入力エラーの対処
6.3.3 IntelliJ IDEAを使わずに実行する

第3部 Javaの文法

第7章 条件分岐

7.1 論理型
7.1.1 値の比較
7.1.2 オブジェクトの大小比較
7.1.3 オブジェクトが等しいかどうかの比較
7.1.4 論理演算子
7.1.5 条件演算子
7.2 if 文による条件分岐
7.2.1 if 文
7.2.2 else 句
7.2.3 else if
7.3 switchによる条件分岐
7.3.1 switch 文
7.3.2 default 句
7.3.3 switch 式
7.3.4 古い形式のswitch

第8章 データ構造

8.1 Listで値をまとめる
8.1.1 List
8.1.2 変更のできるList
8.1.3 ジェネリクスによる型検査
8.1.4 ジェネリクスの型推論
8.1.5 ラッパークラス
8.2 配列
8.2.1 配列の初期化
8.2.2 要素を設定した配列の初期化…
8.2.3 配列の要素の利用
8.2.4 多次元配列
8.3 レコードで違う種類の値を組み合わせる…
8.3.1 違う種類の値をListでまとめて扱う
8.3.2 違う種類の値をまとめて扱うレコードを定義する
8.3.3 レコードのオブジェクトを生成する
8.4 Mapで辞書を作る
8.4.1 Map
8.4.2 変更可能なMap
8.4.3 イミュータブル(不変)なオブジェクト

第9章 繰り返し

9.1 ループ構文
9.1.1 for 文の基本
9.1.2 for 文の応用
9.1.3 while 文
9.1.4 do while 文
9.1.5 ループのcontinueとbreak
9.2 ループに慣れる
9.2.1 デバッガーでループを覗く
9.2.2 二重ループ
コラム i,jの次は?
9.2.3 もう少しループの練習
9.2.4 迷路ゲームを作る

第10章 データ構造の処理

10.1 データ構造を拡張for 文で扱う
10.1.1 基本for 文でのListの要素の処理
10.1.2 拡張for 文によるListの要素の処理
10.1.3 拡張for 文による配列の要素の処理
10.1.4 値の集合の処理のパターン
10.2 Stream
10.2.1 IntelliJ IDEAによるStreamへの変換
10.2.2 Streamの構成
10.2.3 ラムダ式
10.2.4 Streamソース
10.2.5 終端処理
10.2.6 中間処理
10.2.7 Optional
10.3 基本型のStream 処理
10.3.1 IntStreamで整数の処理
10.3.2 StreamとIntStreamの行き来

第11章 メソッド

11.1 メソッドの宣言
11.1.1 JShellでのメソッド宣言
11.1.2 staticメソッドの宣言
11.1.3 インスタンスメソッドの宣言
11.1.4 IntelliJ IDEAにメソッドを宣言してもらう
11.2 ラムダ式とメソッド参照
11.2.1 ラムダ式
11.2.2 メソッド参照
11.2.3 IntelliJ IDEAでラムダ式とメソッド参照の変換
11.3 メソッドの使いこなし
11.3.1 メソッドのオーバーロード
11.3.2 メソッド呼び出しの組み合わせ
11.3.3 再帰とスタック
コラム うまく名前を付けるのも実力のうち

第4部 高度なプログラミング

第12章 入出力と例外

12.1 ファイルアクセスと例外
12.1.1 ファイル書き込み
12.1.2 ファイル読み込み
12.1.3 例外
12.1.4 throwsで例外を押しつける
12.1.5 try 句で例外に対処する
12.1.6 検査例外と非検査例外
12.1.7 例外を投げる
12.2 ネットワークでコンピュータの外の世界と関わる
12.2.1 サーバーとクライアント
12.2.2 ソケット通信とTCP/IP
12.2.3 OutputStreamでのデータ送信
12.2.4 InputStreamでのデータ受信
12.2.5 try-with-resources
12.3 Webの裏側を見てみる
12.3.1 HTTP
12.3.2 HTTPクライアント
12.3.3 HTTPSで安全なWebアクセス
12.3.4 Webクライアントライブラリ
12.3.5 Webサーバーを作る

第13章 処理の難しさの段階

13.1 ループの難しさの段階
13.1.1 他のデータを参照するループ
13.1.2 隠れた状態を扱うループ
13.2 状態遷移と正規表現
13.2.1 状態遷移の管理とenum
13.2.2 正規表現
13.3 スタックとキュー
13.3.1 スタックとキュー
13.3.2 ツリーの探索
13.3.3 メソッドの再帰呼び出しをスタックを使った処理に置き換える
13.3.4 幅優先探索とキュー
13.3.5 計算の複雑さの階層

第14章 クラスとインタフェース

14.1 クラス
14.1.1 クラスのメンバー
14.1.2 アクセス制御(可視性)
14.1.3 コンストラクタ
14.1.4 this
14.1.5 フィールド
14.1.6 ネステッドクラスとインナークラス
14.2 インタフェース
14.2.1 インタフェースが欲しい状況
14.2.2 インタフェースを使ってメソッドを統一的に扱う
14.2.3 必要なメソッドを実装していないときのエラー
14.2.4 実装を持ったメソッドをインタフェースに定義する
14.2.5 インタフェースにおけるアクセス制御
14.2.6 公称型と構造的部分型
14.3 ラムダ式と関数型インタフェース
14.3.1 関数型インタフェース
14.3.2 標準APIで用意されている関数型インタフェース
14.4 クラスとファイル
14.4.1 ソースファイル
14.4.2 classファイル
14.4.3 コメント
14.4.4 コマンドラインパラメータ

第15章 継承

15.1 継承
15.1.1 クラスの継承
15.1.2 継承でのコンストラクタ
15.1.3 Objectクラス
15.1.4 メソッドのオーバーライド
15.1.5 匿名クラス
15.2 継承の活用
15.2.1 差分プログラミング
15.2.2 継承でデータを分類する
15.2.3 継承とオブジェクト指向

第5部 ツールと開発技法

第16章 ビルドツールとMaven

16.1 ビルドツールの必要性
16.2 Mavenの基本
コラム Maven 以外のJavaビルドツール
16.3 Mavenのモジュールとディレクトリ構成
16.3.1 groupIdとartifactId
16.3.2 Mavenプロジェクトのディレクトリ構成
16.4 ライブラリとMaven Repository
16.4.1 ライブラリへの依存
16.4.2 Maven Central Repository
16.4.3 Mavenプロジェクトへライブラリを追加する
16.4.4 依存のscope
16.4.5 pom.xmlへの依存の記述
16.4.6 pom.xml 記述内容のプロジェクトへの反映
16.4.7 Maven Central Repository のインデックス作成
16.4.8 ライブラリの確認
16.4.9 businessCalendar4Jの動作確認
16.4.10 目的に合ったライブラリを見つける
16.5 MavenのGoal

第17章 Javadocとドキュメンテーション

17.1 Javadocとは
17.2 ブラウザでJavadocを見る
17.2.1 標準APIのJavadoc
17.2.2 Javadocの読み方
17.2.3 英語版のJavadoc
17.3 IDEからJavadocを見る
17.4 Javadocを書く
17.5 JavadocのHTMLを生成する

第18章 JUnitとテストの自動化

18.1 テストの自動化とは
18.1.1 JUnitのセットアップと実行
18.1.2 テストケースの実装,実装コードの修正
18.1.3 その他のアサーションメソッド
18.2 テスト自動化のヒント
18.2.1 効果的にテストケースを書く
18.2.2 テスト駆動開発
18.2.3 GUIアプリケーションやWebアプリケーションのテスト
コラム 時間がないからテストは書かない?
18.3 オリンピック開催年を判別するコードをテスト

第19章 IntelliJ IDEAを使いこなす

19.1 補完機能を使いこなす
19.1.1 補完の候補表示と補完確定
19.1.2 import 文の補完
19.2 Live Templateと後置補完

第20章 バージョン管理とGit

20.1 アンドゥやファイルコピーによる履歴管理
20.1.2 Local History
20.2 バージョン管理システム
20.2.1 Gitのインストール
20.3 Git 連携を有効にする
20.4 コミット
20.4.1 コミット対象ファイルの選択
20.4.2 コミットの実行
20.4.3 ファイル追加時の確認ダイアログ
20.4.4 変更したファイルの差分とコミット
20.4.5 Gitログの確認
20.4.6 .gitignoreファイルの作成
20.5 ブランチ
20.5.1 ブランチの作成と切り換え
20.5.2 ブランチのマージ
20.6 Git 誤操作後の復旧方法
20.6.1 Amend
20.6.2 Revert
20.6.3 コミットのReset

第6部 Webアプリケーション開発

第21章 Spring BootでWebアプリケーションを作ってみる

21.1 Webアプリケーションとフレームワーク
21.1.1 Webアプリケーションとは
21.1.2 Webアプリケーションの仕組み
21.1.3 アプリケーションフレームワークとは
21.1.4 フレームワークを利用するメリット
21.1.5 Webアプリケーション開発に使える代表的なフレームワーク
21.2 Spring Bootでタスク管理アプリケーションを作ってみる
21.2.1 タスク管理アプリケーションの概要
21.2.2 Webアプリケーション用のプロジェクトを作る
21.3 RestControllerでWebアプリケーションの仕組みを学ぶ
21.3.1 @RestControllerアノテーションでコントローラを作成する
21.3.2 クライアントからのリクエストに応えるためのエンドポイントを作る
21.3.3 helloエンドポイントにアクセスしてみる
21.3.4 タスク管理アプリケーションをコマンドラインから起動する
21.4 モデルを使ってアプリケーションの内部情報を保持する
21.4.1 タスクの情報を保持するためのモデルの作成
21.4.2 タスクを追加するエンドポイントの作成
21.4.3 タスクを一覧表示するエンドポイントの作成
21.5 ユーザーインタフェースの作成にテンプレートエンジンを活用する
21.5.1 @Controllerアノテーションでコントローラを作成する
21.5.2 テンプレートエンジン
21.5.3 Thymeleafが使えるようにpom.xmlを修正する
21.5.4 Thymeleaf 用のHTMLテンプレートを作る
21.5.5 HomeControllerのhelloメソッドを修正する
21.5.6 タスクの追加および一覧表示用のテンプレートを用意する
21.5.7 HomeControllerにタスクの一覧表示機能のエンドポイントを実装する
21.5.8 HomeControllerにタスクの追加機能のエンドポイントを実装する
21.5.9 CSSを使ってテンプレートを装飾する

第22章 Webアプリケーションにデータベースを組み込む

22.1 データベースとは
22.1.1 DBMSの種類
22.1.2 リレーショナルデータベースとは
22.1.3 リレーショナルデータベースにアクセスするための言語「SQL」
22.1.4 Javaによるデータベース接続とJDBC
22.2 SQLでH2データベースを操作する
22.2.1 H 2とは
22.2.2 pom.xmlへの依存関係の追加
22.2.3 application.propertiesへの設定の追加
22.2.4 H 2コンソールを使ったデータベース接続
22.2.5 テーブルを作成するCREATE 文
22.2.6 テーブルにレコードを追加するINSERT 文
22.2.7 テーブルに格納されたデータを取得するSELECT 文
22.2.8 すでに登録されているレコードを更新するUPDATE 文
22.2.9 テーブルに登録されているレコードを削除する
22.2.10 タスク管理アプリケーションで使用するSQL 文の例
22.3 Spring BootアプリケーションでSpring JDBCを使用する
22.3.1 Spring JDBCとは
22.3.2 pom.xmlへの依存関係の追加
22.3.3 テーブル初期化用のスクリプトを用意する
22.3.4 データベース操作用のクラスを作成する
コラム DI/DIコンテナとは
22.3.5 HomeControllerクラスを修正する
22.3.6 タスク情報の削除機能を追加する
22.3.7 タスク情報の更新機能を追加する