コンテンツにスキップ

Java/基礎/型

出典: フリー教科書『ウィキブックス(Wikibooks)』

型 (データ型)

[編集]

プログラミングにおける「型」または「データ型」は、データの種類や性質を示す概念です。各プログラミング言語では、変数、関数の引数や戻り値、オブジェクトなどに特定の型が割り当てられ、その型がデータの扱い方、演算方法、メモリ管理を決定します。

型の役割

[編集]

型は以下のような重要な役割を持っています:

  1. データの性質を表現する
    型はデータの性質を定義します。たとえば、整数型は整数の値を、文字列型は文字列のシーケンスを表します。
  2. メモリの割り当てと管理
    型は、データがメモリ上でどのように格納されるかを定義し、適切なメモリの管理を可能にします。
  3. 演算と操作の定義
    型によって、そのデータに対して可能な演算や操作が決まります。例えば、整数型では算術演算が可能で、文字列型では結合や比較が可能です。
  4. プログラムの正確性と安全性の確保
    型システムはプログラムの正確性と安全性を保証し、不適切な型の操作を防止します。

Javaにおける型

[編集]

Javaでは型は主に以下の3種類に分類されます:

プリミティブ型 (Primitive Types)
プリミティブ型は、データそのものを格納する基本的な型です。これには、整数型(byteshortintlong)、浮動小数点型(floatdouble)、論理型(boolean)、文字型(char)が含まれます。
クラス型 (Class Types)
クラス型は、オブジェクトへの参照を格納する型です。Javaでは、クラスやインタフェースを使用してユーザーが独自のデータ型を定義できます。
配列型 (Array Types)
配列型は、同じ型の複数の要素を格納するための型です。Javaの配列はオブジェクトとして管理され、配列型変数は配列への参照を保持します。

値型と参照型

[編集]

Javaの型はさらに「値型」と「参照型」に分けることができます。

値型 (Value Types)
値型は、変数が実際のデータの値を直接保持する型です。プリミティブ型(intbooleanなど)は値型に分類されます。
参照型 (Reference Types)
参照型は、変数がデータへの参照を保持する型です。クラス型や配列型は参照型に分類されます。参照型はヒープ領域にデータを格納し、変数はそのデータへの参照を保持します。

プリミティブ型

[編集]

プリミティブ型は、Javaの基本的なデータ型で、以下の8つの型があります。

プリミティブ型
データ型 サイズ (ビット数) 値の範囲 ラッパークラス
boolean 1 true または false Boolean
byte 8 -128 から 127 Byte
short 16 -32768 から 32767 Short
int 32 -2147483648 から 2147483647 Integer
long 64 -9223372036854775808 から 9223372036854775807 Long
float 32 IEEE 754 単精度浮動小数点数 Float
double 64 IEEE 754 倍精度浮動小数点数 Double
char 16 UTF-16の16ビット分(サロゲートペアを使って16ビット以上のUnicodeも表現可能) Character
型の名前、説明、リテラル表現
型の名前 説明 リテラル表現
boolean 真偽値を表す型。値は true または false のいずれか。 true, false
byte 8ビットの符号付き整数型。範囲は -128 から 127。 0, -128, 127
short 16ビットの符号付き整数型。範囲は -32768 から 32767。 0, -32768, 32767
int 32ビットの符号付き整数型。範囲は -2147483648 から 2147483647。 0, -2147483648, 2147483647
long 64ビットの符号付き整数型。範囲は -9223372036854775808 から 9223372036854775807。 0L, -9223372036854775808L, 9223372036854775807L
float 32ビットの単精度浮動小数点型。IEEE 754に基づく。 0.0f, 3.14f, -2.71f
double 64ビットの倍精度浮動小数点型。IEEE 754に基づく。 0.0, 3.14, -2.71
char 16ビットのUnicode文字型。1つの文字を表す。 'A', '1', 'あ'
String 文字列型。複数の文字を順序付けて格納する参照型。 "Hello", "Java"
Object すべてのクラスの基底型。すべてのオブジェクト型は Object 型から派生する。 new Object(), new Person()
配列型 (Array) 同じ型の複数の要素を格納する型。要素の型は任意。 {1, 2, 3}, {"Hello", "World"}, {new Person(), new Person()}


プリミティブ型は、データそのものを格納し、計算や処理に利用されます。int型とdouble型で計算を行うと、Javaは自動的に型変換を行い、int型の値をdouble型に変換します。これにより、精度の低下や情報の欠落が発生する場合があるため、注意が必要です。

参照型

[編集]

参照型は、データへの参照を格納する型です。主にクラス型や配列型が該当します。

クラス型 (Class Types)
クラス型は、ユーザー定義のデータ型です。Javaでは、クラスを使って独自のオブジェクトを作成し、それに対して操作を行います。
配列型 (Array Types)
配列型は、同じ型の複数の値を格納するためのオブジェクト型です。配列は固定長ですが、コレクションフレームワークを使用すると可変長リストとして使用することもできます。
参照渡しと値渡し
プリミティブ型は「値渡し」され、参照型は「参照渡し」されます。値渡しでは変数のコピーが渡されるため、元のデータは変更されません。参照渡しでは、変数がオブジェクトの参照を渡すため、元のオブジェクトが変更される可能性があります。

ラッパークラス

[編集]

Javaにおける ラッパークラス (Wrapper Class) とは、プリミティブ型(基本データ型)をオブジェクトとして扱うためのクラスです。プリミティブ型はオブジェクトではないため、クラスやメソッドで扱う際に不便なことがあります。ラッパークラスは、これらプリミティブ型の値をオブジェクトとして扱うための手段を提供します。

ラッパークラスの特徴:
  • オブジェクト化: プリミティブ型の値をオブジェクトとして扱うことができるため、コレクション(例:ArrayList)などのオブジェクトを格納するデータ構造にプリミティブ型の値を保存できます。
  • メソッドの利用: ラッパークラスには、プリミティブ型に対する操作を行うメソッド(例えば、数値を文字列に変換するメソッドや、文字列を数値に変換するメソッド)があります。
プリミティブ型とそのラッパークラスの対応:
プリミティブ型 ラッパークラス 主なメソッド例
boolean Boolean parseBoolean, toString
byte Byte parseByte, toString
short Short parseShort, toString
int Integer parseInt, toString, valueOf
long Long parseLong, toString
float Float parseFloat, toString, isNaN
double Double parseDouble, toString, isNaN
char Character toString, isDigit
ラッパークラスの主なメソッド:
  • parseXxx(String s):文字列を指定したプリミティブ型の値に変換します。例えば、Integer.parseInt("10") は文字列 "10" を整数 10 に変換します。
  • toString():ラッパークラスのインスタンスの値を文字列に変換します。
  • valueOf():文字列や他のオブジェクトを使ってラッパークラスのインスタンスを作成します。
自動ボクシングとアンボクシング:
  • 自動ボクシング (Autoboxing): プリミティブ型の値をラッパークラスのインスタンスに自動的に変換する機能。例えば、int 型の値を Integer 型に自動的に変換できます。
  Integer i = 10;  // int -> Integer (自動ボクシング)
  • 自動アンボクシング (Unboxing): ラッパークラスのインスタンスを対応するプリミティブ型に自動的に変換する機能。例えば、Integer 型の値を int 型に自動的に変換できます。
  int j = i;  // Integer -> int (自動アンボクシング)
使用例:
public class WrapperExample {
    public static void main(String[] args) {
        // ボクシング: プリミティブ型 -> ラッパークラス
        Integer num = Integer.valueOf(10);
        
        // アンボクシング: ラッパークラス -> プリミティブ型
        int primitiveNum = num.intValue();
        
        // 自動ボクシング
        Integer autoBoxed = 25;
        
        // 自動アンボクシング
        int autoUnboxed = autoBoxed;
        
        // ラッパークラスのメソッドを利用
        String str = Integer.toString(100);  // 数値を文字列に変換
        System.out.println(str);  // 出力: "100"
        
        // 文字列から数値に変換
        int parsedNum = Integer.parseInt("200");
        System.out.println(parsedNum);  // 出力: 200
    }
}
ラッパークラスを使用する場面:
  1. コレクションに格納: Javaのコレクション(例えば ArrayList)はオブジェクトのみを格納できるため、プリミティブ型をラッパークラスに変換して格納します。
       List<Integer> list = new ArrayList<>();
       list.add(1);  // 自動ボクシングにより、int 1 が Integer に変換される
    
    メソッドの引数や戻り値として: 一部のメソッドではオブジェクトを受け取る必要があるため、プリミティブ型をラッパークラスに変換して使用します。

ラッパークラスを使うことで、プリミティブ型の値をオブジェクトとして扱うことができ、柔軟なプログラム設計が可能になります。