はじめに
プログラミング初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。
Javaにおける変数
これまで私は、Rubyを中心に基礎学習をおこなってきました。そこでRubyと比較しながら、javaにおける変数の理解を深めていきたいと思います。
変数は、プログラミング言語によって扱い方が異なります。扱い方によって分類すると「動的型付け言語」と「静的型付け言語」の2種類がありますが、前者がRubyで、後者がJavaになります。
RubyとJavaでは分類自体が異なるほど大きな違いがあるようです。
これらの違いを理解するため、「データ型」について理解します。
データ型とは
データ型とは。変数に格納するデータの種類のことです。
Rubyでは、「数値としての1」と「文字としての1」はプログラム上では異なるものとして扱われます。
データ型は、このような「数値」や「文字」といった種類をより細かく定めたもので、Javaの基本データ型には8つの種類があります。
データ型はなぜ必要か
データ型はコンピュータのリソースを効率よく使うための仕組みです。
プログラムを実行すると、変数の値はコンピュータ内の「メモリ」と呼ばれるパーツに保存されます。データ型があることで、このメモリを効率よく使用することができます。
変数として扱いたい数値は大小様々です。
ここで問題になるのが、あらかじめ用意しておく箱の数をどのように決めればよいのかということです。
箱の数を多めに用意しておけば大きな数値でも格納できますが、その中に小さな数値を入れると無駄が生じます。
データ型は、この無駄を少なくするための仕組みです。これから使用する変数にどのような範囲の値を格納するのか事前に決めておき、それに適した数の箱を確保することでメモリを効率的に使用できます。
基本データ型の種類
Javaの基本データ型は以下の8種類です。
なお、表の「bit」はメモリの「1箱分」に相当します。
この中で、使用頻度が高いのはint型とlong型のようです。
小さめの数値を扱うint型では「32bit」、大きめの数値を扱うlong型では「64bit」のメモリを使用することから、扱う数値が大きくなると必要なメモリサイズも増えることがわかります。
Javaで変数を使用する際は、その変数をどのデータ型として扱うのかプログラムに伝えるため、あらかじめ「宣言」してから使用します。
しかし、Rubyでは変数を使用し始める際に、データ型を宣言していませんでした。
Rubyで型の宣言が不要なのは、RubyとJavaではデータ型の扱い方が大きく異なるためです。
RubyとJavaではデータ型の扱い方がどう違うか
プログラミング言語には、データ型の扱い方によって「動的型付け言語」と「静的方付け言語」の2種類があります。
動的型付け言語
動的型付け言語は、プログラムの実行時に変数のデータ型を決定する方式で、Rubyはこちらに含まれます。
a = 1
puts(a * 2)
# 2と出力される
a = "alphabet"
puts(a * 2)
# alphabetalphabetと出力される
前半のコードも後半のコードも、「変数a」に対して「*2」を行なっています。
ところがそれぞれ異なる処理が行われています。
aに「1」が代入されている場合は数値演算が行われ、「2」と出力されています。
一方、「"alphabet"」が代入されている場合は文字列操作が行われ、「alphabetalphabet」と出力されています。
これは、どのような値が代入されたかによって、変数のデータ型が柔軟に変更され、そのデータ型に基づいて処理が行われていることを表しています。
このように、「プログラムの実行時に変数のデータ型が決定される仕組み」を採用している言語が、「動的型付け言語」です。
静的型付け言語
静的型付け言語は、動的型付け言語とは異なり、変数のデータ型を最初に決定したら変更できない仕組みです。Javaはこちらに含まれます。
最初に「整数」として宣言した変数に、「文字列」を代入しようとするとエラーになります。
柔軟性がなく不便に感じるかもしれませんが、処理が高速になったり、データ型の不整合によるエラーを実行前に検知できるなどのメリットがあります。
Javaは静的型付け言語なので、変数を使用し始める際は「型の宣言」が必要になります
Javaの変数を理解する
変数の役割は、Java、Rubyの場合でも変わりはありません。
しかし、Javaでは「宣言」を行わないと変数を使うことができません
変数を宣言するためには、以下のように型名を続けて変数名を記述します。
型名 変数名;
行末に「;(セミコロン)」がついていますが、Javaでは、命令の終わりにセミコロンが必要で、書き忘れるとエラーになります。
宣言後は、Rubyと同様に扱うことができます。
javaでは下記のように必ず記述しなくてはいけないテンプレートようなものがあります。
class Main {
public static void main(String[] args) {
//ここに処理を記述する
}
}
例にコードを記述してみます。
class Main {
public static void main(String[] args) {
int radius;
radius = 5;
System.out.println(radius * radius * 3.14);
}
}
System.out.printlnは、()で囲んだ中身を出力するメソッドで、Rubyのputsに相当するものです。
上記のコードを実行すると下記のように「78.5」と表示されます。
sh -c javac -classpath .:target/dependency/* -d . $(find . -type f -name '*.java')
java -classpath .:target/dependency/* Main
78.5
実行したコードの意味を確認します。
int radius;
radius = 5;
System.out.println(radius * radius * 3.14);
①int radius;によって、int型の変数radiusを宣言する
②radius = 5;によって、変数radiusに整数の5を代入する
③printlnを実行して、計算結果を出力する。
このように、Javaで変数を使用する際には、まず型の宣言が必要です。
ただし、Javaには「型推論」と呼ばれる仕組みがあり、宣言に関するコードを省略することができます。
型推論とは
型推論を利用した変数の宣言方法は下記のようになります。
var 変数名 = 値
このように、「var」を使って宣言を行い、初期値を代入します。
この記述を行うと、値の種類によってデータ型が推論され、推論されたデータ型で宣言が行われます。
class Main {
public static void main(String[] args) {
var radius = 5;
System.out.println(radius * radius * 3.14);
}
}
このようにvarを使用すると、代入する値(今回の例では5)からデータ型を推論してくれるため、int型であるという宣言が不要になります。
次に、推論されたデータ型を確認します。
class Main {
public static void main(String[] args) {
var radius = 5;
System.out.println(radius * radius * 3.14);
System.out.println(((Object)radius).getClass().getSimpleName());
}
}
今回、追加したコードはデータ型を確認するため、この箇所でのみ使用するものです。
sh -c javac -classpath .:target/dependency/* -d . $(find . -type f -name '*.java')
java -classpath .:target/dependency/* Main
78.5
Integer
実行すると上記のように「Integer」と表示され、変数radiusが整数型で宣言されていることがわかります。