02_クラスとmain

対象:C言語経験者 / クラスの概念・main の構造・出力メソッドを理解します


■ 1. C言語との比較

HelloWorldを見ながら、C言語と何が違うかを確認しましょう。

C言語(hello.c)
#include <stdio.h>

int main(void) {
    printf("Hello!\n");
    return 0;
}
Java(HelloWorld.java)
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello!");
    }
}

一番目立つ違いは「クラスで囲まれています」こと。Javaではすべてのコードをクラスの中に書く。


■ 2. クラスとは(今の段階では)

クラスはこの授業の後半で詳しく学ぶ。今の段階では「プログラムを入れる箱」と考えてください。

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello!"); ← ここに処理を書く } } クラス メソッド
クラスの中にmainメソッドがあり、その中に処理を書く
C言語は関数をファイルに直接書ける。Javaは必ずクラスの中に書く。
今の段階では「クラス = ファイル1つ分の入れ物」と理解しておけばOK。

● クラス名とファイル名のルール

ルール
クラス名とファイル名(拡張子除く)は完全一致(大文字小文字も)HelloWorld.javapublic class HelloWorld
クラス名は大文字始まりが慣習(Javaの命名規則)HelloWorld, Calculation
クラス名は数字始まり不可01Hello はエラー → フォルダで番号管理

■ 3. mainメソッドの構造

Javaのmainは呪文のように見えるが、1つずつ意味があります。

public static void main( String[] args) { どこからでも 呼び出せる インスタンス 不要で呼べる 戻り値 なし メソッド名 (入口) コマンドライン引数 (文字列の配列)
今は全部を深く理解しなくてよい。staticpublicは後の単元で詳しく学ぶ
C言語の main
int main(void) {
    /* 処理 */
    return 0;
}
Javaの main
public static void main(String[] args) {
    // 処理
    // return不要(voidだから)
}
C言語Java
関数/メソッドの場所ファイルに直接書くクラスの中に書く
戻り値int(return 0)void(return不要)
引数void または int argc, char *argv[]String[] args(常にこの形)
コメント/* */ のみ// /* *//** */ の3種類

■ 4. 出力メソッド

C言語の printf に相当するものが3種類あります。

● println の「ln」とは

printlnprint + ln の組み合わせ。

部分意味
print印字する・出力します
lnline(行)の略。「1行分出力して改行」という意味
println = 「1行出力して次の行へ」。print だけだと改行しない。
C言語の printf("...\n")printf("...") の違いと同じ発想。

● 3種類の出力メソッド

メソッド動作C言語で言うと
System.out.println(x)xを出力して改行しますprintf("%s\n", x) に相当
System.out.print(x)xを出力。改行しないprintf("%s", x) に相当
System.out.printf(書式, x)書式指定して出力。改行は\nprintf とほぼ同じ
System.out は長い。C言語の printf と違って毎回書く必要があります。これはJavaの仕様。

● 文字列の連結(+ 演算子)

Javaでは + を文字列に使うと、文字列同士をつなげることができます。

String a = "Hello";
String b = "World";
System.out.println(a + " " + b);  // → Hello World

さらに、文字列と数値を + でつなぐと、数値が自動で文字列に変換されます。

int x = 10;
System.out.println("xの値は: " + x);  // → xの値は: 10
C言語では printf("xの値は: %d", x) と書く必要があった。
Javaでは "文字列" + 変数 と書けるため、単純な出力なら printf を使わなくてよい。
落とし穴:数値同士を計算したいときはカッコが必要。
int a = 3;
System.out.println("結果: " + a + 2);    // → 結果: 32  ← 文字列連結が先に起きる
System.out.println("結果: " + (a + 2));  // → 結果: 5   ← カッコで計算を先に
"結果: " + 3"結果: 3"(文字列)になり、その後 + 2 がまた文字列連結になってしまう。

■ 実習1:出力の違いを確認します

実習1

02_Output フォルダに Output.java を作って実行しましょう。

public class Output {
    public static void main(String[] args) {

        // println:出力して改行
        System.out.println("1行目");
        System.out.println("2行目");

        // print:改行しない
        System.out.print("A");
        System.out.print("B");
        System.out.print("C");
        System.out.println(); // 改行だけ

        // 文字列 + 数値 → 自動で文字列に変換して連結される
        int x = 10;
        System.out.println("xの値は: " + x);
        System.out.println("計算結果: " + (x * 2));  // カッコで計算を先に行う

        // printf:書式指定
        System.out.printf("整数: %d%n", x);
        System.out.printf("小数: %.2f%n", 3.14159);
    }
}

実行結果:

1行目 2行目 ABC xの値は: 10 計算結果: 20 整数: 10 小数: 3.14

● 確認ポイント

「計算結果: " + (x * 2)」のカッコはなぜ必要か?

上の「文字列の連結」で説明したとおり、"文字列" + 数値 + 数値 は左から順に文字列連結になります。

"計算結果: " + x * 2*+ より優先順位が高いので 10 * 2 = 20 が先に計算され、たまたま意図通りになります。

しかし "計算結果: " + x + 2 と書くと "計算結果: 102" になってしまう。カッコで明示しますのが安全な習慣。

printfの %n\n の違いは?

\n は改行文字(Unix系では LF)。%n は実行環境に合った改行コード(WindowsではCRLF)を自動で選ぶ。

試験では \n が使われることが多い。実際のコードでは %n が推奨されることもあります。

printlnに何も渡さないとどうなる?

System.out.println() は引数なしで呼べる。改行だけ出力されます。


■ 実習2:変数と出力を組み合わせる

実習2

03_Profile フォルダに Profile.java を作って実行しましょう。

変数に値を入れて、自己紹介文を出力するプログラムを作る。

public class Profile {
    public static void main(String[] args) {

        // 変数の宣言と代入(C言語とほぼ同じ)
        String name = "Taro";   // 文字列はStringを使う
        int age = 20;
        double height = 170.5;
        boolean isStudent = true;

        // 出力
        System.out.println("=== 自己紹介 ===");
        System.out.println("名前: " + name);
        System.out.println("年齢: " + age);
        System.out.printf("身長: %.1f cm%n", height);
        System.out.println("学生: " + isStudent);
    }
}

実行結果:

=== 自己紹介 === 名前: Taro 年齢: 20 身長: 170.5 cm 学生: true

● C言語との型の比較

C言語Java違い
char name[]
またはchar *name
String nameJavaでは文字列はString型(クラス)。ポインタ不要。
intintほぼ同じ。Javaでは常に32ビット。
doubledouble同じ。
int(0か1)booleanJavaにはboolean型があります。値はtrue/false
Stringは大文字始まりに注意。stringではエラーになります。
StringはC言語にはないJava独自の型(正確にはクラス)。文字配列をポインタで扱う必要がない。

● 試してみましょう

isStudentをprintlnで出力すると「true」と表示される理由

boolean型を文字列に連結すると、自動的に"true""false"の文字列に変換されます。

C言語ではintを使って0/1で表現していたのと対比しましょう。

String name = "Taro"; の「"」はダブルクォートが必要。なぜ?

Javaでは'A'(シングルクォート)は1文字のchar型。"Taro"(ダブルクォート)が文字列(String)。

C言語と同じルール。


■ 5. コメントの種類(試験頻出)

// 1行コメント(C言語にもある)

/* 複数行コメント
   C言語にもある */

/** JavaDocコメント
 *  ドキュメント生成ツール用。Javaだけにある。
 *  クラスやメソッドの説明を書く。
 */
試験では「Javaのコメントは // の1種類だけ」という誤りの選択肢がよく出る。3種類あることを覚えておく。

■ 試験(問1・問3)との対応

頻出ポイント

よく問われること正しい答え
最初に呼び出されるメソッドmainメソッド
コメントの種類3種類// / /* */ / /** */
printlnprintの違いprintlnは改行あり、printは改行なし
booleanの値trueまたはfalse(C言語の0/1ではない)
文字列の型String(大文字始まり)
練習問題:次のプログラムの出力を答えよ
public class Q {
    public static void main(String[] args) {
        System.out.print("A");
        System.out.print("B");
        System.out.println("C");
        System.out.println("D");
    }
}

答え:

ABC D

理由:print は改行しないため A・B・C が繋がる。printlnで改行。次の println で D が出力されて改行。

練習問題2:次のプログラムの出力を答えよ
public class Q2 {
    public static void main(String[] args) {
        int a = 3;
        System.out.println("答え: " + a + 2);
        System.out.println("答え: " + (a + 2));
    }
}

答え:

答え: 32 答え: 5

理由:1行目は "答え: " + 3"答え: 3"になり、さらに + 2 で文字列連結になり "答え: 32"
2行目はカッコで先に計算するため 3 + 2 = 5 になってから文字列連結。


■ まとめ

ポイント内容
クラスプログラムを入れる箱。ファイル名と一致させる。
mainJVMが最初に呼び出す入口。形は決まっています。
println出力+改行。一番よく使います。
print出力のみ(改行なし)。
printf書式指定。%d%f%s など。
String文字列型。大文字始まり。C言語のchar配列に相当。
booleanC言語にはない。true/falseを持ちます。
コメント///* *//** */ の3種類。