6.1 制御構文の概要～Java Basic編

### はじめに

#### 自己紹介

皆さん、こんにちは、Udemy講師の斉藤賢哉です。私はこれまで、25年以上に渡って企業システムの開発に携わってきました。特にアーキテクトとして、ミッションクリティカルなシステムの技術設計や、Javaフレームワーク開発などの豊富な経験を有しています。
様々なセミナーでの登壇や雑誌への技術記事寄稿の実績があり、また以下のような書籍も執筆しています。
* [「マスタリング Java EE 5」（2007年）](https://amzn.asia/d/j0txqK5)
* [「アプリケーションアーキテクチャ設計パターン」（2017年）](https://amzn.asia/d/9avaCyF)

いずれも**Java EE**（**Jakarta EE**）を中心にした企業システム開発のための書籍です。中でも [「アプリケーションアーキテクチャ設計パターン」](https://amzn.asia/d/9avaCyF)は、（Javaに限定されない）比較的普遍的なテーマを扱っており、内容的にはまだまだ陳腐化していないため、興味のある方は是非手に取っていただけると幸いです（中級者向け）。

#### Udemy講座のご紹介

この記事の内容は、私が講師を務めるUdemy講座『**Java Basic編**』の一部の範囲をカバーしたものです。『**Java Basic編**』はこちらの[**リンク**](https://www.udemy.com/course/learn-java-se-basic/?referralCode=594C958456356851C97C)から購入できます（セールス対象外のためいつも同じ価格）。また**定価の約30%OFFで購入可能なクーポン**をQiita内で定期的に発行していますので、興味のある方は、ぜひ私の他の記事をチェックしてみてください。

この講座は、以下のような皆様にお薦めします。
* Javaの言語仕様や文法を正しく理解すると同時に、現場での実践的なスキル習得を目指している方
* 新卒でIT企業に入社、またはIT部門に配属になった、新米システムエンジニアの方
* 長年IT部門で活躍されてきた中堅層の方で、学び直し（リスキル）に挑戦しようとしている方
* 今後、フリーランスエンジニアとしてのキャリアを検討している方
* 「**Chat GPT**」のエンジニアリングへの活用に興味のある方
* 「**Oracle認定Javaプログラマ**」の資格取得を目指している方
* IT企業やIT部門の教育研修部門において、新人研修やリスキルのためのオンライン教材をお探しの方

#### この記事を含むシリーズ全体像

この記事はJava SEの一部の機能・仕様を取り上げたものですが、一連のシリーズになっており、**シリーズ全体でJava SEを網羅**しています。また認定資格である「**Oracle認定Javaプログラマ**」（Silver、Gold）の範囲もカバーしています。シリーズの全体像および「Oracle認定Javaプログラマ」の範囲との対応関係については、以下を参照ください。

https://qiita.com/KenyaSaitoh/items/4711a078a851510bc4da

## 6.1 制御構文の概要

### チャプターの概要

このチャプターでは、構造化プログラミングの特徴である、順次、分岐、反復（繰り返し）という3つの構造を表すための構文について学びます。

### 6.1.1 構造化プログラミングと制御構文

#### 構造化プログラミングと制御構文

旧来からある手続き型プログラミングでは、命令のジャンプ（goto文）が許容されていたため、処理の流れや構造が把握しにくい見通しの悪いコード（俗に言う「スパゲッティコード」）に陥ってしまう可能性がありました。

【図6-1-1】スパゲッティコードのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/6fdfded6-d081-63ac-c61f-8e671cf0e5d7.png)

その後登場した構造化プログラミングでは、命令のジャンプを排除し、あらゆる処理を順次、分岐、反復という3つの制御構造で組み立てることが提唱されました。構造化プログラミングを取り入れるとプログラムの見通しが良くなり、保守性や拡張性が高まると言われています。構造化プログラミングは手続き型言語から派生したものですが、Javaのようなオブジェクト指向型言語でも、処理を組み立てるときの基本的な手法として取り込まれています。
順次、分岐、反復という3つの制御構造を、フローチャートで表します。フローチャートとは、処理や手続きの流れを、直感的に分かりやすい形で図に表現したものです。
まず順次とは、処理を記述されたとおりに上から順に実行することです。

【図6-1-2】順次
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/3a068307-1832-406c-35c7-28e388d00aa6.png)

Javaでは基本的に、処理は記述されたとおりに上から実行されます。

次に分岐とは、条件によって処理を切り替えることです。

【図6-1-3】分岐
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/f81038a4-e195-46f6-9223-ad0c656cc8a1.png)

例えばECサイトでは、一般会員とゴールド会員とでポイントの加算ロジックが異なるのであれば、会員の種別によって処理を分岐させる必要があるでしょう。Javaでは分岐は、if文やswitch文によって記述されます。

最後に反復とは、特定の条件を満たす限り処理を繰り返し行うことです。

【図6-1-4】反復
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/2bf3adf8-5605-3fc7-b764-f432c7bb1a8f.png)

例えばECサイトですべての会員にダイレクトメールを送るためには、アドレスリストから1件ずつ取り出して、「次」がなくなるまで繰り返しメール送信を行う必要があるでしょう。Javaでは反復は、for文やwhile文などによって記述されます。
なおこのように、分岐を行うためのif文やswitch文、反復を行うためのfor文やwhile文などを、制御構文と呼びます。

#### ステートメントとブロック

複数の命令文を束ねた概念を、ステートメント（構文）と呼びます。Javaのステートメントには、前述した制御構文（if文、switch文、for文、while文）や、try-catch文（チャプター19.1参照）があります。
ステートメントは`{ }`によるブロックによって構文を組み立てます。
例えばfor文の中にif文を記述したり、try-catch文の中にswitch文を記述したりと、複数のステートメントを組み合わせるケースは良くありますが、そのような場合はブロックをネストさせます。

#### ブロックスコープ

ローカル変数の有効範囲、すなわちスコープは、変数が宣言された位置から、当該ブロックの最後までになります。このような考え方を、ブロックスコープと呼びます。ステートメントはブロックによって構文を組み立てるため、ステートメントとローカル変数を組み合わせる場合、変数を宣言する位置を意識する必要があります。
以下の図は、あるメソッドの内部実装をイメージしたものです。このメソッドは、その中の処理においてif文による条件分岐や、for文によるループを行うものとします。

【図6-1-5】ブロックスコープ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/3af56865-e08e-730c-f17a-fcc65c176af0.png)

各ローカル変数のスコープは、それを宣言したブロック内で閉じられます。従って例えば図のif文で条件分岐を行い、その結果を「if文を抜けた後の処理」で参照したい場合は、ローカル変数aの位置で変数を宣言する必要があります。
また変数aとb、または変数aとcは、同じスコープに属するため名前の重複は認められませんが、変数bとcはスコープが別なので同じ名前で問題ありません。
このように特にブロックがネストする場合には、変数を宣言する位置によってスコープが決まるという点に留意する必要があります。

:::note info
ローカル変数は、宣言する位置によってスコープが決まります。
:::

### このチャプターで学んだこと

このチャプターでは、以下のことを学びました。

1. スパゲッティコードの課題や構造化プログラミングの恩恵について。
1. 3つの制御構文、順次、分岐、反復について。
1. ステートメントの概念について。
1. ローカル変数は、宣言する位置によってスコープが決まること（ブロックスコープ）。