1. 연산자
1.4 연산자의 우선순위와 결합 규칙
1) 순서: 산술 -> 비교 -> 논리 -> 대입
2) 단항(1) > 이항(2) > 삼항(3). (단항 연산자의 우선순위가 이항 연산자보다 높다.)
3) 단항 연산자(++ -- + - ~ ! type)와 대입 연산자를 제외한 모든 연산의 진핸 방향은 왼쪽에서 오른쪽이다.
-> 대입 연산자(=, +=, -=, *=, /-, %=,... )
Note) 관계 연산자 (결과로 true/ false 반환)
- >. >=, <, <=, !=, ==
2. 단항 연산자
2.1 증감연산자: ++, --
3. 산술 연산자
Ex 3-7)
<hide/>
public class OperatorEx7 {
public static void main(String[] args) {
byte a = 10;
byte b = 30;
byte c = (byte) (a * b);
System.out.println(c);
}
}
Note) 실행 결과: 44
- 300은 byte형의 범위(-128~127)를 넘기 때문에 데이터 손실이 발생한다.
- 이러한 값 손실을 예방하기 위해 충분히 큰 자료형을 사용해야 한다.
4. 비교 연산자
4.2 등가비교 연산자 == !=
- 대소빅교 연산자와 다르게 기본형/ 참조형/ 모든 자료형에 사용할 수 있다.
- 문자열 비교: equals() -> 대소문자 구별 , equalsIgnoreCase() -> 대소구분 없음
5. 논리 연산자
5.1 논리 연산자 ( || (OR 결합), && (AND 결합), ! )
- true, false를 결과로 얻는다.
5.2 비트 연산자 ( &(AND 연산자), |(OR 연산자), ^(XOR 연산자), ~, <<, >>)
- 비트 연산자는 피연산자를 비트 단위로 논리연산한다.
- ^(XOR, 배타적 eXclusive OR): 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0.
- ~(비트 전환 연산자, '1의 보수'연산자)
-> 피연산자를 2진수로 표현했을 때 0->1, 1->0으로 바꾼다.
-> 비트 전환 되고 나면 부호 있는 타입의 피연산자는 부호가 반대로 변경된다.
- toBinaryString() : 비트 연산의 결과를 2진수로 출력하는 메서드
Def) 쉬프트 연산자 <<, >> (bit shift operators)
- <<(signed left shift), >>(signed right shift)
- 이 연산자는 피연산자의 각 자리(2진수로 표현했을 때)를 왼쪽/오른쪽으로 이동한다.
- 8 << 2(8의 2진수를 왼쪽으로 두 칸 이동) 의 결과는 32가 된다.
- x << n은 x * 2^n의 결과와 같다.
- x >> n은 x / (2^n)
- 쉬프트 연산자는 /, *보다 우선순위가 빠르다.
<left shift>
- <<: 가장 오른쪽 비트를 모두 0으로 채운다.
- "<<<"는 음수이건 양수이건 결과가 동일하므로 굳이 <<< 연산자가 존재하지 않는다.
<right shift>
- >>: 가장 왼쪽 비트인 부호 비트는 원래의 비트로 채운다.
음수의 경우, 이동된 빈 자리에 0이 아닌 1로 채운다.
- >>>(Unsigned right shift): 가장 왼쪽 비트인 부호 비트는 모두 0으로 채운다.
음수의 경우에도 이동된 빈자리에 0을 그대로 채운다.
- 축약하는 것도 가능하다.
ex) i1 <<= 3; 기존의 i1을 왼쪽으로 세 칸 이동하여 대입한다.
Ex 3-31)
<hide/>
public class OperatorEx31 {
public static void main(String[] args) {
int dec = 1234;
int hex = 0xABCD;
int mask = 0xF;
System.out.printf("hex = %X%n", hex);
System.out.printf("%X%n", hex & mask);
hex = hex >> 4;
System.out.printf("%X%n", hex & mask);
hex = hex >> 4;
System.out.printf("%X%n", hex & mask);
hex = hex >> 4;
System.out.printf("%X%n", hex & mask);
}
}
Note) 실핼 결과
- 쉬프트 연산자와 비트 AND 연산자를 이용해서 16진수를 끝에서부터 한자리씩 뽑는 예제이다.
- 비트 AND 연산자는 두 bit가 모두 1일 때만 1이 된다.
- 그러므로 0xABCD와 0x000F를 비트AND연산하면 마지막 자리만 남고 앞에 나머지 세 자리는 모두 0이 된다.
-> 1010 1011 1100 1101 & 0000 0000 0000 1111 => 0000 0000 0000 1101 = D
- 0xABCD >> 4 => 0x0ABC
6. 그 외의 연산자
6.1 조건 연산자(삼항연산자) ? :
- result = ( 조건식 ) ? 식1 : 식2 .. (괄호가 필수는 아니다. )
- 조건식평가 결과애 따라 true이면 식1, false이면 식2가 연산 결과가 된다.
6.2 복합대입연산자
- '다른 연산자' + '='
- <<= , >>= , &= , ^=, |=
7. 보수(complement)
- 1의 보수: 어떤 수를 2진수로 나타냈을 때, 그 이진수의 모든 비트를 반전시킨 수 ( 0 <-> 1 )
- 2의 보수: 2의 제곱수에서 빼서 얻은 이진수
ex) 2진수 3의 2의 보수: 11 -> 01
- 2진수에서 2의 보수를 쉽게 구하려면
1) 자리수를 모두 바꿔주고, 11 -> 00
2) 1을 더해준다. 00 -> 01
따라서, 3의 2의 보수는 01
Ex)
<hide/>
public class Sam01{
public static void main(String[] args){
int i1 = 5;
int i2 = ~i1 + 1;
System.out.println(i1);
System.out.println(i2);
}
}
Note) 실행 결과
'Java > Java의 정석' 카테고리의 다른 글
Chapter 06 객체지향 프로그래밍 I (0) | 2022.02.22 |
---|---|
Chapter 05 배열(Array) (0) | 2022.02.20 |
Chapter 04 조건문과 반복문 (0) | 2022.02.19 |
Chapter 02 변수(Variable) (0) | 2022.02.17 |
Chapter 01 자바를 시작하기 전에 (0) | 2022.02.15 |