0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コンピュータサイエンス学び直し -プリミティブ型について-

Posted at

1. はじめに

エンジニアとして3年が経過しようとしている中、技術を使ってより高度な問題解決をしていくためには、フレームワークや言語に依存しない基礎となる知識が必要だと感じたため、CSを勉強し直しています。
その学習内容を備忘録として発信します。
今回はプリミティブ型についてです。

2. 言語別のプリミティブ型

プログラミング言語には、基本的なデータ型(プリミティブ型)が定義されています。以下の表は、主要な言語におけるプリミティブ型を整理したものです。

言語 ブーリアン型 文字型 文字列型 整数型 浮動小数点型
Ruby true/false なし (String を使用) String Integer Float
PHP bool なし (string を使用) string int float
Python bool なし (str を使用) str int float
JavaScript boolean なし (string を使用) string number (整数としても扱える) number
Java boolean char String byte, short, int, long float, double

3. Javaで char 型と String 型を区別している理由

Javaでは char 型と String 型を明確に区別しています。これにはいくつかの理由があります。

メモリ効率の向上

  • char2 バイト(16ビット) の固定サイズ。
  • Stringオブジェクト であり、可変長のデータを持つため、1文字を String で扱うと無駄なメモリを消費する。

処理速度の向上

  • char はプリミティブ型であり、直接メモリ上の値を比較 できるため、高速。
  • String はオブジェクトであり、比較時に equals() メソッドを使う必要があるため、オーバーヘッド が発生する。

意図の明確化

  • char を使用すると 「1文字を扱う」 という意図が明確になる。
  • String複数文字を扱う場合 に使用され、コードの可読性が向上する。

不変性(Immutable)の違い

  • String変更不可(immutable) であり、新しい値を代入すると新しいオブジェクトが作成される。
  • char は単なる値なので、変更してもオブジェクトの作成は発生しない。

4. Java以外の言語で char 型と String 型を区別していない理由

一方で、Ruby, PHP, Python, JavaScript などの言語では char 型を独立したプリミティブ型として用意していません。その理由は以下の通りです。

文字を特別扱いする必要がない

  • これらの言語では 文字も単なる短い文字列 として扱う。
  • 文字列操作が頻繁に行われるため、charString を統一したほうがシンプルになる。

オブジェクト指向の設計が優先

  • Python や Ruby では、すべてのデータがオブジェクトであり、プリミティブ型をできるだけ減らす方針。
  • 文字も文字列オブジェクトの一部 として扱うほうが一貫性がある。

パフォーマンスの最適化が自動化されている

  • JavaScript では JIT(Just-In-Time)コンパイラ によって、必要に応じて最適化が行われる。
  • Python や Ruby でも内部的に効率化されており、char 型を独立させるメリットが少ない。

5. 処理のオーバーヘッドとは

オーバーヘッドの定義

オーバーヘッド(overhead) とは、本来の処理を実行するために発生する 追加の処理負荷 のことを指します。プログラムの実行速度やメモリ使用量に影響を与える要因となります。

オーバーヘッドの具体例

1. オブジェクトの参照によるオーバーヘッド

char は直接値を持ちますが、String はオブジェクトなので、メモリ上のデータを参照する処理 が発生します。

char a = 'A';
char b = 'B';
if (a == b) { // 直接比較できる
    System.out.println("Same");
}

String s1 = "A";
String s2 = "B";
if (s1.equals(s2)) { // 参照をたどって比較(オーバーヘッドあり)
    System.out.println("Same");
}

2. メソッド呼び出しによるオーバーヘッド

メソッドを呼び出すと、スタックメモリの操作 が発生し、処理が遅くなります。

public static int add(int a, int b) {
    return a + b; // オーバーヘッドが少ない
}

int result = 10 + 20; // メソッドを使わないことでオーバーヘッド削減

3. ガベージコレクション(GC)のオーバーヘッド

大量の String オブジェクトを生成すると、GC(ガベージコレクタ) が頻繁に動作し、プログラムの動作が遅くなります。

for (int i = 0; i < 100000; i++) {
    String s = new String("Hello"); // GC の負担増大
}

オーバーヘッドを減らす方法

オーバーヘッドの原因 改善策
オブジェクトの参照 プリミティブ型を使用する (char など)
メソッド呼び出し シンプルな処理は直接記述(インライン化)
メモリ管理(GC) StringBuilder を使い、不要なオブジェクトを減らす

Javaでは charString を明確に区別 し、オーバーヘッドを抑えることで効率的な処理が可能になります。
一方、他の言語では 言語設計や最適化技術 によって、char 型を区別する必要がなくなっています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?