データ型の使い分け

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • 基本型 (primitive) は int double boolean char、参照型の代表は String
  • int に小数、boolean に数値、char にダブルクォートは型エラー
  • 最小例は return name + "/" + age + "歳/" + height + "cm/学生:" + isStudent;

データ型の使い分け とは

Java の基本型 (int, double, boolean, char) と参照型 String の違い、それぞれに入る値の範囲と書き分けのコツを学ぶ。

Java は「型」にこだわる言語

プログラミングを始めたばかりの頃は、「変数は箱で、値を入れるだけ」というイメージを持っていることが多いと思います。PythonJavaScript のような言語では、その理解で大体動いてしまいます。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 — 整数。0 100 -42 のような値。約 ±21 億 (32 bit) まで扱える
  • double — 小数を含む数。3.14 170.5 -0.001 のような値
  • boolean — 真偽値。truefalse の 2 値のみ
  • char — 1 文字。'A' 'あ' のように シングルクォート で囲む

書き方の例は次のとおりです。

Java

int age = 20; double height = 170.5; boolean isStudent = true; char grade = 'A';

型 → 変数名 → = → 値、という順序は Java の鉄則です。最後に必ず ; でしめます。これは引数を宣言するときも、ローカル変数を作るときも同じ形です。

Java には他にも long (より大きい整数)、float (より精度の低い小数)、byte short (小さい整数) などの基本型があります。実務でもよく使うのは int double boolean char の 4 つなので、まずはこの 4 つを完璧にしましょう。

参照型の代表 String

String は文字列を扱う型ですが、intdouble のような 基本型ではありませんString参照型 (reference type) という分類に入ります。参照型と基本型の違いはちょっと深い話なので、ここでは「String は特別な型で、" (ダブルクォート) で囲んだ文字列を扱える」と覚えるだけで十分です。

Java

String name = "太郎"; String city = "東京";

String は大文字始まりなのに対して、int double boolean char は小文字始まりです。これは Java の慣習で、基本型は小文字、参照型 (クラス) は大文字 という区別になっています。

String は文字列を扱うクラスです。クラス名は大文字で始まる、というルールが Java にはあります。int/double などの基本型と String がぱっと見で区別できるのは、この命名規則のおかげです。

型の分類と扱える値

基本型と参照型の関係を、概念図で見ておきましょう。

diagram (will load when visible)

int double boolean char は値そのものを箱に直接入れるのに対して、String や配列・クラスは「値が置いてある場所への参照 (アドレス)」を箱に入れます。少しずつ理解が深まればいいので、最初は分類だけ覚えておきましょう。

もう少し細かく、4 つの基本型と String がどんな値を扱えるかを表にまとめておきます。

入れられる値範囲・特徴
int20 -100 0整数のみ約 ±21 億 (32 bit) まで
double3.14 170.5 -0.001小数を含む数倍精度浮動小数 (64 bit)
booleantrue 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 は文字列という別のクラスのインスタンスです。同様に 11.0intdouble で型が違います。

数値リテラルにドットがついていれば double、ついていなければ int として扱われます。double height = 170; のように右辺がドットなしでも、左辺の型に合わせて自動変換されますが、明示的に 170.0 と書くほうが意図が伝わります。

よくある間違い

データ型のところで初心者が引っかかりやすいパターンは次のとおりです。

1 つ目は、int に小数を入れる こと。int x = 3.14; はコンパイルエラーになります。int は整数しか受け付けません。小数を入れたいなら double x = 3.14; です。

2 つ目は、boolean10 を入れる こと。CPython では if (1) のような書き方が通じますが、Java では boolean flag = 1; はエラーです。truefalse だけを書きます。

3 つ目は、char にダブルクォートを使う こと。char letter = "A"; はエラーです。char はシングルクォートで囲むのが鉄則です。"A" (ダブル) は String 型の値なので、char の箱には入りません。

4 つ目は、長い整数値に L 接尾辞を忘れる こと。long population = 8000000000; はエラーになります。8_000_000_000int の範囲を超えるので、long population = 8000000000L; のように末尾に L (または小文字の l) をつける必要があります。

エラーメッセージで incompatible typespossible lossy conversion が出たら、まず型のミスマッチを疑ってください。たいていは int に小数を入れる、boolean に数値を入れる、charString を混同する、のいずれかです。

課題で扱う型たち

このレッスンの課題では、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; }

+ 演算子は文字列と他の型をつなげると、他の型を自動的に文字列に変換 してくれます。intagedoubleheightbooleanisStudent がそれぞれ "20" "170.5" "true" のような文字列になって連結されます。これは便利な機能なので、ぜひ覚えておいてください。

この章のポイント

ここまでの要点 基本型 4 つ + String、それぞれの書き方とリテラルの違いを押さえる。int に小数、boolean1char にダブルクォートは型エラー。+ 連結で他の型は自動で文字列化される。

やってみよう

まずはエディタを開き、return ""; を上の式に書き換えてみましょう。手順は次のとおりです。

  1. name + "/" で名前と区切り記号をつなげる
  2. + age + "歳/" で年齢と単位をつなげる
  3. + height + "cm/学生:" で身長とラベルをつなげる
  4. + isStudent で真偽値をそのまま連結する
  5. 全体を return で返す

書き終わったらテストを実行します。太郎, 20, 170.5, true"太郎/20歳/170.5cm/学生:true"花子, 30, 158.0, false"花子/30歳/158.0cm/学生:false" が返れば成功です。

結果が違うときは、スラッシュの位置コロンの全角/半角スペースの有無 を順に確認してください。期待値の "学生:" のコロンは半角です。全角の にしてしまうと別の文字としてテストが落ちます。

慣れてきたら、doublefloat に変えてみたり、agelong で受け取ってみたりして、他の型でも同じことができるかを試してみると、型の感覚がさらに身につきます。

よくある質問

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 つができることを確認しましょう。

  1. データ型 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. データ型 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. Solution クラスに public static String summarize(String name, int age, double height, boolean isStudent) を実装する
  2. 引数 4 つを name + "/" + age + "歳/" + height + "cm/学生:" + isStudent の形式で連結して return する
  3. 区切り文字 / とコロン : は半角を使う (全角は不可)

入出力例

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"

ヒント

main.java
main.java
学習モード

メモ

データ型の使い分け

⌘S で保存