データ型の使い分け
このレッスンで分かること
- 基本型 (primitive) は
intdoublebooleanchar、参照型の代表はStringintに小数、booleanに数値、charにダブルクォートは型エラー- 最小例は
return name + "/" + age + "歳/" + height + "cm/学生:" + isStudent;
データ型の使い分け とは
Java の基本型 (int, double, boolean, char) と参照型 String の違い、それぞれに入る値の範囲と書き分けのコツを学ぶ。
Java は「型」にこだわる言語
プログラミングを始めたばかりの頃は、「変数は箱で、値を入れるだけ」というイメージを持っていることが多いと思います。Python や JavaScript のような言語では、その理解で大体動いてしまいます。x = 1 と書いたあとに x = "hello" と書き直しても、何も怒られません。
ところが Java は違います。Java は 静的型付け (statically typed) の言語で、変数を作るときに「ここには整数しか入らない」「ここには文字列しか入らない」という宣言を必ず先にします。一度 int x と宣言したら、その後 x に文字列を入れることはできません。コンパイル時にエラーになります。
型は「箱のラベル」だと考えてください。
intというラベルが貼られた箱には整数しか入りません。Stringというラベルなら文字列だけです。最初は窮屈に感じますが、コンパイラが間違いを先に見つけてくれるので、大規模なプログラムでは型は強力な味方になります。
このレッスンでは、Java の主要な 基本型 (primitive types) 4 種と、参照型 (reference types) の代表である String を見ていきます。それぞれの型がどんな値を扱えて、どんな書き方をするのか、整理して覚えていきましょう。
なぜ型が必要なのか
「いちいち型を書くなんて面倒くさい」と思うかもしれません。実際、最初のうちはそう感じます。それでも Java が型にこだわるのには、理由があります。
1 つ目は 速度 です。コンパイラが「ここは int しか入らない」と分かっていれば、メモリ確保のサイズも演算の機械語命令も最初から決められます。Python のように毎回「これは整数かな、文字列かな」と確認する必要がありません。
2 つ目は 安全性 です。int age に文字列を入れようとした瞬間、コンパイラがエラーを出してくれます。プログラムを動かす前に、ミスを発見できるのは大きなメリットです。動かしてから「null でした」「undefined でした」と気づくよりずっと安全です。
3 つ目は 可読性 です。int count String name boolean isActive のように型が書いてあると、コードを読む人が「count は数字、name は文字列、isActive は真偽値」と一目で分かります。
型はコンパイラへのヒントであると同時に、コードを読む人 (未来の自分も含む) へのヒントでもあります。
4 つの基本型 (primitive types)
Java の基本型はいくつかありますが、入門段階で覚えるべき主役は次の 4 つです。
int— 整数。0100-42のような値。約 ±21 億 (32 bit) まで扱えるdouble— 小数を含む数。3.14170.5-0.001のような値boolean— 真偽値。trueかfalseの 2 値のみchar— 1 文字。'A''あ'のように シングルクォート で囲む
書き方の例は次のとおりです。
Java
int age = 20;
double height = 170.5;
boolean isStudent = true;
char grade = 'A';型 → 変数名 → = → 値、という順序は Java の鉄則です。最後に必ず ; でしめます。これは引数を宣言するときも、ローカル変数を作るときも同じ形です。
Java には他にも
long(より大きい整数)、float(より精度の低い小数)、byteshort(小さい整数) などの基本型があります。実務でもよく使うのはintdoublebooleancharの 4 つなので、まずはこの 4 つを完璧にしましょう。
参照型の代表 String
String は文字列を扱う型ですが、int や double のような 基本型ではありません。String は 参照型 (reference type) という分類に入ります。参照型と基本型の違いはちょっと深い話なので、ここでは「String は特別な型で、" (ダブルクォート) で囲んだ文字列を扱える」と覚えるだけで十分です。
Java
String name = "太郎";
String city = "東京";String は大文字始まりなのに対して、int double boolean char は小文字始まりです。これは Java の慣習で、基本型は小文字、参照型 (クラス) は大文字 という区別になっています。
Stringは文字列を扱うクラスです。クラス名は大文字で始まる、というルールが Java にはあります。int/doubleなどの基本型とStringがぱっと見で区別できるのは、この命名規則のおかげです。
型の分類と扱える値
基本型と参照型の関係を、概念図で見ておきましょう。
int double boolean char は値そのものを箱に直接入れるのに対して、String や配列・クラスは「値が置いてある場所への参照 (アドレス)」を箱に入れます。少しずつ理解が深まればいいので、最初は分類だけ覚えておきましょう。
もう少し細かく、4 つの基本型と String がどんな値を扱えるかを表にまとめておきます。
| 型 | 例 | 入れられる値 | 範囲・特徴 |
|---|---|---|---|
int | 20 -100 0 | 整数のみ | 約 ±21 億 (32 bit) まで |
double | 3.14 170.5 -0.001 | 小数を含む数 | 倍精度浮動小数 (64 bit) |
boolean | true false | 真偽値 | この 2 値だけ。1/0 は不可 |
char | 'A' 'あ' | 文字 1 つ | シングルクォートで囲む |
String | "太郎" "Hello" | 文字列 | ダブルクォートで囲む。長さ制限は実質なし |
intの上限を超える値 (例えば100_000_000_000) を扱いたい場合はlong型と数値の末尾のL接尾辞を使います。long population = 8_000_000_000L;のように書きます。
同じ値でも書き方が違う
注目してほしいのは、「形が似ていても書き方は型ごとに違う」 という点です。
Java
char letter = 'A'; // シングルクォート 1 つ
String word = "A"; // ダブルクォートで囲んだ文字列
int count = 1; // そのまま数字
double ratio = 1.0; // 小数点をつけると double
boolean flag = true; // true か false のみ'A' と "A" は見た目は近いですが、Java からすると 完全に別物 です。char は文字 1 個分のデータ、String は文字列という別のクラスのインスタンスです。同様に 1 と 1.0 も int と double で型が違います。
数値リテラルにドットがついていれば
double、ついていなければintとして扱われます。double height = 170;のように右辺がドットなしでも、左辺の型に合わせて自動変換されますが、明示的に170.0と書くほうが意図が伝わります。
よくある間違い
データ型のところで初心者が引っかかりやすいパターンは次のとおりです。
1 つ目は、int に小数を入れる こと。int x = 3.14; はコンパイルエラーになります。int は整数しか受け付けません。小数を入れたいなら double x = 3.14; です。
2 つ目は、boolean に 1 や 0 を入れる こと。C や Python では if (1) のような書き方が通じますが、Java では boolean flag = 1; はエラーです。true か false だけを書きます。
3 つ目は、char にダブルクォートを使う こと。char letter = "A"; はエラーです。char はシングルクォートで囲むのが鉄則です。"A" (ダブル) は String 型の値なので、char の箱には入りません。
4 つ目は、長い整数値に L 接尾辞を忘れる こと。long population = 8000000000; はエラーになります。8_000_000_000 は int の範囲を超えるので、long population = 8000000000L; のように末尾に L (または小文字の l) をつける必要があります。
エラーメッセージで
incompatible typesやpossible lossy conversionが出たら、まず型のミスマッチを疑ってください。たいていはintに小数を入れる、booleanに数値を入れる、charとStringを混同する、のいずれかです。
課題で扱う型たち
このレッスンの課題では、Solution.summarize(String name, int age, double height, boolean isStudent) という、ここまで出てきた 4 種類の型をフル活用するメソッドを作ります。
Java
public static String summarize(String name, int age, double height, boolean isStudent) {
return name + "/" + age + "歳/" + height + "cm/学生:" + isStudent;
}+ 演算子は文字列と他の型をつなげると、他の型を自動的に文字列に変換 してくれます。int の age、double の height、boolean の isStudent がそれぞれ "20" "170.5" "true" のような文字列になって連結されます。これは便利な機能なので、ぜひ覚えておいてください。
ここまでの要点
基本型 4 つ + String、それぞれの書き方とリテラルの違いを押さえる。int に小数、boolean に 1、char にダブルクォートは型エラー。+ 連結で他の型は自動で文字列化される。
やってみよう
まずはエディタを開き、return ""; を上の式に書き換えてみましょう。手順は次のとおりです。
name + "/"で名前と区切り記号をつなげる+ age + "歳/"で年齢と単位をつなげる+ height + "cm/学生:"で身長とラベルをつなげる+ isStudentで真偽値をそのまま連結する- 全体を
returnで返す
書き終わったらテストを実行します。太郎, 20, 170.5, true で "太郎/20歳/170.5cm/学生:true"、花子, 30, 158.0, false で "花子/30歳/158.0cm/学生:false" が返れば成功です。
結果が違うときは、スラッシュの位置、コロンの全角/半角、スペースの有無 を順に確認してください。期待値の "学生:" のコロンは半角です。全角の : にしてしまうと別の文字としてテストが落ちます。
慣れてきたら、double を float に変えてみたり、age を long で受け取ってみたりして、他の型でも同じことができるかを試してみると、型の感覚がさらに身につきます。
よくある質問
Q. Java と他言語の文法はどう違いますか?
A. Java は静的型付けで、変数宣言時に型を明示します(int x = 0;)。中括弧でブロックを表し、文末にセミコロンが必要です。Python の動的型付けや JavaScript の柔軟さに慣れていると最初は窮屈ですが、コンパイル時にバグが発見できる安全性がメリットです。
Q. コードが動かないときに最初に見るべき場所は?
A. コンパイルエラーは行番号とエラー種別(cannot find symbol、incompatible types など)が表示されます。実行時例外はスタックトレースの最初の at ... が原因行です。IDE(IntelliJ / VS Code)の警告も丁寧に潰すと、半分のバグは未然に防げます。
Q. Java の習得後に学ぶべき技術は何ですか?
A. 基本構文を抑えたら java-intermediate(コレクション / ジェネリクス / Stream / 例外)に進み、Spring Boot や Web 開発に展開するのが王道です。クラウド時代は Kotlin / Scala への展開も視野に入りますが、まずは Java 標準を固めるのが効率的です。
次のレッスン
次は 変数とデータ型クイズ で、変数とデータ型クイズ を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- データ型 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. データ型 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- Solution クラスに public static String summarize(String name, int age, double height, boolean isStudent) を実装する
- 引数 4 つを
name + "/" + age + "歳/" + height + "cm/学生:" + isStudentの形式で連結して return する - 区切り文字
/とコロン:は半角を使う (全角は不可)
入出力例
test-cases.txt
summarize("太郎", 20, 170.5, true) → "太郎/20歳/170.5cm/学生:true"
summarize("花子", 30, 158, false) → "花子/30歳/158.0cm/学生:false"
summarize("Bob", 25, 180.2, true) → "Bob/25歳/180.2cm/学生:true"