public static void main(String[] args) の最深部!「おまけの引き出し(args)」をわかるように完全解体!

Javaのメインメソッド「public static void main(String[] args)」の構造を、黒板のコードと「args」と書かれた土管、データが入った宝箱を使ってコミカルに図解したアイキャッチ画像
  • URLをコピーしました!
今回の記事の目的

public static void main(String[] args)(String[] args)の部分の理解を深める。

ワタタク

どうも上達の研究家のワタタクです。

Javaを勉強し始めて、誰もが最初に絶対に書かされるこの呪文。

public static void main(String[] args)

「publicは公開設定、staticはメモリ常駐、voidは何も返さない、mainはスタートボタン…」とここまでは構造で理解できても、最後のカッコの中にいる String[] args だけは、「何のためにあるの?」と脳内フリーズしていませんか?

今回は、この「謎の呪文のラストパーツ」を、マトリョーシカ構造とゲームの例えを使って、小学生でも一瞬で納得できるようにパカパカと解体(デバッグ)していきます!

この記事を書いた人

クリエイティブコーダー Watataku のプロフィール写真
ワタタク(Watataku)

上達の研究家 / アーティスト

「才能」ではなく「発見」で描く。文系・36歳からの上達ハック。

  • ゼロから独学でクリエイティブコーディングに挑戦し、以下の実績を達成
    • 開始1年8ヶ月目までに公募6つに挑戦し、3つ入選(勝率50%)
      • KITTE大阪の18メートルあるAxCROSS大型スクリーン
      • 虎ノ門ヒルズステーションタワーB2F TOKYO NODE エントランスサイネージで展示
      • UN:O(東京大手町)にある会員限定のサテライトオフィスにて2作品常設展示
  • 開始1年9ヶ月目に、虎ノ門ヒルズ49階、地上250mのインフィニティプールへ作品提供・展示
  • 実際の展示作品と動画、音楽やSEOでの実績はポートフォリオに載せております→https://my-portfolio-blue-three-63.vercel.app/works
目次

パーツをバラバラに解体してみよう

まずは、String[] args という文字列を2つのパーツに分解します。

String[] (文字列の配列)

「文字(String)」がいくつか入る「複数個の引き出し(配列 [])」という意味です。

args (アーグス)

引数(ひきすう)を意味する「arguments」の略称で、ただの引き出しの名前(変数名)です。

ぶっちゃけ名前は args じゃなくて takuya でも動きますが、世界共通の規格(慣習)としてこの名前が使われています。

つまり、スタートボタン(main)のすぐ横に、「文字データをいくつかまとめて受け取れる、空っぽの専用ポケット」が最初から用意されている状態です。

argsは「最初のワープ土管」

「ポケットがあるのは分かったけど、何に使うの?」

結論から言うと、これは「プログラムを起動するその瞬間に、外の世界から『このモードで始めて!』という秘密のメッセージを中に流し込むための窓口」です。

マリオのゲームプログラムで例えてみましょう。 もし、スタートボタンにこのポケット(args)がついていないと、ゲームを起動したときは毎回絶対に「普通のステージ1」から始まります。外から変更はできません。

しかし、args というポケットがついていると、ゲームの始まり方を外から自由にカスタムできるようになります。

ゲームを起動するその瞬間に、ポケット(args)の中に、外からこっそり「”ステージ5″」という文字を書いた紙を突っ込んで起動してみます。 すると、ゲームの脳みそ(プログラム)がポケットをのぞき込みます。

ゲームのプログラム: 「あ、起動ポケット(args)の中に『ステージ5』って紙が入ってるぞ! よーし、じゃあステージ1は飛ばして、いきなりステージ5からゲームをスタートさせよう!

これが String[] args の本質です。プログラムの内部で使う普通の変数(マリオの残機やスコアなど)は args がなくても自由に作れますが、「起動する瞬間に外からデータを渡したいとき」にだけ、このワープ土管(args)が役に立つのです。

実際のJavaコードで構造を見てみよう!

public class MarioGame {

    public static void main(String[] args) {
        
        // ① 最初は普通のステージ1をセット(普通の変数)
        int startStage = 1; 
        
        // ② もし、起動ポケット(args)に何か文字が入っていたら…
        if (args.length > 0) {
            
            // ポケットの文字が「ステージ5」なら、スタート位置を書き換える!
            if (args[0].equals("ステージ5")) {
                startStage = 5; // ◀ 外からの命令で変数を変えた!
            }
            
            // ポケットの文字が「むてき」なら…
            if (args[0].equals("むてき")) {
                System.out.println("★マリオは無敵状態になりました!");
            }
        }
        
        // ③ ゲーム開始!
        System.out.println("マリオのゲームを起動します。");
        System.out.println("現在のステージ: " + startStage + " からスタートします!");
    }
}

外の世界(コマンド画面)から動かした時のログ

  • 何も入れずに普通に起動した場合: java MarioGame結果: 「現在のステージ: 1 からスタートします!」(空っぽなので基本設定通り)
  • ポケットに「ステージ5」と指定して起動した場合: java MarioGame ステージ5結果: 「現在のステージ: 5 からスタートします!」(argsがデータを中に届けて変数を変えた!)

コードをより詳しく解説

以下の部分がポケットの中身なの?と思ったのでより深く解説していきます。

// ① 最初は普通のステージ1をセット(普通の変数)

int startStage = 1;


// ② もし、起動ポケット(args)に何か文字が入っていたら…

if (args.length > 0) {


// ポケットの文字が「ステージ5」なら、スタート位置を書き換える!

if (args[0].equals("ステージ5")) {

startStage = 5; // ◀ 外からの命令で変数を変えた!

}


// ポケットの文字が「むてき」なら…

if (args[0].equals("むてき")) {

System.out.println("★マリオは無敵状態になりました!");

}

}

コードをマトリョーシカ構造でマッピング

① ポケット(バケツ)そのもの

  • args これ自体が、外から送られてきたデータ(メモ用紙)が入っているポケットそのものです。

② 「ポケットのチャックを開けて、中身が入っているか確認する」動作

  • if (args.length > 0) これはポケットの中ではなく、「ポケット(args)の長さ(length)が0より大きいか?」、つまり「ポケットの中にメモ用紙が1枚でも入っているか?」を外から確認しているプログラムの目(チェック機能)です。

③ 「ポケットの引き出しをパカッと開けて、メモの文字を読む」動作

  • args[0] これが、まさに「ポケットの1番目の引き出しに入っているメモ(データ)」そのものです!
  • .equals("ステージ5") これは「そのメモに『ステージ5』って書いてあるかな?」と、ゲームの脳みそが文字を読んでいる動作です。

④ ポケットのメモを読んだ結果、ゲームの中身を書き換えるエリア

  • startStage = 5; これはポケットの中ではなく、メモを読んだゲームの脳みそが、ゲーム内部の変数(マリオの初期設定)をのうのうと書き換えているプログラムの処理(実行エリア)です。

結論:args[0] が「ポケットの中のメモ」

  • args ➔ ポケット(バケツ)という存在
  • args[0] ➔ ポケットの最初の中身(メモ用紙のデータ)
  • if 文のブロック { } ➔ そのメモを読み取って、ゲームの動きをカスタムしている「ゲームの脳みそ(処理)」

こうして見ると、コードの1行1行が「ポケットそのもの」ではなく、「ポケットを開ける動作」や「中身を読み取る動作」という役割分担になっていることが綺麗に見えてきますね!

ではポケットそのものであるargsに入れるには?

ケット(args)にデータを入れるのは、コードの中ではなく、プログラムを動かす「外の世界(コマンド画面)」です!

ここがJavaのマトリョーシカ構造の最高に面白いところで、「コードの中には『ポケットの形』だけが定義されていて、実際にデータを突っ込むのは、プログラムを起動する人間(プレイヤー)」という役割分担になっています。

「ポケットに入れている瞬間」はこれだ!

パソコンの黒い画面(コマンド画面)で、出来上がったマリオのゲームを起動するときに以下のように打ちます。

java MarioGame むてき

例えば、上記の一行をコマンド画面で入力してエンターキーをッターン!と叩いた、まさにその瞬間が「ポケット(args)に『むてき』という文字をシュッと投げ入れているところ」です。

  • java MarioGame:ゲームのスタートボタン(main)を押すぞ!
  • むてき(半角スペースの後に書いた文字):これがポケット(args)の中に吸い込まれていくデータです!

具体的な処理のイメージ

  1. 外の世界(あなたが文字を打つ) 「おいJava、このゲーム(MarioGame)を むてき って文字を持たせて起動してくれ!」と外からデータを投げ込みます。
  2. 境界線を越えてプログラムの中へ(自動でポケットに入る) プログラムが起動した瞬間、Javaのシステムが自動的にその文字をキャッチして、スタートボタンの横にある String[] args というポケット(バケツ)の中にガサッと格納してくれます。
  3. プログラムの内部(脳みそがチェックする) ここで、さっきあなたが書いてくれたコードの出番です! if (args[0].equals("むてき")) というコードが動いて、「お、外から投げ込まれてポケットに入った最初のデータ(args[0])は『むてき』だな!」と読み取ります。

コードの中は「受け取る準備」、外の画面が「入れる瞬間」

  • コードの中(args:外からデータが投げ込まれたときに、それが入るための「ポケットの設計(仕様)」。
  • 外の画面(java MarioGame むてき:実際にポケットの中にデータを「入れているアクション」。

つまり、コードを書いている段階ではポケットはまだ空っぽ(または存在の定義だけ)で、プログラムを動かす瞬間に初めて外から中へとデータがデプロイ(注入)されるわけです。だから「外の世界から流し込むための受け皿」と呼ばれているんですね。

まとめ

今回解体した String[] args の仕様を、もう一度おさらい(チェック)しておきましょう。

【argsの重要仕様まとめ】

  • プログラム内の普通の変数: args があろうがなかろうが、プログラム内部で自由にいくらでも設定できる。
  • String[] args の本質: プログラムを起動する「まさにその瞬間」にだけ、外の世界(コマンド画面)から中に文字データを流し込むための専用の受付バケツ。
  • 役割分担: コードの中の args はただの「受け皿(設計)」。実際にデータを入れるのは外の世界のプレイヤー(コマンド入力)。

呪文をただの文字の羅列として丸暗記している有象無象を置き去りにして、これからは「外からデータを投げ込むワープ土管」として、のうのうとこの構造をハックしていきましょう!

ワタタク

それでは今日もレッツワクワクコーディング。

関連記事

ワタタク(Watataku)
上達の研究家 / アーティスト
独学1年9ヶ月で虎ノ門ヒルズ49階、地上250mのインフィニティプールへ作品提供・展示

言葉×コード×手書き。三位一体の表現が成長する過程の記録

【発信】クリエイティブコーディング(2024.3~) / 絵(2025.11~) / モレスキン / 思考法 / 生き方

▼運営者について
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次