타입캐스팅과 프로모션이 발생
→ 이로인한 값손실을 주의byte, char, short → int
byte a = 10;
byte b = 20;
byte c = a + b; // ① complie 에러!
byte c = (byte) a + b; // ② complie 에러!
byte c = (byte) (a + b); // ③ OK!
① 연산방식1번에 따라 연산시에 int로 변환되므로 byte타입인 c에 대입불가함
② (byte) a + b; → byte + int → int + int → int Error
③ (byte) (a + b); → (byte) int + int → (byte) int → byte OK
a의 비트를 왼쪽으로 b만큼 이동
ex. -176 << 3 이라면
-176 | 11111111111111111111111101010000 | |
---|---|---|
-176 << 3 | = -1408 |
a의 비트를 오른쪽으로 b만큼 이동 (공백은 MSB로 채워짐 ⇒ 결과값 부호 동일)
ex. -176 >> 3 이라면
*-176의 부호(MSB)가 1(마이너스)이라서
-176 | 11111111111111111111111101010000 | |
---|---|---|
-176 >> 3 | 11111111111111111111111111101010 | = -22 |
a의 비트를 오른쪽으로 b만큼 이동 (단, 공백은 무조건 0으로 채워짐 ⇒ 결과값 부호가 바뀔수 있음)
ex. -176 >> 3 이라면
*코드를 보면 0이 생략되서 이진수 표현시 29자리로 나옴
-176 | 11111111111111111111111101010000 | |
---|---|---|
-176 >>> 3 | 00011111111111111111111111101010 | = 536870890 |
연산자 | 논리 | 기능 |
---|---|---|
& | AND | 두 비트 모두 1이면 결과가 1, 아니면 0 |
| | OR | 두 비트 중 하나라도 1이면 결과가 1, 아니면 0 |
^ | XOR | 두 비트가 서로 다르면 결과가 1, 아니면 0 |
~ | NOT | 1을 0으로, 0을 1로 부정 (보수) |
x | y | x | y | x & y | x ^ y |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 0 | 1 |
0 | 0 | 0 | 0 | 0 |
x | y | x || y (OR) | x && y (AND) |
---|---|---|---|
true | true | true | true |
true | false | true | false |
false | true | true | false |
false | false | false | false |
▶︎ 상속관계
▶︎ 다형성
i += 3;
= i = i + 3;
[더 자바, Java8] 0~1. 함수형 인터페이스와 람다
-x + 3 // 단항 > 이항
x + 3 * y // * / > + -
x + 3 > y -2 // 산술 > 비교
x > 3 && x < 5 // 비교 > 논리
x << 2 + 1 // + > shift => x << (2 + 1) 와 같음
x < -1 || x > 3 && x < 5 // AND > OR => x < -1 || (x > 3 && x < 5) 와 같음
종류 | 연산방향 | 연산자 | 우선순위 |
---|---|---|---|
단항 연산자 | ← | ++ — + - ~ ! (타입) | 높음 |
산술 연산자 | → | * / % | |
→ | + - | ||
→ | << >> >>> | ||
비교 연산자 | → | < > <= >= instanceof | |
→ | == != | ||
논리 연산자 | → | & | |
→ | ^ | ||
→ | | | ||
→ | && | ||
→ | || | ||
삼항 연산자 | → | ?: | |
대입 연산자 | ← | = *= /= %= += <<= >>= >>>= &= ^= != | 낮음 |
switch(test)
{
case 1:
result = 3;
break;
case 2:
result = 3;
break;
case 3:
result = 33;
break;
}
1) 케이스 나열
int test = 0;
switch(test)
{
case 1, 2:
result = 3;
break;
case 3:
result = 33;
break;
}
2) → 사용으로 break생략 가능
switch(test)
{
case 1, 2 -> 3;
case 3 -> 33;
}
3) break value; 기능 지원
switch(test)
{
case 1, 2 -> 3;
case 3 ->
{
yield 33;
}
// case 3 -> yield 33; 블록 밖에서 쓸 수 없다.
}
참조
자바의 정석
https://velog.io/@uhan2/Java-Operator