char型とString型の使い方

Javaで文字を扱う際は、「char」型もしくは「String」型を使います。char型は1文字だけを表すのに対して、String型は複数文字(文字列)を表すことができます。char型とString型の違いを良く理解しましょう。

char型とString型の取り扱い 目次

  1. char型とは
  2. ユニコードエスケープとは
  3. エスケープシーケンス
  4. String型とは

1.char型とは

char型とは、1文字を格納できるデータ型です。文字と言っても「あ」や「い」のような文字の字形を格納している訳ではありません。文字コードと言って、コンピュータで文字を扱う際は、一つ一つの文字を番号で表します。

文字コードの話をするとそれだけで本が一冊書けてしまうくらい膨大なので省略しますが、Javaの文字コードはUnicodeです。一つ一つの文字を0~65535までの番号に当てはめて表現します。ですので、char型は16ビット(2バイト)の符号なし整数となります。

例えば、アルファベット大文字の「A」は、Unicodeの文字コードでは「61」(16進数表記で0x41)となります。プログラムで「A」を表現する場合は、「A」と書いても良いし、0x41(もしくは61)番を指定しても同じ結果になります。

package pac01;

public class HelloWorld {
	public static void main(String[] args) {
		char  chrHensu1 = 'A';		// Aをそのまま代入
		char  chrHensu2 = 0x0041;	// 0x0041を指定
		char  chrHensu3 = 65;		// 65を指定
		
		System.out.println(chrHensu1);
		System.out.println(chrHensu2);
		System.out.println(chrHensu3);
	}
}
-----------------------------------------------------------------
A
A
A

char型の表現

どの書き方でも、結果は同じ「A」という文字が表示されていることが分かります。

2.ユニコードエスケープとは

ユニコードエスケープとは、16進数で文字コードを指定した際に、その16進数の数字を文字で記述した際に、Unicodeの文字コードであることを明示する為の書き方です。

具体的には、「\u」と書くことで、その後ろに続けて書いた16進数の数字を、文字として記述できます。ちなみに、環境によっては円マークを入力するとバックスラッシュになる場合がありますが、どちらも同じ意味です。

ユニコードエスケープ1

package pac01;

public class HelloWorld {
	public static void main(String[] args) {
		char  chrHensu = '\u0041';

		System.out.println(chrHensu);
	}
}
-----------------------------------------------------------------
A

ユニコードエスケープ2

”で囲んでいるので文字と見なされるが、先頭に\uが付いているので16進数の文字を指定しているとみなしてくれているので、結果は「A」が表示されていることが分かります。

とは言うものの、特段の理由が無ければ普通に’A’と書きましょう。

3.エスケープシーケンス

ユニコードエスケープもそうですが、エスケープとは直訳すると「逃亡」という意味なのですが、このように特定の文字を回避する違う解釈に変える等の制御をする制御文字のことを「エスケープシーケンス」と言います。

例えばchar型の文字は「’」で囲む必要がありますが、それでは「’」を文字として出力したい場合はどうしようもないですよね。普通に「’」が出現すると、Javaは「あっ’が来たということは、char型の文字が開始または終了するんだな」という解釈をしてしまいます。

これを回避して、「いや普通に’を文字として出力したいんだ」ということを表す文字を指定する必要があります。これがエスケープシーケンスなのですが、ユニコードエスケープもその一つで、「次から始まる文字はUnicodeの文字コードだよ!」ということを表すのに使います。

例えば「’」を文字として認識させたい場合は、「\’」とします。「”」を文字として認識させたい場合は、「\”」とします。

package pac01;

public class HelloWorld {
	public static void main(String[] args) {
		char chrHensu1 = '\'';
		String strHensu2 = "\"";

		System.out.println(chrHensu1);
		System.out.println(strHensu2);
	}
}
------------------------------------------------------
'
"

「’」や「”」が文字として出力できていることが分かります。その他にエスケープシーケンスそのものが意味を表すものもあります。以下は代表的なエスケープシーケンスの一覧です。

<代表的なエスケープシーケンス>
エスケープシーケンス
\t タブ
\n 改行
\” ダブルコーテーション(“)
\’ シングルコーテーション(‘)
\\ 円マーク(\)自身

4.String型とは

String型は、複数の文字を格納できるデータ型です。1文字でも2文字でもそれ以上でも大丈夫です。char型の時は、文字を「’」で囲みましたが、String型の場合は文字列を「”」で囲むという違いがあります。

「’」で囲んだ文字をString型の変数に格納しようとしてもエラーになります。

package pac01;

public class HelloWorld {
	public static void main(String[] args) {
		String strHensu1 = 'A';

		System.out.println(chrHensu);
	}
}
------------------------------------------------------------------------------
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	型の不一致: char から String には変換できません
	chrHensu を変数に解決できません

	at pac01.HelloWorld.main(HelloWorld.java:5)

char型の値をStringに変換できない(代入しようとした時に自動型変換されている)というエラーが出ています。これは、「’」で囲んだ文字はあくまでchar型の変数だとみなされ、「”」で囲んだ文字はString型とみなされるからです。

また、char型の時は文字コードを直接代入できましたが、String型ではこれはできません。

package pac01;

public class HelloWorld {
	public static void main(String[] args) {
		String strHensu1 = 0x0041;
		String strHensu2 = 65;

		System.out.println(strHensu1);
		System.out.println(strHensu2);
	}
}
-----------------------------------------------------------------------------
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	型の不一致: int から String には変換できません
	型の不一致: int から String には変換できません

	at pac01.HelloWorld.main(HelloWorld.java:5)

コメントを残す

サブコンテンツ

このページの先頭へ