

今回もよろしくお願いします!!

はい、頑張っていきましょうね。
前回は「Hello,world!」と画面に表示させましたが、今回は様々な文字や数字を表示してみましょう!
前回は「Hello,world!」と画面に表示させましたが、今回は様々な文字や数字を表示してみましょう!

楽しみです!
前回の「Hello, world!」のプログラムはこちら↓↓↓
画面に文字列を表示する

改めて、「Hello, world!」プログラムの内容を見てみましょう。
package pkg;
public class Lesson1 {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}

これって、System.out.println("");のダブルクォーテーションの中に書いた文字を表示してるってことですよね?

ほぼそれで合っていますよ。正確には、System.out.println();の括弧内に書かれた文字列を表示しているんです。

文字列? 「文字」じゃないんですか?

プログラミングの世界では、「A」「あ」「1」のように1文字だけの文字を扱う時に「文字」、「ABC」「あいうえお」「123」のように複数の文字を扱う時に「文字列」という言い方をするんです。

なるほど、文字が列のように並んでいるから文字列というわけですね。

その通りです。Javaでは文字列は""(ダブルクォーテーション)で囲むという決まりがあるので、"Hello, world!"のように書くわけです。

そういうことなんですね! わかりました。文字列は""で囲む……覚えました!

もちろん、以下のように何回でも書くことができます。public static void main(String[] args){から}の間に書かなければならない点にだけ注意してくださいね。
package pkg;
public class Lesson1 {
public static void main(String[] args){
System.out.println("おはようございます");
System.out.println("こんにちは");
System.out.println("こんばんは");
}
}
実行結果おはようございます
こんにちは
こんばんは
こんにちは
こんばんは

おぉー!! 3行表示されましたね!

また、System.out.println();は画面に文字を表示した後、自動的に改行されます。文字を表示後、改行したくない場合は、System.out.println();の代わりにSystem.out.print();を使用します。
package pkg;
public class Lesson1 {
public static void main(String[] args){
System.out.print("タピオカ");
System.out.print("ココナッツ");
System.out.print("ミルク");
}
}
実行結果タピオカココナッツミルク

改行を入れるときは「println」、入れないときは「print」なんですね!

ではここで問題です。ただ改行だけさせたい場合はどのように記述すればよいでしょうか。

何も書かないで改行するってことですか? うーん……。System.out.printlnの中身を空欄にするとか?

正解です。System.out.println(); と表記します。
package pkg;
public class Lesson1 {
public static void main(String[] args){
System.out.println("タピオカ");
System.out.println();
System.out.println("ココナッツ");
System.out.println();
System.out.println("ミルク");
}
}
実行結果タピオカ
ココナッツ
ミルク
ココナッツ
ミルク

ほんとだ! 1行あきましたね!

ちなみに、System.out.println(""); としても同様の結果になります。""の中に文字列を書かないもののことを、「空文字列」といいます。こちらも併せて覚えておいてくださいね。

わかりました!
文字を繋げる(文字列結合)

Javaでは、「+」(プラス)記号を使うことで、文字列と文字列をくっつけることができます。「+」記号は半角で入力してくださいね。
package pkg;
public class Lesson1 {
public static void main(String[] args){
System.out.println("おはよう" + "ございます");
System.out.println("こ" + "んにちは1" + "2345");
System.out.println("123" + "456");
}
}
実行結果おはようございます
こんにちは12345
123456
こんにちは12345
123456

これって何に使うんですか? くっつけたいなら普通に"おはようございます"とか書けばよくないですか?

いい質問です。全くその通りで合っています。決まった文字列を繋げるだけであればわざわざ+記号を使う必要はありませんよね。後ほど「変数」という考え方について解説しますが、その時に重要となる考え方なので、しっかりここで覚えておいてくださいね!

わかりました! 「+」で文字列をくっつける! 覚えました!
計算をさせてみよう

次は、簡単な計算をやってみましょう。「+」「-」はそのまま足し算、引き算ができます。掛け算は「*(アスタリスク)」、割り算は「/(スラッシュ)」を使います。半角で入力してくださいね。

あれ? 「+」って文字列を繋げる役割なんですよね?

はい、「+」には文字列を結合する役割と、足し算をする役割の両方があるんです。以下の例を試してみてください。
package pkg;
public class Lesson1 {
public static void main(String[] args) {
System.out.println(1);
System.out.println(10 + 3);
System.out.println(10 - 3);
System.out.println(10 * 3);
System.out.println(10 / 3);
}
}
実行結果1
13
7
30
3
13
7
30
3

10+3はちゃんと13になってますね。でも、10/3は3じゃなくて3.3333…になるはずですよね? おかしくないですか?

よく気付きましたね! これは不具合ではなく、Java言語の仕様によるものです。Javaでは、整数と整数の計算結果は整数になるという特徴があります。整数同士の計算では、小数部分が切り捨てとなります。ですので、10/3=3になるというわけですね。

じゃあ10/3=3.3333…を計算したい場合はどうするんですか?

計算過程に小数を含めればいいんです。以下を実行してみてください。
package pkg;
public class Lesson1 {
public static void main(String[] args) {
//10÷3
System.out.println(10 / 3);
System.out.println(10.0 / 3);
System.out.println(10 / 3.0);
System.out.println(10.0 / 3.0);
}
}
実行結果3
3.3333333333333335
3.3333333333333335
3.3333333333333335
3.3333333333333335
3.3333333333333335
3.3333333333333335

ちゃんと小数も表示されてますけど……最後の数字が5って間違いじゃないですか?

通常の計算では、小数点以下が長くなる場合に不正確な結果が出ることがあります。基本的には気にしなくて良いのですが、もし正確な計算が必要となる場合は、BigDecimalというものを使います。ここでは詳細は割愛しますね。

へ~……そういうものなんですね。とにかく、超細かい計算では不正確ってことですね!

そういうことです。まとめると、以下の通りになりますね。
- 整数と整数 ・・・ 計算結果は整数
- 整数と小数 ・・・ 計算結果は小数
- 小数と整数 ・・・ 計算結果は小数
- 小数と小数 ・・・ 計算結果は小数

また、式に基づいて演算(≒計算)を行なうことを「演算」、演算の種類を指定する記号のことを「演算子」と呼びます。「+」「-」「*」「/」は算術演算子と呼ばれます。

なるほど、計算のことを「演算」、計算する記号のことを「演算子」っていうんですね!

はい。視認性のため、演算子の前と後ろには半角スペースを入れましょう。

わかりました!
「+」の使い分け

ふと思ったんですけど、「10+3」を計算させないでそのまま表示したい場合はどうすればいいんですか?

姫野さんは既にその方法を知っているはずですよ。少し考えてみてください。

う~ん……System.out.println(10 + 3);だと計算されちゃうんですよね……。

文字列を表示する方法、ありましたよね?

あっ! もじれつ!! ""を使うんですね!! ということは、System.out.println("10 + 3");って書けば……!!
package pkg;
public class Lesson1 {
public static void main(String[] args) {
//「10 + 3」という文字列を表示
System.out.println("10 + 3");
}
}
実行結果10 + 3

やったー! できました!!

さすがですね! 次は、「10 + 3 = 13」を表示させてみましょう。「13」の部分は、足し算の結果が出るようにしてくださいね。

そんなの簡単ですよ!!System.out.println("10 + 3 = 13");って書くだけじゃないですか!

それ自分で足し算しちゃってるじゃないですか……。「13」のところは、プログラムに計算させます。

なるほどー……そういうことですね。えっと……こんな感じですか??
package pkg;
public class Lesson1 {
public static void main(String[] args) {
//「10 + 3 = 13」と表示
System.out.println("10 + 3 = " + 10 + 3);
}
}
実行結果10 + 3 = 103

あれ~!? 何で103!?

先程、「+」には文字列を結合する役割と、足し算をする役割の両方があるとお伝えしましたよね。それが関係しています。

もしかして、103は「ひゃくさん」じゃなくて、「いちぜろ」と「さん」がくっついて「いちぜろさん」になったってことですか??

そういうことです。Javaでは、基本的に左側から順に計算するという法則があります。

……ってことは、最初に文字列の「"10 + 3 ="」と数字の「3」を足したわけですよね。でもこれって足せなくないですか??

はい。文字列と数値を足し算する場合は、数値側が自動的に文字列に変換されます。この場合は、数値の10が文字列の"10"に変換されて、"10 + 3 = " + "10"とみなされて"10 + 3 = 10"となったわけですね。

うぅ……ややこしい……。

そんなに深刻に考えなくても大丈夫ですよ。計算過程で文字列が足されたらその時点で文字列結合になるというだけのことです。

じゃあ、そのあとは"10 + 3 = 10"に"3"が足されて"10 + 3 = 103"になったってことですね。

そうです! では、これを正しく「10 + 3 = 13」と表示させるには、どうすればいいでしょう?

えっ!? そんなの習ってないですよ??

まだ教えていませんが、簡単です。小学校の算数で、計算の優先順位を変える方法と一緒ですよ。

わかった! ()を付ければいいんですね!
package pkg;
public class Lesson1 {
public static void main(String[] args) {
//「10 + 3」という文字列を表示
System.out.println("10 + 3 = " + 10 + 3);
System.out.println("10 + 3 = " + (10 + 3));
}
}
実行結果10 + 3 = 103
10 + 3 = 13
10 + 3 = 13

できました~!! ちゃんと13になりました!

正解です! おめでとうございます。以下の例も試してみてくださいね。
package pkg;
public class Lesson1 {
public static void main(String[] args) {
//文字列を含む足し算
System.out.println(3 + 5 + "10");
System.out.println(3 + "10" + 5);
System.out.println("10" + 3 + 5);
System.out.println("10" + (3 + 5));
}
}
実行結果810
3105
1035
108
3105
1035
108

なるほど……8行目では、3+5までは普通の足し算だったものの、その後の8+"10"で文字列化したわけですね。

その通りです! うまく「+」を使いこなしてくださいね。

が、頑張ります……。