C言語からJavaへ

次のように、3つの入力の合計を計算して表示するプログラムで、C言語とJavaを比較します。 なお、がキー入力です。

a=3
b=5
c=4
a+b+c=12
C言語Java
#include <stdio.h>


int v1, v2, v3;
	
main(int argc, char *argv[])
{

	printf("a=");
	fscanf( stdin , "%d" , & v1);
	printf("b=");
	fscanf( stdin , "%d" , & v2);
	printf("c=");
	fscanf( stdin , "%d" , & v2);
	printf("a+b+c=%d" , v1 + v2 + v3 );
}

                 
import java.util.Scanner;
public class JTest01
{
	public static int v1, v2, v3;
	
	public static void main(String[] arg)
	{
		Scanner stdin = new Scanner(System.in);
		System.out.print("a=");
		v1 = stdin.nextInt();
		System.out.print("b=");
		v2 = stdin.nextInt();
		System.out.print("c=");
		v3 = stdin.nextInt();
		System.out.print("a+b+c=" + (v1 + v2 + v3));
	}
}
                 

Javaでは、関数mainをクラスの中に書きます。
クラスの範囲は、class クラス名 { と、} で、この中にmainを書きます。
クラス名の部分 は、JTest01 になっています。
public が付くクラスは、ソースファイルの中に一つしか書けません。そして、publicクラスの名前と同じ名前で、 ソースファイルを作らなくてはならない規則があります。
よって、このJavaのソースファイル名は、JTest01.javaで作成しなければなりません。

C言語では、グローバル変数としてv1,v2,v3を宣言し、グローバル関数としてmainを定義しています。
対してJavaは、情報や関数の入れ物となる『クラス』と呼ばれるものを使わないと、変数や関数が作れません。 ここでは、JTest01のクラスの中に作っています。 Javaでは、C言語のようなグローバル変数や関数は存在しません。必ずクラスに属する作り方となります。 ここでは、JTest01の中でmain関数を作る形態で、mainの先頭書式は必ず次のようにします。
public static void main(String[] arg)
  (argだけは仮引数の名前なのでネーミングは自由)

C言語のprintf("a="); と同じ機能を、
Javaでは、System.out.print("a=");で実現しています。
print()の中では、基本的な種類のデータすべてを 書けます。しかし、C言語のように複数のデータをコンマで並べる仕様になっていません。 一つのデータ(式)を表現します。

C言語のfscanf( stdin , "%d" , & v1); と同じ機能を、
Javaでは、v1 = stdin.nextInt();で実現しています。

ここでC言語のstdinは、標準入力(キー入力)のストリームで、fscanfはグローバル関数です。

対してJavaでは、この機能を持つオブジェクトを変数stdinに管理させて、処理させています。
オブジェクトとは、情報や機能を持つ記憶域と考えるとよいでしょう。
このstdinは、その記憶域を管理しているオブジェクト参照変数です。
そして、この変数stdinは、このmainの先頭で、 Scannerクラスの型の種類で宣言され、初期化しています。
 
Scannerのクラスという用語がでてきましたが、 Javaでは、たくさんの機能が使えるクラスがすでに用意されていて、 Scannerはそのクラスの一つということになります。
利用する形態はいくつかありますが、ここではnew演算子で作ったオブジェクトを stdin変数に管理させ、その機能の一つであるnextInt()を、
v1 = stdin. nextInt(); のように、ドット . の演算子で 選択して、実行させています。
nextIntはメソッドと呼ばれるもので、Scannerには他にもたくさんのメソッドが存在します。 そのいくつかを以下で紹介します。(各種類の変数vがあるとした場合です。)

対応するC言語命令

Scannerのメソッド
stdinは、Scannerオブジェクトを意味しています)

fscanf( stdin , "%d" , & v);v=stdin.nextInt()
fscanf( stdin , "%lf" , & v);v=stdin.nextDouble()
gets(charの配列 );文字列変数=stdin.nextLine()
fscanf( stdin , "%c" , & v);v=stdin.nextByte()
fscanf( stdin , "%hd" , & v);v=stdin.nextShort()
fscanf( stdin , "%f" , & v);v=stdin.nextFloat()
fscanf( stdin , "%s" , & v);v=stdin.next()

なお、Scannerクラスのように、既存のクラスを利用する場合、先頭行でimport指定が必要です。
これは、java.utilに属するScannerを使う宣言のようなものです。