🔤 Java에서 문자는 어떻게 저장될까?
— char 타입과 유니코드(Unicode) 완전 정복
핵심 요약: Java에서 문자는 내부적으로 숫자(유니코드) 로 저장된다.
char타입은 문자처럼 보이지만, 실제로는 정수 타입이다.
1️⃣ 문자 리터럴과 유니코드
문자 리터럴은 작은따옴표(')로 감싼 단 하나의 문자다.
char c = 'A'; // ← 이것이 문자 리터럴
Java는 문자를 저장할 때 유니코드(Unicode) 로 변환해 저장한다.
💡 유니코드(Unicode)란?
전 세계 모든 문자를 하나의 숫자 체계로 표현하기 위한 국제 표준 규약이다.
영문자부터 한글, 한자, 이모지까지 각 문자마다 고유 번호가 부여되어 있다.
char타입은0 ~ 65,535범위의 유니코드 값을 저장한다.
'A' → 유니코드 65 → 메모리에 65 저장
'가' → 유니코드 44032 → 메모리에 44032 저장
2️⃣ char는 정수 타입이다
유니코드가 정수이므로 char 타입도 정수 타입에 속한다.
따라서 문자뿐만 아니라 유니코드 숫자를 직접 대입할 수도 있다.
char c1 = 'A'; // 문자 리터럴로 대입
char c2 = 65; // 10진수 유니코드로 대입
char c3 = 0x0041; // 16진수 유니코드로 대입
// c1, c2, c3 모두 'A'를 출력
주요 문자 유니코드 값
| 문자 | 유니코드 (10진수) | 유니코드 (16진수) |
|---|---|---|
A | 65 | 0x0041 |
Z | 90 | 0x005A |
a | 97 | 0x0061 |
z | 122 | 0x007A |
0 | 48 | 0x0030 |
가 | 44032 | 0xAC00 |
힣 | 55203 | 0xD7A3 |
(공백) | 32 | 0x0020 |
💡 활용 팁: 영문 대소문자의 유니코드 차이는 정확히
32다.
'A'(65) + 32 = 'a'(97)→ 이를 이용해 대소문자 변환 연산도 가능하다.
3️⃣ char 타입 사용 예시
char c1 = 'A'; // 문자 리터럴
char c2 = 65; // 유니코드 숫자 직접 대입
char c3 = '가'; // 한글 문자
char c4 = 44032; // 한글 유니코드 직접 대입
System.out.println(c1); // A
System.out.println(c2); // A
System.out.println(c3); // 가
System.out.println(c4); // 가
// char를 int로 캐스팅하면 유니코드 숫자를 확인할 수 있다
System.out.println((int) 'A'); // 65
System.out.println((int) '가'); // 44032
4️⃣ ⚠️ 주의사항
빈 문자('')는 컴파일 에러
char c = ''; // ❌ 컴파일 에러: Invalid character constant
char c = ' '; // ✅ 공백 문자(유니코드 32)로 초기화
char 타입은 반드시 하나의 문자 또는 유니코드 숫자를 가져야 한다.
단순 초기화가 목적이라면 공백 문자(' ') 를 사용한다.
char 타입의 산술 연산 주의
char c = 'A';
System.out.println(c + 1); // ❌ 출력: 66 (int로 자동 변환됨)
System.out.println((char)(c + 1)); // ✅ 출력: B
char에 산술 연산을 수행하면 결과가 int 타입으로 자동 변환(프로모션) 된다.
문자로 출력하려면 반드시 (char)로 캐스팅해야 한다.
5️⃣ String과 char의 차이
| 구분 | char | String |
|---|---|---|
| 타입 | 기본 타입 (Primitive) | 참조 타입 (Reference) |
| 저장 단위 | 문자 1개 | 문자 0개 이상 |
| 리터럴 | 작은따옴표 'A' | 큰따옴표 "Hello" |
| 빈 값 | ' ' (공백 필수) | "" (빈 문자열 가능) |
| 메모리 | Stack에 직접 저장 | Heap에 객체로 저장 |
char c = 'A'; // 문자 1개, Stack 저장
String s = "Hello"; // 문자열, Heap 저장
String empty = ""; // 빈 문자열 가능
char blank = ' '; // 공백 문자로 초기화
6️⃣ 핵심 정리
문자 리터럴 → 유니코드(정수) 변환 → char 타입(2byte)에 저장
'A' → 65 → 메모리에 65 보관
| 개념 | 한 줄 요약 |
|---|---|
| 문자 리터럴 | 작은따옴표로 감싼 문자 하나 'A' |
| 유니코드 | 전 세계 문자를 0~65535 숫자로 매핑한 표준 |
| char 타입 | 2byte, 정수 타입, 유니코드 값 저장 |
| 빈 char | '' 불가 → 반드시 ' '(공백) 사용 |
| 산술 연산 | 결과가 int로 변환 → 문자 출력 시 (char) 캐스팅 필요 |