プログラムを作成するときに複数の値を一気に扱うことがよくあります。
そのようなときにいちいち変数を1個づつ宣言していくと時間がかかってしまい不便です。
そこで複数の変数という箱を一気に用意して、次のプロセスの中で扱うことができるようにする仕組みを「配列」といいます。今回はこの「配列」について説明します。
配列
- 複数の値の入れ物が並んだもの(1限配列ともいう)
- 複数の値をまとめて扱うときに便利
これまでの変数の宣言は1回の宣言につき1つの箱しか用意できませんでしたが、配列は
イメージとしてはたくさんの変数を一気に同時に設定できるという感じです。
配列式の書き方
- 配列を表す変数を宣言するint [ ] score ;
- 配列の要素(入れ物)を確保するscore = new int [ 5 ] ;
- 配列に値を入れるscore [ 0 ] = 50 ;score [ 4 ] = 80 ;
- 配列に入っている値を参照する例:System . out . println ( scoere [ 0 ] ) ;// 50
- [ ] の中の数字はインデックス
- (添え字)
- 0~(要素の数-1)を指定する
配列というのは変数のグループなので、まず変数の宣言をしなければ使用できません。
配列の宣言の記述の仕方は通常の変数の宣言に [ ] を足しただけです。
変数の宣言に関しては以下をご参照ください。
通常の変数と異なり、配列はその箱の数が何個あるのかを指定する必要があります。
配列の中の1個1個の変数のことを「要素」といいます。
その要素数を確保するために scores = new int [ 5 ] を記述します。
new は新しくつくるという意味です。[ ] の中に何個必要なのかを記述します。
変数の宣言をして要素数を指定したことで、5つの箱を用意したことになります。
ちなみにこの変数は int 型で宣言されているので、異なる型のデータを格納することはできません。
int 型の配列の中には int 型の変数しか格納できません。
具体的にどのように配列の中身を代入していくかというと、配列の要素(入れ物)に添え字(インデックス)をつけて用意します。
その際に注意するのはコンピューターは1から数えはじめるのではなく、0から始まるということです。
なので5つの箱を用意するときは [0] ~ [4] となります。
配列の使用1
- int [ ] scores ; = { 50, 70, 95, 80, 65 } ;
- scores = new int [ 5 ] ;
- scores [ 0 ] = 50 ;
- scores [ 1 ] = 70 ;
- scores [ 2 ] = 95 ;
- scores [ 3 ] = 80 ;
- scores [ 4 ] = 65 ;
int [ ] scores ; で、はじめに scores という int 型の配列の宣言をします。
次に scores = new int [ ] ; で5つの要素を用意します。
この時点で空の箱が5つ用意されました。
用意された箱の中に数字を代入していきます。
短縮表現
実際の実務上は宣言と要素数の確保を分けて記述せず、また数字の代入もコードを短縮して記述することもできます。
▶配列は次のようにしても初期化できる
- int [ ] scores = { 50, 70, 95, 80, 65 } ;
このたった1行で前述した7行分のプログラムと同様の内容になります。
はじめは理解するために丁寧に7行記述しても良いかもしれません。
ただ、この短縮した書き方だと要素数(入れ物の数)がいったいいくつなのかがわかりません。
配列の中にいくつ要素が入っているのかの数値を取得するには次のように記述します。
▶配列の大きさ(要素の数)は次のようにして確認できる
- int n = scores . length ;
length とは長さという意味です。 scores の要素数(長さ)を n という変数に代入します。それを出力すれば要素数を参照することができます。
▶プログラムコード
- class Array {
- public static void main ( String [ ] args ) {
- int score ;
- scores = new int [ 5 ] ;
- scores [ 0 ] = 50 ;
- scores [ 1 ] = 70 ;
- scores [ 2 ] = 95 ;
- scores [ 3 ] = 80 ;
- scores [ 4 ] = 65 ;
- System . out . println ( scores [ 0 ] ) ;
- System . out . println ( scores [ 5 ] ) ;
- }
- }
出力結果は
50
65
となります。
▶短縮表現と要素数のコード
- class Array {
- public static void main ( String [ ] args ) {
- / / 短縮表現
- int [ ] scores = { 50, 70, 95, 80, 65 } ;
- int n = scores . length ; // 要素数の抽出
- System . out . println ( scores [ 0 ] ) ;
- System . out . println ( scores [ 5 ] ) ;
- System . out . println ( n ) ;
- }
- }
出力結果は
50
65
5
となります。
コマンドライン引数
「コマンドライン」というのはJavaのファイルのコンパイル・実行をするところです。
javac 〇〇.java を記述していたところのことです。
この入力の場所のことを「コマンドライン」といいます。
これまでは入力・実行だけでしたが、ユーザーの用途に合わせてプログラムを柔軟に対応させるにはコマンドラインの中で引数を与えて実行してもらう必要があります。
例えば if ~ else 文で考えてみると…
- int age
- age = 18 ;
- if ( age < 6 ) {
- System . out . println ( ” 乗車料金は無料です ” ) ;
- } else if ( age < 13 ) {
- System . out . println ( ” 子ども料金で乗車できます ” ) ;
- } else {
- System . out . println ( ” 大人料金が必要です ” ) ;
- }
if ~ else 文に関してはこちらをご参照ください。
age という変数を宣言して18を代入しました。
ですが、実際の運用上ではあらゆる年齢の数字でも対応できるようにする必要があります。
直接数字をプログラムの中に記述せずにコマンドラインの中に引数として変数を指定できるようにすると、柔軟に対応することができるようになります。
つまりコマンドライン引数というのは、変数をプログラムの中で代入せずプログラムの外で、実行する都度与えるというものです。
コマンドライン引数の書き方
- プログラム実行の際、コマンドラインからデータを入力したい場合がある。
- main ( ) メソッドへの引数として扱われる
- データは文字列型の配列 args に格納される
% java Args Helloworld ⇐コマンドライン引数
- class Args {
- public static void main ( String [ ] args ) {
- / / コマンドライン引数を出力
- System . out . println ( args [ 0 ] ) ;
- }
- }
のようにはじめの2行は通常通りですが
出力の命令文 System . out . println のあとに ( args [ 0 ]) を記述します。
さきほど scores [ 0 ] などそれぞれの要素を指定しましたが ( args [ 0 ]) はシステム側が用意した配列です。
ユーザーが定義、宣言、要素数の指定などの設定をしなくても勝手に使用することができます。
args ( arguments ) = 引数のことです。
ではこのシステム側が用意した配列の1つめの中身([ 0 ]) には何が入っているのでしょうか。
実行時にコマンドラインに入力した java 〇〇 の後にスペースを挟んで1つめに記述するもの。これが1つめの要素の中身となります。
上記では Helloworld をコマンドライン引数として入力させましたが、これが1つめの引数となります。
さらにスペースを挟んで2つめ、3つめと記述することができます。
もし〇〇(クラス名)の後に何も記述しなければ、エラーメッセージ(厳密にはエラーではありませんが)が出力されます。
- class Args {
- public static void main ( String [ ] args ) {
- / / コマンドライン引数を出力
- System . out . println ( args [ 0 ] ) ;
- }
- }
実行時のコマンドラインへの入力
- ・・・・・javac Args.java
- ・・・・・java Args Helloworld
実行結果
- ・・・・・javac Args.java
- ・・・・・java Args Helloworld
- Helloworld
コマンドラインに Helloworld が出力されました。
コマンドライン引数の制約
- 数値や文字も文字列として扱われる―プログラム内で型変換をおこなう必要がある
% java Args2 A 10 3.14 ⇐複数入力の場合半角スペースで区切る
- class Args2 {
- public static void main ( String [ ] args ) {
- / / 文字列型 ➡ int 型
- int i = Integer . parseInt ( args [ 1 ] ) ;
- / / 文字列型 ➡ double 型
- double d = Double . parseDouble ( args [ 2 ] ) ;
- }
- }
コマンドラインに入力した引数、 args という配列の中に入るものはすべて文字列扱いとなります。
% java Args2 A 10 3.14 のように3つの引数を入力しました。Aは文字として問題ありません。ですがコンピューターは10と3.14は数字としては認識していません。なので計算等に利用することはできません。したがってこの10と3.14を数字として何らかの計算に利用したい場合は、一度文字列から数字に型変換をしなければなりません。
型変換に関してはこちらを参考にしてください。
int i = Integer . parseInt ( args [ 1 ] );
int i = Integer . parseInt これは暗記してしまってください。Int のIは大文字です。
( args [ 1 ] ) は2番目の引数を整数型( int 型 )に変換して変数 i に代入するという意味です。
Double も同様ですが、( args [ 2 ] ) は3番目の引数を少数型( double 型 )にするという意味です。
- class Args2 {
- public static void main ( String [ ] args ) {
- / / 文字列型 ➡ int 型
- int i = Integer . parseInt ( args [ 1 ] ) ;
- / / 文字列型 ➡ double 型
- double d = Double . parseDouble ( args [ 2 ] ) ;
- }
- }
( args [ 1 ] ) で2つ目の引数を受け取って整数型に変換して ( args [ 2 ] ) で引き取った引数は少数型に変換されます。
本当にキチンと変換されたかどうか計算をして確かめてみましょう。
- class Args2 {
- public static void main ( String [ ] args ) {
- / / 文字列型 ➡ int 型
- int i = Integer . parseInt ( args [ 1 ] ) ;
- / / 文字列型 ➡ double 型
- double d = Double . parseDouble ( args [ 2 ] ) ;
- System . out . println ( i * 2 ) ;
- System . out . println ( d * 2 ) ;
- }
- }
実行時のコマンドラインへの入力
- ・・・・・javac Args2.java
- ・・・・・java Args2 A 10 3.14
実行結果
- ・・・・・javac Args2.java
- ・・・・・java Args2 A 10 3.14
- 20
- 6.28
コマンドラインに 20 と 6.28 が出力されました。
では、もし型変換せずに出力した場合どのように出力されるのでしょうか
- class Args2 {
- public static void main ( String [ ] args ) {
- System . out . println ( args [ 1 ] * 2 ) ;
- System . out . println ( args [ 2 ] * 2 ) ;
- }
- }
- ・・・・・javac Args2.java
- Args2 . java : 8 エラー : 二項演算子’*’のオペランドが不正です
- ・・・・
- ・・・・
このようにコンパイルの時点でエラーが表示されてしまいます。
したがって、そのまま文字列として出力させるのではなく数字としてなんらかの計算をさせる場合には必ず型変換をおこなう必要があります。
まとめ
配列が利用できるようになると、扱える変数の数が多くなるので規模の大きなプログラムを作成できるようになります。またコマンドライン引数によって簡単なゲームや翻訳機など様々な場面で対応できるプログラムが理解できるようになります。