【新卒奮闘記】mainメソッド内のメソッド処理【~IT初心者からプロのSEへ~】

本記事のポイント

  • mainメソッドのクラス内で定義されたインスタンスメソッドは実行できない
  • クラスメソッドであればmainメソッドで直接アクセスできる
  • 別のクラスでインスタンスメソッドを定義し、mainメソッドでオブジェクトを生成すれば実行可能

はじめに

初めまして、2020年度新卒入社のsyoと申します。
私は、学生の頃は神経科学の研究室に所属しマウス(ネズミ)を使って遺伝子を調べたり、神経活動を計測する実験をしていました。学生の頃はプログラミングをほとんどやっていないので、プログラミングを本格的に勉強するのは弊社に入ってからでした。
なので、初心者の初心者による初心者のためのつまずいた点というものを自分の経験純度100%で紹介したいと思います。研修ではWebアプリケーションやシステムによく用いられるプログラミング言語のJavaを中心に学んでいます!

つまずいたところ

研修ではメソッドからクラスについて学ぶという流れで進んでいきました。クラスの項目に入った際に、インスタンスメソッドとクラスメソッドについて学びました。

mainメソッドが書かれているクラス内のメソッド定義には、staticというキーワードを付けて定義していることに気づきました。

メソッドには、

  • クラスメソッド:
    staticというキーワードを付けて(静的メンバで)オブジェクトを生成せずにメソッドを直接参照して実行できるメソッド
  • インスタンスメソッド:
    staticをつけず、オブジェクトを生成して実行するメソッド

の2つがあります。

mainメソッドはクラスメソッドとなっていますが、これがどういった意味を持つのかわかりませんでした。

いざ調査!

そこで先輩社員に質問したところ、「それならば一度mainメソッドでstaticを外して試してみよう」というアドバイスをいただきました。

早速実行したところ、次のような結果になりました。

インスタンスメソッドを定義してmainメソッドで実行

 実行してみた結果、次のようなエラーが起きました。

非staticメソッドをstatic参照することはできません、とはどういうことなのか、、、
調べてみたところ、次のような規則があることがわかりました。

javaにおいてあるクラスで定義したメソッドは、staticをつけてクラスメソッドとした場合のみ、同一クラス内の別メソッド内で実行することができます*1。この規則によって、mainメソッド内で、同一クラス内に定義したインスタンスメソッドを呼び出そうとしても呼び出すことができずエラーとなっていました。

エラーが起きないようにする方法は2つあります。
それは、

  1. 同じクラス内でクラスメソッドを定義して実行する
  2. 別のクラスでインスタンスメソッドを定義し、mainメソッド内でそのオブジェクトを生成して実行する

です。

  1. インスタンスメソッドは、宣言されているクラスがロードされるタイミングで展開されて参照可能となります。したがって、mainメソッドと同クラス内に定義されているクラスメソッドは最初にロードされるため実行可能となります。
  2. インスタンスメソッドはオブジェクトを生成しなければ使えるようになりません。したがって、オブジェクトを生成する工程が必要となります。ここでの注意点は、別のクラスで定義されたインスタンスメソッドはmainメソッド内でオブジェクト生成すれば実行可能となる点です*2

以上を踏まえて実行すると、

1.クラスメソッドの方法

実行結果

2. 別のクラスで定義したインスタンスメソッドの方法

実行結果

見事に実行ができました!
ちなみに、上記の通りmainメソッド内でメソッドを実行する方法は2通りあります。
保持したデータを元に処理をしたいときにはインスタンスメソッドを使い、データを持たないメソッド処理の時にはクラスメソッドを用いることで使い分けます。
以下に保持したデータを用いて処理をしたいときの例を挙げます。
処理は、3つの値の合計値を1つ, 2つ, 3つごとでのグループの足し算です。

  1. クラスメソッドの方法

実行結果

2. インスタンスメソッドの方法

実行結果

上記の通り、データを保持して計算できるインスタンスメソッドのほうがスッキリとしたコードになり柔軟な処理が可能となります!

結論

mainメソッドはクラスメソッドであるため、同一クラスで定義されたインスタンスメソッドを実行できないことがわかりました。そのため、mainメソッド内でメソッドを実行する方法は、

  1. 同一クラス内でクラスメソッドを定義して実行する
  2. 別のクラスでインスタンスメソッドを定義して実行する

となります。
今回つまずきを解消していくにあたり、コードについて疑問等が起きた場合はいったん自分で実行してみて、挙動を確認することが理解の第一歩であるということを強く実感しました。

今後も研修内でつまずいた点を記事に載せていきたいと思っています。ここまでお付き合いいただきありがとうございました!

参考文献

  1. mainメソッドとクラスの関係 – クラスとは何か – Java入門(参照 2020-04-26)
  2. staticなメソッドから非staticなメソッドへのアクセスについて(参照 2020-04-26)

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

アーカイブ

カテゴリー

PAGE TOP