🖐️

defaultメソッド×配列検索×argsでハマった1問を解説

に公開

はじめに

Java Silverの問題で、 「読めば読めるはずなのに、なぜか混乱する」
そんな1問に出会いました。

interface / defaultメソッド / 配列 / args が 一気に出てくる、かなり情報量の多い問題です。

この記事では、なぜこの問題の答えが B になるのかを 1行ずつ・順番に解説します。


問題概要

public class Sample {
    public static void main(String[] args) {
        if (new C().search(
                new int[]{1, 2, 3, 7, 9},
                Integer.parseInt(args[0])
        )) {
            System.out.println("A");
        } else {
            System.out.println("B");
        }
    }
}

実行コマンド:

java Sample 5 2
public interface A {
    boolean search(int[] data, int target);
}

A は 「search というメソッドを持つ」ことだけを約束する
インターフェースです。
処理内容はまだ書きません。

interface B(defaultメソッド)

public interface B extends A {

    @Override
    default boolean search(int[] data, int target) {
        int cnt = 0;
        for (int i : data) {
            if (i == target) {
                cnt++;
            }
        }
        return cnt > 0;
    }
}

searchメソッドの意味
- 配列 data をすべて調べる
- target と同じ値が1つでもあれば true
- なければ false

return cnt > 0;

この1行が、検索結果を true / false に変換している。

public class C implements B {
}

C クラスは search を実装していませんが、
B の defaultメソッドをそのまま使えるため、問題ない。

ちなみに、extendsとimplementsの違いです。
-extends のイメージ
親の能力・性質・実装をそのまま引き継ぐ

- implements のイメージ
「この能力を持っていると約束する」だけ

mainメソッドの処理

Integer.parseInt(args[0])

コマンドライン引数

java Sample 5 2

この時に使用しているのは args[0]のみである。
searchに渡される値

search(
  new int[]{1, 2, 3, 7, 9},
  5
)

配列の中身

1, 2, 3, 7, 9

target

5

一致する値はないため、cnt は 0となる。

cnt = 0;
return cnt > 0; // false

if文の判定
今回はfalseなので

new C().search(
                new int[]{1, 2, 3, 7, 9},
                Integer.parseInt(args[0])

ここの文がfalseとなる

if (false) {
    System.out.println("A");
} else {
    System.out.println("B");
}

結果
B が表示される

この問題で問われているポイント
- interface の役割
- defaultメソッドの仕組み
- 拡張for文の読み方
- boolean の戻り値が if に与える影響
- args[0] の扱い

情報量が多いですが、
1つずつ追えば必ず理解できます。

Discussion