개요
백준 문제를 풀던 도중 char + char 연산의 출력이 아스키 코드 값의 정수로 형변환 되는 것을 알고 이 글을 작성하게 되었다.
본론
자바에서 char은 내부적으로 2byte 정수형 자료형이다.
즉, char은 단지 문자 모양을 가진 정수일 뿐이고, 실체는 유니코드 번호인 것이다.
char ch = 'A';
System.out.println((int)ch)); //출력 : 65
char + char 연산은 즉 int + int와 같다는 것이다.
두 개 이상의 char의 연산은 자바가 자동으로 int로 승격시켜서 계산한다.
char a = 'A';
char b = 'B';
System.out.println(a + b); // 65+66, 출력 : 131
왜 형변환이 될까?
자바는 산술 연산 (+, -, *, /)을 할때, 자동 형 변환(타입 승격)을 한다.
1. 표준화된 연산을 위해
| 자료형 | 크기(byte) | 비트 수 | 값의 범위 |
| byte | 1 byte | 8비트 | -128 ~ 127 |
| short | 2 bytes | 16비트 | -32,768 ~ 32,767 |
| char | 2 bytes | 16비트 | 0 ~ 65,535 (음수 x, 유니코드) |
| int | 4 bytes | 32비트 | -2,147,483,648 ~ 2,147,483,647 |
자바는 byte, short, char 와 같은 작은 정수형들을 산술 연산 시, 자동으로 int로 변환하는데,
자바에서 int는 기본 정수형이고
CPU 대부분이 int 연산에 최적화되어 있기 때문에 일관성 있게 처리하기 위해 다 int로 올려 처리하는 것이 속도도 빠르고 버그도 줄일 수 있기 때문이다.
2. 프로그래머의 실수를 방지하기 위해
작은 타입끼리 연산하면 범위 초과의 위험이 크다.
그래서 미리 int로 올려 더 넓은 범위에서 안전하게 연산하기 위함이다.
byte x = 100;
byte y = 30;
byte z = x + y; //x + y의 타입은 int이기 때문에, 컴파일 오류 발생. (130은 byte 범위 초과)
//int z = x + y;로 해야함
3. 언어 설계의 단순성과 안정성
모든 산술 연산을 int 이상에서 처리하면, 명확하고, 예외가 줄고, 유지보수와 디버깅이 쉬워진다.
형변환 없이 문자끼리의 연산으로 바꾸고 싶다면?
자바는 문자열 결합 연산자 + 를 만나면 String으로 변환하는데
System.out.println('A' + 'B'); //출력 : 131(정수)
System.out.println("" + 'A' + 'B'); //출력 : AB(문자열)
빈 문자열 ""이 포함된 상태로 +가 되면 문자열 결합으로 작동하게 된다.
'BackEnd > Java' 카테고리의 다른 글
| [JAVA] Map.put()의 반환 규칙 : null을 반환하는 이유(putIfAbsent 메서드) (1) | 2025.08.12 |
|---|---|
| [JAVA] Map과 배열, try-catch와 Character.isDigit() 성능 분석 (+스택 트레이스) (0) | 2025.05.23 |
| [JAVA] Stream API - 가독성 좋은 간결한 프로그래밍 (1) | 2025.05.22 |