
부호 연산자(+, -)도 연산자이므로, 연산 결과는 자동으로 int 타입으로 변환된다.
byte b = 100;
byte result = -b; // 컴파일 에러 (int로 변환되기 때문)
해결 방법: 강제 형 변환
byte result = (byte) -b;
byte, short, char, int) → 결과는 항상 intlong → 결과는 longfloat, double) → 결과는 실수 타입자바에서 오버플로우 / 언더플로우 발생 시 에러가 발생하지 않는다.
범위를 벗어나면 최소값 ↔ 최대값으로 순환된다.
int x = 1000000;
int y = 1000000;
int z = x * y; // 오버플로우 발생
BigDecimal을 사용해야 한다.정수 나눗셈:
ArithmeticException 발생실수 나눗셈:
NaN 또는 Infinity가 결과로 나옴안전한 연산을 위해 결과를 검사해야 한다.
double a = 0.0 / 0.0; // NaN
double b = 5.0 / 0.0; // Infinity
if (Double.isNaN(a) || Double.isInfinite(b)) {
System.out.println("연산 불가");
}
피연산자 타입이 다르면 자동 타입 변환 후 비교가 수행된다.
예외: 실수 타입은 부동소수점 방식이라 정밀도 차이 발생 (float vs double)
0.1f == 0.1 → false문자열 비교: == 대신 .equals() 사용
String s1 = "java";
String s2 = new String("java");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
&&, ||: 단축 평가(Short-circuit evaluation) 수행
&, |: 항상 양쪽 모두 평가
피연산자는 정수 타입(byte, short, char, int, long)만 가능
byte, short, char는 연산 시 자동으로 int로 변환된다. 따라서 결과도 int 타입에 저장해야 한다.
byte data = -120;
int unsignedInt = Byte.toUnsignedInt(data);
<< : 왼쪽으로 비트 이동 (빈칸 0 채움, 곱하기 2의 n제곱 효과)>> : 오른쪽으로 비트 이동 (부호 유지, 나누기 2의 n제곱 효과)>>> : 오른쪽으로 비트 이동 (빈칸 0 채움, 부호 비트 무시)오른쪽의 값을 왼쪽 변수에 저장한다.
복합 대입 연산자:
int x = 10;
x += 5; // x = x + 5
형식:
조건식 ? 값1 : 값2
조건식이 true → 값1 반환
조건식이 false → 값2 반환
대부분의 연산자는 왼쪽 → 오른쪽 방향으로 계산된다.
예외: 대입 연산자는 오른쪽 → 왼쪽
int a, b, c;
a = b = c = 5; // c=5 → b=5 → a=5