駆け出しのエンジニア日記

プログラミング言語勉強中の奮闘日記

Javaのimport文

Java ではあらかじめ用意されたクラスを自分のプログラムの中で利用することができます。あらかじめ import 宣言を行っておくことでクラス名だけで記述することができます。

 

一つ前の日記では下記のように記述していました。

package jp.co.funatz.pkgTest;
 
public class PackageTest {
public static void main(String args) {
jp.co.funatz.pkgTest.a.PackageA.a();
jp.co.funatz.pkgTest.b.PackageB.b();
}
}

この記述でも問題ないですが、ずっと「  jp.co.funatz.pkgTest.a.PackageA.a();  」のようにパッケージ名を含めた名前を入力するのは大変です。

そこで使えるのがimport文です。

 import 文を使ってクラスをインポート宣言すると、パッケージ名を省略してクラス名だけでプログラムの中に記述できるようになります。

 [ import パッケージ名.クラス名 ]

import 宣言はクラスの定義を行うよりも前に行うように!

実際に記述してみる。

package jp.co.funatz.pkgTest;

import jp.co.funatz.pkgTest.a.PackageA;
import jp.co.funatz.pkgTest.b.PackageB;

public class PackageTest {
public static void main(String args) {

PackageA.a();
PackageB.b();
}
}

パッケージ名を省略すること簡単に記述ができるようになります。

 

そのほかにimport 宣言を行う方法として、特定のクラス毎にひとつひとつ行う方法と、同じパッケージに含まれるクラスをまとめて行う方法があります

・特定のクラス毎にひとつひとつ行う方法

→異なるパッケージの同じクラス名のクラスを使うには?

// パッケージ名が別だがクラス名が同じな場合、import文では区別できないため、直接記述するしかない
jp.co.funatz.pkgTest.a.PackageZ.z();
jp.co.funatz.pkgTest.b.PackageZ.z();

・同じパッケージに含まれるクラスをまとめて import 宣言を行う方法

//パッケージにあるクラスを全て指定したい場合は * アスタリスクを使う
import jp.co.funatz.pkgTest.a.*; // import jp.co.funatz.pkgTest.a.PackageA;
import jp.co.funatz.pkgTest.b.*; // import jp.co.funatz.pkgTest.b.PackageB;

 

java における import 文の使い方について解説しました。

Javaのパッケージ

パッケージとはJavaのクラスをまとめて分類するための仕組み

クラス数が大量にある場合、それらを機能などで分類してまとめておくとクラスの管理が容易になる。

 

クラスの先頭で「package」と宣言することで、そのクラスが分類されるパッケージを指定することができる。

例・・・

package pack;

・パッケージを指定した場合、そのクラスのソースファイルは指定パッケージと同じ名前のフォルダに格納する必要がある。

・ファイルを移動した場合は、ソース内のパッケージ宣言も合わせて変更する必要もある。

・同一パッケージ内のクラスにはクラス名のみでアクセスが可能となっている。

・複数の階層から成るパッケージの場合は、階層の上から順に「.」でパッケージ名を連結します。

 

実際に一つ記述してみる。

PackageA

package jp.co.funatz.pkgTest.a;
public class PackageA {
public static void a() {
System.out.println("PackageA.a() is executed");
}
}

PackageB

package jp.co.funatz.pkgTest.b;
public class PackageB {
public static void b() {
System.out.println("PackageB.b() is executed");
}
}

mainクラス

package jp.co.funatz.pkgTest;

public class PackageTest {
public static void main(String[] args) {
jp.co.funatz.pkgTest.a.PackageA.a();
jp.co.funatz.pkgTest.b.PackageB.b();
}
}

mainクラス内の記述の仕方でないと、コンピュータ側でどこにファイルが認識できず、コンパイルエラーになる。

出力結果

PackageA.a() is executed
PackageB.b() is executed

 

実行の仕方・・・ターミナルで

コンパイル・・・javac jp/co/funatz/pkgTest/PackageTest.java
  実行・・・・・・java jp.co.funatz.pkgTest.PackageTest

 

次回はより簡潔に記述できるようにimportについて学んでいく。

Javaの可変長引数

メソッドで引数の数を事前に設定したくないときがあります。

例えば、入力した数字の平均値を出すというメソッドの時、何個入力するかはそのときどきで変えたい場合が出てきます。

そんなときに使えるのが、可変長引数だ。このページではJavaメソッドの可変長引数の使い方についてお伝えします。

 

そもそも可変長引数とは・・・?

Javaのメソッドの最後の引数は可変長引数として使うこともできます。

可変長引数とは、メソッドの定義側でひとつ引数を設定しておくと、実際につかうときにいくつも引数を記述できます。

引数の数は決まっていないが、型が同じという引数があれば、この書き方ができます。

可変長の引数は配列に入れられて、メソッドに渡される。このため、メソッド側では配列と同じ扱いで、処理を行うことができます。

 

一つ例を見てみましょう。

public static void main(String args) {
printScoreAverage("クラスA", 89.7, 98.9);
printScoreAverage("クラスB", 66.2, 93.6, 85.8, 80.7);
printScoreAverage("クラスC", 95.2, 68.6, 79.8, 81.7, 99.9, 59.4);
}
public static void printScoreAverage(String className, double... scores) {
double sum = 0;
for (double score : scores) {
sum += score;
}
System.out.println(className + ":(人数:" + scores.length + ")");
System.out.println("点数:" + sum / scores.length);
}

生徒のテスト平均点を表示する。クラス毎に人数が異なっても、メソッドの定義を変える必要はない。実引数の最後の点数を生徒の数に合わせて書けば問題ないです。

出力結果は、

クラスA:(人数:2
点数:94.30000000000001
クラスB:(人数:4
点数:81.575
クラスC:(人数:6
点数:80.76666666666667

上記のようになる。

書き方としては、メソッドの引数の定義では、最後の引数の型と識別子の間に、「…」を入れて記述。これで可変長だと宣言したことになる。

 

ここで、簡単にメソッドに渡される値が、配列だということを確認しておく。

public static void main(String args) {
printNumbers(1, 2, 3, 4, 5, 6);// [1]
}
private static void printNumbers(int... numbers) {// [2]
for (int i = 0; i < numbers.length; i++) {// [3]
System.out.println("number[" + i + "] : " + numbers[i]);
}

出力結果は下記の通り

number[0]:1
number[1]:2
number[2]:3
number[3]:4
number[4]:5
number[5]:6

となる。

 

ぜひ参考にしてください。

Javaのオーバーロード

メソッドを引数を付けて呼び出す時、引数に記述する値のデータ型はメソッドで決められたものしか指定できないのがJavaのルールです。

その為、同じような機能を持つメソッドであっても引数のデータ型が異なれば別々のメソッドを用意する必要があります。

一つ例を見てみましょう。

public static void main(String args) {
int n = plusInt(15, 9);
System.out.println(n);
double d = plusDouble(9.3, 6.5);
System.out.println(d);
}
public static int plusInt(int n1, int n2) {
return n1 + n2;
}
public static double plusDouble(double d1, double d2) {
return d1 + d2;
}
}

上記の例ではint型の値の加算を行うメソッドとdouble型の値の加算を行うメソッドを2つ用意しています。これはこれで間違っていませんが、同じような機能を持つメソッドであれば引数のデータ型が異なっていても同じメソッド名を使って呼び出せると便利です。

Javaではメソッドの「オーバーロード」といいます。

Javaでは引数のデータ型や引数の数が完全に一致していなければ異なるメソッドに同じメソッド名を付けることが出来ます。

ここで上記の例を書き換えてみます。

public static void main(String args) {
int n = add(15, 9);
System.out.println(n);
double d = add(9.3, 6.5);
System.out.println(d);
}
public static int add(int n1, int n2) {
return n1 + n2;
}
public static double add(double d1, double d2) {
return d1 + d2;
}

addメソッドは同じクラスの中に2回定義されていますが、引数の数は同じでも引数のデータ型が異なるため区別することが可能となっています。

メリットとしては、メソッド名を明確に分けたほうが便利な場合もありますが、メソッド名を同じにしておけば引数のデータ型を意識することなく利用することができる点です。

その他に

・引数のデータ型と数は同じでも順番が異なっている場合もオーバーロード可能です。

public static void test(int n1, double d1) {
// ...
}
public static void test(double d1, int n1){
// ...
}

 

最後にオーバーロードできない場合も簡単に紹介します。

・引数の変数名だけが異なっている場合

・戻り値だけが異なっている場合

はNGとなります。

 

みなさんも自分で記述してみてください!

Javaの引数と戻り値

プログラムを組む上で重要な要素となっているので少しずつ理解を深めましょう。

プログラムにおいて、「この値を使ってデータを処理して欲しい」というときに、渡す値のことを引数(ひきすう

戻り値とは、引数を引き渡した結果、返って来る値のこと

となっています。

実際に記述してみます。

public class test {
public static void main(String args) {
printData("社員A", 30);
}
public static void printData(String name, int age) {
System.out.println(name + "さんの年齢は" + age + "歳です");
}
}

上記において「社員A」「30」はどちらも引数にあたります。このように、引数は複数を指定することもできます。

この処理を実行すると、

「社員Aさんの年齢は30歳です」と出力されます。

このように文字列と整数の両方、また配列を引数とすることもできます。

 

public class test {
public static void main(String args) {
int difference = add(10, 5);
System.out.println(difference);
}
public static int add(int a, int b) {
return a + b;
}
}

上記の文で「 a + b 」という式の結果を戻り値として返しています。a=10でb=5なので、「 15 」という値が戻り値となります。

 

最後に引数を使ってメソッドにデータを渡してみる

public class test {
public static void main(String[] args) {
String name = "ラーメン";
like(name);
}
public static void like(String name) {
System.out.println(name + "が好きです");
}
}

この処理を実行すると、

「ラーメンが好きです」と出力されます。

「like(name)」という記述で、likeメソッドにnameという引数を引き渡しています。

呼び出したメソッド内で使用した変数の値も、呼び出し元のメソッドの中では使用できない点には注意が必要です。メソッドで算出した値を戻したい場合には「戻り値」を使う必要があります。

 

引数について理解を深めることは、Javaでできることの範囲を広げることにつながりますので、書き方について覚えていきましょう。

メソッドの定義と呼び出し方

まずは下記のように記述していきます。

public class test {
public static void main(String args) {
int number1 = 5;
int number2 = 10;
int sum = 0;
sum = number1 + number2;
System.out.println(sum);
}
}

出力結果としては「15」が出力される。

この数行記述するだけなら問題ないが、現場では数百を超えるプログラムの記述量になってくる。長くなることや、どこで何を記述しているかわからなくなってきてしまうことがある。

そこで、「 main 」メソッド以外のメソッドを増やし、分けて記述していく方がわかりやすくなってくる。

※メソッド→簡単に言うとプログラムに行なってもらう処理

 

実際にメソッドを定義して書き換えてみる

public class test {
public static void main(String args) {
// javaで実行させれるのはmainメソッドのみ
add();
}
public static void add() {
int number1 = 5;
int number2 = 10;
int sum = 0;
sum = number1 + number2;
System.out.println(sum);
}
}

上記のように書き換えることができる。

今回メソッド名は足し算の意味をもつ「add」としています。

これをメソッドの定義という。

このaddメソッドを作成しただけでは、処理は実行されないので、

mainメソッド内で「 add(); 」を実行する。

このように記述することで、出力結果は同じ「15」になる。

※mainメソッドとaddメソッドのブロック{  }は別々にするように!

 

以上、簡単にメソッドの定義と呼び出し方について書いてみました。

Javaの配列と繰り返し構文

配列の各要素に入れた値を表示させる時、一つ一つindexを指定して表示させる方法があるが、要素の個数が多くなる場合、行数が増えてコードが見づらくなる恐れがある。

→先日紹介した、forループを利用することで繰り返すことで表示ができる

 

・forループ使わない場合

public static void main(String args) {
String name = "鈴木";
String email = "suzuki@xxxx.com";
String phone = "090-0000-1234";
System.out.println(name);
System.out.println(email);
System.out.println(phone);

現状は要素の数が3つなのでこのまま記述しても問題ないが、数が増え100や1000になってくるとこのまま記述するのは効率も悪くなってくる

・forループ使った場合

String customer; // String型の配列宣言
customer = new String[3]; // 配列の初期化
customer[0] = "鈴木";
customer[1] = "suzuki@xxxx.com";
customer[2] = "090-0000-1234";
for (int i = 0; i < 3 ; i++) {
System.out.println(customer[i]);
}

for文の「 i < 3」は要素の個数が3未満になるまで繰り返すの意味なので、「System.out.println(customer[i]);」では「 0 , 1 , 2 」が出力される

100個まで増えた場合、「 customer = new String[3];  」の[ ]内を100に変更すればいいが、プログラムが大きくなるにつれ数字の変更し忘れや、ミスも出てくる可能性がある

 

そのため、for文の「 i < 3」を下記のように書き換えることができる

String[] customer; // String型の配列宣言
customer = new String[3]; // 配列の初期化
customer[0] = "鈴木";
customer[1] = "suzuki@xxxx.com";
customer[2] = "090-0000-1234";
for (int i = 0; i < customer.length; i++) {
System.out.println(customer[i]);
}

  i < customer.length; 」・・・要素の個数を「  配列変数.length  」で表現ができる

要素が増えてもforループの繰り返し条件の数値を変更しなくて済むことになる

 

一番最後のように記述できれば、他の人がコードを見てもわかりやすい・ミスが減るなどメリットが多いのでぜひ覚えてください!