본문 바로가기

BackEnd/Java

[JAVA] 자동 형변환 (char + char 연산)

개요

 

백준 문제를 풀던 도중 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(문자열)

문자열 ""이 포함된 상태로 +가 되면 문자열 결합으로 작동하게 된다.