[TIL] 221027 Java Promotion, Casting

신현철·2022년 10월 27일
0

TIL

목록 보기
3/5

알파벳 한 문자를 입력받아 다음 문자로 반환해주는 함수를 간단하게 생각해보자.

char nextAlphabet(char c){
	c = c + 1;
    
    return c;
}

그럴듯하지만 컴파일 에러가 난다. 타입에러가 발생해버린다.

왜일까?


💡 Promotion과 Casting

C 계열 언어에서는 형변환이라고 하면 casting이라고 생각한다.
그러나 자바의 경우에는 이 개념이 좀 더 심화적이다.

자바의 형 변환은 두 종류로 나뉜다.

작은 자료형 -> 큰 자료형 : auto type converting, 즉 promotion이다.
큰 자료형 -> 작은 자료형 : manual type converting, 흔히 아는 '그' casting이다.

프로모션의 경우에는 데이터 손실이 없으므로(작은 비트가 더 큰 비트의 자료형이 되므로) 특정 조건 하에서 자동으로 발생한다.

byte x = 10;
byte y = 10;
byte result = x + y

위 코드는 에러가 발생한다.

산술 연산자는 기본적으로 문자열 concat의 경우가 아닌 경우에는 int 형으로 promotion이 일어난다.

따라서 위 코드의 3행의 x+y의 결과값은 int 형이기 때문에 byte인 result에 대입하면 타입 에러가 발생한다.


다시 맨 처음의 함수를 보자.

char nextAlphabet(char c){
	c = c + 1;
    
    return c;
}

1행의 c + 1 연산을 하는 순간 c의 ASCII 코드 값과 1이 더해진 결과가 int로 promotion되고 이 값이 c에 저장된다.
이 후 return을 하지만, 함수의 반환형을 char라고 정의 했기 때문에 에러가 발생한 것이다.


📒 에러 피해가기

어떻게 에러를 피할까? 두 가지 방법이 있다.

char nextAlphabet(char c){
	//방법 1
    c += 1;
    
    //방법 2
    c = (char)(c + 1);
    
    return c;
}

첫 번째로는 복합대입연산자를 사용한다. 복합대입연산자는 산술연산자와는 다르게 promotion이 일어나지 않는다. 따라서 char 타입이 유지된다.

두 번째는 casting을 이용하는 방법이 되겠다.

profile
DB는 두부

0개의 댓글