스택큐힙리스트
자바의 +=, -=, *=, /= 복합 할당 연산자는 왜 캐스팅이 필요하지 않을까요? 본문
오늘까지는, 예를 들어:
i += j;
그것은 그냥 ...의 축약형이었습니다.
i = i + j;
하지만 우리가 이렇게 시도한다면:
int i = 5;
long j = 8;
그러면 i = i + j; 는 컴파일되지 않지만 i += j; 는 잘 컴파일됩니다.
이게 실제로 무슨 의미인 건지, i += j; 이런 건 i = (type of i) (i + j)와 같은 축약형이라는 건가요?
답변 1
이 질문에도 항상 그렇듯이 JLS가 답을 제공합니다. 이 경우에는 §15.26.2 Compound Assignment Operators입니다. 추출 문구 :
형식이 E1 op= E2 인 복합 할당 표현식은 E1 = (T)((E1) op (E2)) 와 동일하며, 여기에서 E1 의 유형은 #$*!#^#$& 입니다. 다만 E1 는 한 번만 평가됩니다.
#$&&&$!$$$&에서 인용한 예제
다음 코드는 올바르다:
short x = 3;
x += 4.6;
그리고 결과는 x가 값을 7을 가지도록 합니다. 왜냐하면 이것은 다음과 같이 동등합니다:
short x = 3;
x = (short)(x + 4.6);
다른 말로, 당신의 추측은 맞습니다.
답변 2
자바에서 +=, -=, *=, /= 복합 할당 연산자들은 왜 캐스팅을 필요로 하지 않을까요?
자바에서 복합 할당 연산자들은 변수의 값을 수정하면서 산술 연산을 수행하는 연산자들입니다. 이 연산자들은 코드를 더 간결하고 가독성을 높이는 장점이 있습니다. 하지만, 이들 연산자가 다른 산술 연산자들과는 달리 캐스팅을 필요로 하지 않는 이유는 무엇일까요?
이는 자바에서 자동 형 변환(implicit type conversion)과 관련이 있습니다. 자동 형 변환은 자바에서 변수를 다른 형태로 변환할 때 자동으로 수행되는 것을 말합니다. 예를 들어, int 타입의 변수에 double 타입의 값을 할당하면 자동으로 double 값을 int 타입으로 변환하여 할당합니다.
그렇다면, 왜 복합 할당 연산자들은 캐스팅을 필요로 하지 않을까요? 이는 자바에서 복합 할당 연산자들이 내부적으로 자동 형 변환을 수행하기 때문입니다. 예를 들어, a += b는 a = a + b와 동일한 의미를 가지며, a는 b의 자료형으로 자동 형 변환됩니다. 따라서, 캐스팅을 직접 수행하지 않아도 변수들의 자료형 변환이 내부적으로 자동으로 수행되어 원하는 결과를 얻을 수 있습니다.
결론적으로, 자바의 복합 할당 연산자들은 내부적으로 자동 형 변환을 수행하여 캐스팅이 필요하지 않습니다. 이는 자바에서 코드 작성의 간편성을 높이는 장점을 가지며, 개발자들이 보다 효율적이고 간결한 코드를 작성할 수 있도록 도와줍니다.