[CH03]연산자
※ 연산자 종류 ※
-단항 연산자 : 증감 연산자, 대입 연산자
-이항 연산자
-삼항 연산자 : 조건 연산자
1. 기본 연산자
(1) 부호 연산자 +, -
단항 연산자이자 이항 연산자
package ch03;
public class Operator01 {
public static void main(String[] args) {
int num = 10;
System.out.println(+num); //10
System.out.println(-num); //-10 //대입하지 않았기에 실제 값은 바뀌지 않음.
System.out.println(num); //10
num = -num;
System.out.println(num); //-10
}
}
(2) 산술 연산자
-산술 연산
int a=10;
int b=4;
System.out.println("a + b : " + a+b); //문자열끼리 연산이 먼저 되어 결과 104
System.out.println("a + b : " + (a+b)); //결과 14
System.out.println("a + b : " + (int)(a+b)); //결과 14
System.out.println("a - b : " + (a-b)); //6
System.out.println("a * b : " + (a*b)); //40
System.out.println("a / b : " + (a/b)); //2
System.out.println("a % b : " + (a%b)); //2
(3) 증감 연산자
a++;
a += 1;
a = a + 1;
증감 연산자의 위치에 따라 증감과 대입 순서 변동.
-전위 연산자 : 증감 후 연산
-후위 연산자 : 연산 후 증감
int a = 10;
System.out.println("++a : " + (++a)); // 11
System.out.println("--a : " + (--a)); // 10
System.out.println("++a : " + (a++)); // 10 // 출력 후 더한 것.
System.out.println("a : " + a); // 11
System.out.println("--a : " + (a--)); // 11 // 출력 후 뺀 것
System.out.println("a : " + a); // 10
(4) 관계 연산자(비교 연산자)
연산 결과를 참(true) 또는 거짓(false)로 반환
비교 연산은 기본형만 가능. String은 기본형이 아니라 비교연산 불가. .equals(); 사용.
package ch03;
public class Operator02 {
public static void main(String[] args) {
int a=10;
int b=5;
String str="java";
System.out.println(a<b); // false
System.out.println(a>b); // true
System.out.println(a<=b); // false
System.out.println(a>=b); // true
System.out.println(a==b); // false
System.out.println(a!=b); // true
System.out.println(str=="java"); // true
//비교 연산은 기본형만.
System.out.println(str.equals("java")); //ture
// System.out.println(a === b); // 데이터형까지 똑같은지 연산
}
}
└비교 연산은 기본형만 됨. String은 객체라 안 된다는데 왜 true가 나왔지? 오류 떠야 하는 거 아님?
(5) 논리 연산자
두 항을 모두 실행하지 않더라도 결과 값을 알 수 있는 경우, 나머지 항은 실행되지 않음. 단락 회로 평가.
&& | || | ! | ^ |
논리 곱. 둘 다 참일 경우 참. |
논리 곱. 둘 중 하나 참일 경우 참 |
참일 경우, 거짓. 거짓일 경우, 참. |
둘이 달라야 true 같으면 false |
int a=10;
int b=5;
System.out.println(a>5 && b>3);
System.out.println(a>5 && b>5);
System.out.println(a<5 && b>5); // 나머지 항은 실행되지 않음.
System.out.println(a>b || b>3);
System.out.println(!(a<5));
(6) 대입 연산자
연산이 모두 끝난 후 마지막으로 결과 값을 변수에 대입.
-대입 연산자
오른쪽의 값을 왼쪽(저장 장소, 변수)에 대입.
-복합 대입 연산자
대입연산과 다른 연산의 축약 표현
a=a+b | a=a-b | a=a*b | a=a/b | a=a&b | a=a|b | a=a<<b | a=a>>b | a=a>>>b |
a += b | a -= b | a *= b | a /= b | a &= b | a |= b | a <<= b | a >>= b | a >>>= b |
(7) 조건 연산자(삼항 연산자)
(조건식) ? 결과1 : 결과2;
간단한 조건식에서만 사용. 참일 경우 결과1, 거짓일 경우 결과2 반환.
2. 비트 연산자
(1) 비트 논리 연산자
10진수를 2진수 변환하여 연산
& | 비트값(열)이 둘 다 1일 때 1 |
| | 비트값(열)이 하나라도 1이면 1, 둘 다 0일 때 0 |
^ | 비트값(열)이 같으면 0, 다르면 1 |
~ | 비트값(열) 반전. (exclusive or) |
int a = 3; // 00000011
int b = 10; // 00001010
System.out.println(a&b); //00000010
System.out.println(a|b); //00001011
System.out.println(a^b); //000001001
System.out.println(~a); //11111100 -(부호반전)-> 00000011 -(1더하기)-> 00000100
(2) 비트 이동 연산자(쉬프트 연산)
<< | 왼쪽으로 n비트 이동. 기존 값 * 2ⁿ |
>> | 오른쪽으로 n비트 이동. 기존 값 / 2ⁿ . 부호비트에 맞춰 숫자를 넣어줌. |
>>> | 오른쪽으로 n비트 이동. 기존 값 / 2ⁿ . 부호비트와 상관없이 맨 왼쪽에 0 넣음. |
int a = 3; // 00000011
int b = 10; // 00001010
int c = -5; // 1111 1111 1111 1111 1111 1111 1111 1011
//비트 이동 연산자
System.out.println(b<<1); // b*2
System.out.println(b<<2); // b*4
System.out.println(b>>1); // b/2
System.out.println(b>>2); // b/4
System.out.println(5<<2);
System.out.println(0b00000101<<2);
System.out.println(5>>2); //1
System.out.println(0b00000101>>2);
//음수일 때, (byte)를 붙여줘야 부호비트 인식.
System.out.println((byte)c>>1); // 결과값 -3
// 연산 : (-5)/2 = -2.5
// 음수 비트 이동 연산(오른쪽)은 예상값보다 -1.
//+1해줘야 원하는 값 출력(예상값) 나옴.
System.out.println((byte)c>>1+1);
System.out.println((byte)c>>2); //-2
System.out.println((byte)c>>>1); //2147483645
(+음수 비트 이동 연산자)
int c = -6;
System.out.println(Integer.toBinaryString(c));
System.out.println(c<<1); //(-6)*2
System.out.println(c>>1); //(-6)/2 //예상값과 동일
//예상 -3, 결과 -3
System.out.println(c>>>1); //(-6)/2
System.out.println(c<<2); //(-6)*4
System.out.println(c>>2); //(-6)/4 //예상값과 결과값 차이.
//예상 -1 결과 -2
System.out.println(c>>3); //(-6)/8
//예상 0 결과 -1
System.out.println(c>>>2); //(-6)/4
└나머지가 있을 경우 예상값과 결과값이 다르게 나옴
(3) 진수 변환
-10진수 → 2진수/8진수/16진수 변환
자바가 제공하는 라이브러리.
Integer.toBinaryString() | Integer.toOctalString() | Integer.toHexString() |
2진수로 변환 | 8진수로 변환 | 16진수로 변환 |
int b = 10;
System.out.println(Integer.toBinaryString(b)); //1010
System.out.println(Integer.toOctalString(b)); //12
System.out.println(Integer.toHexString(b)); //a
-2진수/8진수/16진수 → 10진수(정수) 변환
Integer.parseInt("바꿀 수", 기존 진수)
System.out.println(); //문자열을 정수로 바꾼다.
System.out.println(Integer.parseInt("11010", 2)); //2진수를 정수로
System.out.println(Integer.parseInt("123", 8)); //8진수를 정수로
System.out.println(Integer.parseInt("4A", 16)); //16진수를 정수로
System.out.println(Integer.parseInt("10")); //10진수를 정수로
3. 연산자 순위
괄호 > 단항 연산자 > 산술 연산자 > 관계 연산자 > 논리 연산자 > 대입 연산자