if-else 文
このレッスンで分かること
if-elseは「trueのとき /falseのときの どちらか必ず一方 を実行する」二者択一の構文です- 偶数判定の定石は
n % 2 == 0、奇数をn % 2 == 1で書くと負数で誤判定- 最小例は
if (n % 2 == 0) return "even"; else return "odd";
if-else 文 とは
if-else でどちらかの処理を必ず実行する書き方を学び、偶数・奇数を判定するメソッドを書けるようになろう。
if-else 文とは
前のレッスンで学んだ if 文は「条件が true のときだけ何かをする」というシンプルな仕組みでした。でも実際のプログラムでは「条件が成り立つときは A、成り立たないときは B」という 二者択一 の判断がもっと頻繁に登場します。たとえば「ログインしていれば名前を表示、していなければ ゲスト と表示」「点数が 60 以上なら合格、未満なら不合格」のように、どちらかを必ず実行する ケースですね。
このときに登場するのが if-else 文です。Java だけでなく Python JavaScript C Ruby など、ほぼすべての言語に同じ顔ぶれで存在する基本中の基本構文です。
if単体は「条件がtrueのときだけ実行する」、if-elseは「trueのとき /falseのときの どちらか必ず一方 を実行する」 という違いを最初にしっかり覚えておきましょう。この差を曖昧にすると、後でバグの原因になります。
基本の文法
if-else 文の文法は次のとおりです。
Java
if (条件式) {
// 条件式が true のときに実行される
} else {
// 条件式が false のときに実行される
}ポイントになる部分を箇条書きで整理しておきます。
ifの 後ろに丸カッコ()を書き、その中にbooleanを返す条件式を入れる{ ... }のブロックに、その分岐で実行する文を並べるelseの後ろには 条件式は書かない (丸カッコは付けない)elseのブロックは省略してもよいが、書いた場合は必ず 直前のifブロックの直後 に置く
else の前後で改行するスタイル (} の次の行に else {) と、} else { と同じ行に書くスタイルがあります。Java の標準的なコーディング規約 (Oracle 公式や Google Java Style Guide) では } else { と同じ行に並べる スタイルが推奨されているので、本コースでもそれに合わせます。
偶数・奇数を判定する
このレッスンの課題は「整数 n が偶数なら "even"、奇数なら "odd" を返す」というものです。偶数か奇数かはどうやって判定するかというと、Java の 剰余演算子 % を使います。
% は「割り算の余り」を返す演算子です。たとえば 10 % 3 は 1、14 % 5 は 4 です。これを 2 で割った余りで考えると、次のような性質があります。
- 偶数を
2で割った余りは必ず0 - 奇数を
2で割った余りは必ず1か-1(負の奇数は-1になる)
n | n % 2 | 判定 |
|---|---|---|
4 | 0 | even |
7 | 1 | odd |
0 | 0 | even |
-3 | -1 | odd (n % 2 == 1 だと誤判定) |
-4 | 0 | even |
だから「偶数か?」を判定したいときは n % 2 == 0 という式を書くのが定石です。true なら偶数、false なら奇数、というシンプルなルールに落とせます。
「奇数なら
n % 2 == 1」と書くこともできますが、負の奇数 (-3-7など) では余りが-1になるので、Javaだと意図せず弾かれます。偶数判定n % 2 == 0を基準にして、else側で奇数を返すのが最も安全です。
コードに落とすと次のような形になります。
Java
public class Solution {
public static String evenOrOdd(int n) {
if (n % 2 == 0) {
return "even";
} else {
return "odd";
}
}
}n に 4 が入ってきたら 4 % 2 は 0 なので if ブロックが実行され "even" が返ります。n に 7 が入ってきたら 7 % 2 は 1 なので else ブロックに進み "odd" が返ります。n が 0 のときも 0 % 2 は 0 なので "even"、n が -3 なら -3 % 2 は -1 なので else 側に行き "odd" が返ります。
分岐の流れを図で見る
if-else の動きを図にすると、必ず 2 本の道のうち 1 本だけ が選ばれて合流するイメージになります。if 単体が「分かれ道があってもどちらか一方は何もしない」のに対し、if-else は「どちらの道を通っても必ず合流点に戻ってくる」のが特徴です。
この図のように、Cond のひし形から出る矢印は必ず true と false の 2 本 で、どちらか一方を必ず通って End にたどり着きます。これが if-else の最大の特徴です。逆に言うと、if-else を使ったら「どちらの場合も処理を書き忘れていないか」を必ずチェックする習慣をつけてください。
プログラムのバグの多くは「
else側の考慮漏れ」から生まれます。「trueのときは OK、で、falseのときは?」と毎回自問するクセをつけましょう。これだけでバグの量がぐっと減ります。
else 単体は使えない
Java (というか if-else を持つほぼすべての言語) で 絶対に守らないといけないルール が、else は単体で書けないということです。else は必ず 直前に if がある 状態でしか使えません。
Java
// これはコンパイルエラー
else {
System.out.println("hello");
}このコードを書くと Java のコンパイラは 'else' without 'if' のようなエラーメッセージを出します。else 単体だと「何の条件に対する裏側なのか」がわからないので、文法的に許されないのです。
同じ理由で、if と else の間に 別の文を挟むこともできません。
Java
// これもコンパイルエラー
if (n % 2 == 0) {
return "even";
}
System.out.println("check"); // ← ここに割り込ませると else が孤立する
else {
return "odd";
}if ブロックの閉じ } の 直後 に else を書く、というのが鉄則です。
よくある間違い
if-else で初学者がよくやらかすミスを 3 つ紹介します。これは本当によく見るパターンなので、自分のコードでも疑ってみてください。
elseの前にセミコロン;を入れる —if (n % 2 == 0) { ... };のように}の後ろに;を書いてしまうと、その時点で文が終わってしまい、続くelseが孤立してエラーになります。} else {の前に余計な;を入れない、これが鉄則ですelseに条件を書いてしまう (else if との混同) —else (n > 0) { ... }のように、elseの後ろに丸カッコで条件を書こうとする間違いです。条件付きの else を書きたいときはelse if (n > 0) { ... }のようにelse ifと書きます。else単体は条件を取らない、と覚えてください%と==の優先順位の勘違い —n % 2 == 0という式は%のほうが==より先に計算される ので、内部的には(n % 2) == 0と評価されます。心配ならカッコを付けて(n % 2) == 0と書いてもまったく問題ありません。むしろ可読性が上がるので、慣れないうちはカッコを付けるのもおすすめです
もう一つ、== と = の取り違えは前のレッスンでも触れた通り if の条件式でも頻発します。if (n % 2 = 0) と書くと、Java は 代入演算子 として解釈しようとしてコンパイルエラーになります。条件式の中では必ず == を使う、と毎回意識してください。
エラーメッセージで
'else' without 'if'incompatible types: int cannot be converted to booleanのような英文が出てきたら、今紹介した 3 つのどれかを疑うと 8 割方当たります。
Before / After で書き比べる
if-else を使わずに同じ処理を if 単体で書こうとすると、どうしても return を 2 回書く か 変数で受ける かの工夫が必要になります。
Java
// Before: if 単体だけで書く
public static String evenOrOdd(int n) {
String result = "odd";
if (n % 2 == 0) {
result = "even";
}
return result;
}動きは同じですが、result という一時変数が必要で、初期値に頼っている ぶん読み手は「もし if が成り立たなかったら?」を頭の中で追わないといけません。
Java
// After: if-else でスッキリ
public static String evenOrOdd(int n) {
if (n % 2 == 0) {
return "even";
} else {
return "odd";
}
}if-else を使うと どちらの分岐も明示 されるので、読み手が「true のときと false のときの両方を考えてあるな」と一目で安心できます。コードは書く時間より 読む時間のほうが圧倒的に長い ので、こういう小さな読みやすさの積み重ねが効いてきます。
ここまでの要点
if-else は二者択一、必ずどちらか 1 本を通る。偶数判定は n % 2 == 0 を基準に、奇数判定の % 2 == 1 は負数で破綻。else は単独で書けず、必ず直前に if が必要。
やってみよう
それでは右側のエディタで課題に挑戦しましょう。Solution.evenOrOdd(int n) メソッドは、n が偶数なら "even"、奇数なら "odd" を返します。
書く手順は次のとおりです。
if (n % 2 == 0) {で偶数の分岐を開く- その中で
return "even";を返す } else {で奇数の分岐を開く- その中で
return "odd";を返す - 最後の
}でメソッドの本体を閉じる
慣れてきたら、evenOrOdd(0) evenOrOdd(-3) evenOrOdd(1000001) のような値を自分で予想してから実行してみてください。0 は偶数 (0 % 2 == 0) なので "even"、-3 は奇数なので "odd"、1000001 は奇数なので "odd" ですね。
この if-else の感覚を掴むと、次のレッスンで学ぶ else if (3 つ以上の分岐) や switch 文への橋渡しがスムーズになります。条件分岐はプログラミングの中心スキルなので、丁寧に手を動かしながら身につけていきましょう。
よくある質問
Q. Java と他言語の文法はどう違いますか?
A. Java は静的型付けで、変数宣言時に型を明示します(int x = 0;)。中括弧でブロックを表し、文末にセミコロンが必要です。Python の動的型付けや JavaScript の柔軟さに慣れていると最初は窮屈ですが、コンパイル時にバグが発見できる安全性がメリットです。
Q. コードが動かないときに最初に見るべき場所は?
A. コンパイルエラーは行番号とエラー種別(cannot find symbol、incompatible types など)が表示されます。実行時例外はスタックトレースの最初の at ... が原因行です。IDE(IntelliJ / VS Code)の警告も丁寧に潰すと、半分のバグは未然に防げます。
Q. Java の習得後に学ぶべき技術は何ですか?
A. 基本構文を抑えたら java-intermediate(コレクション / ジェネリクス / Stream / 例外)に進み、Spring Boot や Web 開発に展開するのが王道です。クラウド時代は Kotlin / Scala への展開も視野に入りますが、まずは Java 標準を固めるのが効率的です。
次のレッスン
次は else if で複数分岐 で、if-else でどちらかの処理を必ず実行する書き方を学び、偶数・奇数を判定するメソッドを書けるようになろう を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- if-else の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. if-else とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- クラス名は
Solution、メソッド名はevenOrOdd、引数はint nの 1 つにすること - 戻り値の型は
Stringで、偶数なら"even"、奇数なら"odd"を返すこと - 剰余演算子
%とif-else文を使って判定すること
入出力例
test-cases.txt
evenOrOdd(4) → "even"
evenOrOdd(7) → "odd"
evenOrOdd(0) → "even"
evenOrOdd(-3) → "odd"
evenOrOdd(-8) → "even"