03-1 기본 연산자
-1. 항과 연산자
연산자 : 연산에 사용하는 기호
항 : 연산에 사용하는 값
| 연산자 | 설명 | 연산 예 | 연산자 우선순위 |
| 단한 연산자 | 항이 한개인 연산자 | ++num | 1 |
| 이항 연산자 | 항이 두개인 연산자 | num1 + num2 | 2 |
| 삼항 연산자 | 항이 세개인 연산자 | (5 > 3) ? 1 : 0; | 3 |
-2. 대입 연산자
대입연산자 : 변수에 값을 대입하는 연산자로, 이항 연산자 중 우선순위가 가장 낮은 연산자.
//왼쪽 변수 = 오른쪽 변수(또는 식)
int age = 24;
- 여기서 왼쪽에 있는 변수를 lValue, 오른쪽에 있는 변수를 rValue라고 한다.
-3. 부호 연산자
| 연산자 | 기능 | 연산 예 |
| + | 변수나 상수 값을 양수로 만듭니다 | +3 |
| - | 변수나 상수 값을 음수로 만듭니다 | -3 |
변수에 +,- 연산자만 사용한다고 해서 값 자체가 양수, 음수로 바뀌는 것이 아니다.
따라서 값 자체를 바꾸려면 대입연산자를 사용해서 대입해야한다.
-4. 산술 연산자
| 연산자 | 기능 | 연산 예 |
| + | 두 항을 더합니다 | 5 + 3 |
| - | 앞에 있는 항에서 뒤에 있는 항을 뺍니다 | 5 - 3 |
| * | 두 항을 곱합니다 | 5 * 3 |
| / | 앞에 있는 항에서 뒤에 있는 항을 나누어 몫을 구합니다 | 5 / 3 |
| % | 앞에 있는 항에서 뒤에 있는 항을 나누어 나머지를 구합니다 | 5 % 3 |
(1) 산술 연산자의 우선순위
*, / , %의 우선순위는 같다.
package operator;
public class OperationEx1{
public static void main(String[] args){
int mathScore = 90;
int engScore = 70;
int totalScore = mathScore + engScore; //총점 구하기
System.out.println(totalScore); //160
double avgScore = totalScore / 2.0; //평균 구하기
System.out.println(avgScore); //80.0
}
}
-5. 증가,감소 연산자
증감 연산자는 단항연산자다. 연산자 앞,뒤에서 값을 +1,-1을 해준다.
| 연산자 | 기능 | 연산 예 |
| ++ | 항의 값에 1을 더합니다 | val = ++num; // 먼저 num을 1 증가후 대입 |
| -- | 항의 값에서 1을 뺀다. | val = --num; // 먼저 num을 1 감소 후 대입 |
package operator;
public class OperationEx2{
public static void main(String[] args){
int gameScore = 150;
int lastScore1 = ++gameScore;
System.out.println(lastScore1); ///151
int lastScore2 = --gameScore;
System.out.println(lastScore2); //150
}
}
(1) 증간 연산자의 위치가 피연산자 앞에 있을 경우
int value = 10;
int num = ++ value // num에 11이 대입
(2) 증간 연산자의 위치가 피연산자 뒤에 있을 경우
int value = 10;
int num = value++; // num에 10이 대입, 후에 value값은 11
-6. 관계 연산자(비교연산자)
관계연산자는 항이 두개인 이항 연산자다. 두개의 항 중 어느것이 큰지, 작은지, 같은지 등의 여부를 검사한다.
관계연산자의 결과 값은 참(true) 또는 거짓(false)으로 반환된다.
| 연산자 | 기능 | 연산 예 |
| > | 왼쪽 항이 크면 참, 아니면 거짓을 반환 | num > 3; |
| < | 왼쪽 항이 작으면 참, 아니면 거짓을 반환 | num < 3; |
| >= | 왼쪽 항이 오른쪽 항보다 크거나 같으면 참, 아니면 거짓을 반환 | num >= 3; |
| <= | 왼쪽 항이 오른쪽 항보다 작거나 같으면 참, 아니면 거짓을 반환 | num <= 3; |
| == | 두 개 항의 값이 같으면 참, 아니면 거짓을 반환 | num == 3; |
| != | 두 개 항의 값이 다르면 참, 아니면 거짓을 반환 | num != 3; |
- 비교연산자는 대입연산자보다 연산자 우선순위가 높으므로 괄호를 사용하지 않아도 원하는 결과값이 나온다. 하지만 가독성을 위해 적절한 괄호사용이 필요하다
-7. 논리 연산자
논리 연산을 프로그래밍 언어로 구현한 연산자다.
논리 연산자는 주로 관계 연산자와 함께 사용한다. 관계 연산자의 우선순위가 논리 연산자보다 높으므로, 관계 연산자의 결과 값을 기반으로 논리 연산자의 결과 값을 계산한다.
| 연산자 | 기능 | 연산 예 |
| && | 두항이 모두 참일 경우에만 참 | (5 > 3) && (5 > 2) |
| || | 두항이 하나만 참일 경우에도 참 | (5 > 3) || (5 < 2) |
| ! | 단항 연산자, 참인 경우 거짓이고 거짓인 경우 참 | !(5 > 3) |
int num1 = 10;
int num2 = 20;
boolean flag = (num1 > 0) && (num2 > 0);
System.out.println(flag) //true
flag = (num1 < 0) && (num2 > 0);
System.out.println(flag) //false
flag = (num1 < 0) || (num2 > 0);
System.out.println(flag) //true
1. 논리 연산에서 모든 항이 실행되지 않는 경우 - 단락 회로 평가
- && 연산의 경우 : 앞 항의 결과 값이 거짓이면 뒤에 나오는 항과 관계없이 거짓이다. 따라서 그 다음에 오는 i 의 값은 실행조차 되지 않았기에 값이 증가하지 않았다.
- || 연산의 경우 : 앞 항의 결과가 참이면 뒤에 나오는 항은 실행해볼 필요 없이 참이다. 따라서 그 다음에 오는 i의 값은 실행조차 되지 않았기에 값이 증가하지 않았다.
package operator;
public class OperationEx3{
public static void main(String[] args){
int num1 = 10;
int i = 2;
boolean value = ((num1 = num1 + 10) < 10) && ((i = i +2) < 10);
System.out.println(value); //false
System.out.println(num1); //20
System.out.println(i); //2
value = ((num1 = num1 + 10) > 10) || ((i = i + 2) < 10);
System.out.println(value); //true
System.out.println(num1); //30
System.out.println(i); //2
}
}
<이와 같이 논리연산을 할 때 모두 실행하지 않더라도 결과 값을 알 수 있는 경우, 나머지 항은 실행되지 않는 것을 단락 회로 평가 라고 한다.>
-8. 복합 대입 연산자
복합대입 연산자는 대입 연산자와 다른 연산자를 조합해 하나의 연산자처럼 사용하는 연산자다.
대입 연산자는 우선순위가 가장 낮은 연산자다. 연산이 모두 끝난 후 마지막으로 결과 값을 변수에 대입한다.
| 연산자 | 기능 | 연산 예 |
| += | 두항의 값을 더해서 왼쪽 항에 대입한다. | num += 2; |
| -= | 왼쪽 항에서 오른쪽 항을 빼서 그 값을 왼쪽 항에 대입한다. | num -= 2; |
| *= | 두 항의 값을 곱해서 왼쪽 항에 대입한다. | num *= 2; |
| /= | 왼쪽 항을 오른쪽 항으로 나누어 그 몫을 왼쪽 항에 대입한다. | num /= 2; |
| %= | 왼쪽 항을 오른쪽 항으로 나누어 그 나머지를 왼쪽 항에 대입한다. | num %= 2; |
| <<= | 비트를 왼쪽으로 이동하고 그 값을 왼쪽 항에 대입한다. | num <<= 2; |
| >>= | 비트를 오른쪽으로 이동하고 그 값을 왼쪽 항에 대입한다. (왼쪽에 채워지는 비트 값은 부호비트와 동일하다.) |
num >>= 2; |
| >>>= | 비트를 오른쪽으로 이동하고 그 값을 왼쪽 항에 대입한다. (왼쪽에 채워지는 비트 값은 0이다.) |
num >>>= 2; |
| &= | 두 항의 &비트 연산 후 그 값을 왼쪽 항에 대입한다. | num &= num2; |
| |= | 두 항의 |비트 연산 후 그 값을 왼쪽 항에 대입한다. | num |= num2; |
| ^= | 두 항의 ^비트 연산 후 그 값을 왼쪽 항에 대입한다. | num ^= num2; |
-9. 조건 연산자
| 연산자 | 기능 | 연산 예 |
| 조건식 ? 결과1 : 결과2 | 조건식이 참이면 결과1, 거짓이면 결과2가 선택 | num = (5>3) ? 10 : 20; |
package operator;
public class OperationEx4{
public static void main(String[] args){
int fatherAge = 45;
int motherAge = 47;
chat ch;
ch = (fatherAge > motherAge) ? 'T' : 'F';
System.out.println(ch); //F
}
}
03-2 비트 연산자
-1. 비트 논리 연산자
(1) & 연산자
&(AND)연산자는 두 개의 비트 값이 모두 1인 경우에만 연산의 결과값이 1이 된다.
int num1 = 5; //00000101
int num2 = 10; //00001010
int result = num1 & num2; // 00000000
(2) | 연산자
|(OR)연산자는 두개의 비트 값이 하나라고 1이면 연산의 결과 값이 1이 된다.
int num1 = 5; //00000101
int num2 = 10; //00001010
int result = num1 | num2; //00001111
(3) ^ 연산자
^(XOR)연산자는 같은 값이면 0, 다른 값이면 1의 결과 값을 갖는다.
int num1 = 5; //00000101
int num2 = 10; //00001010
int result = num1 ^ num2; //00001111
(4) ~ 연산자
~(반전)연산자는 비트 값을 0은 1로, 1은 0으로 바꾸는 연산자다.
int num = 10; //00001010
int result = ~num; //11110101 ,-11
//위의 경우 부호비트가 1로 바뀌었기에 음수가 되었다.
-2. 비트 이동 연산자(시프트 연산자)
(1) << 연산자
왼쪽으로 n비트 이동한다는 것은 기존 값에 n^2만큼 곱한다는 뜻이다.
int num = 5; //00000101
num << 2; //000010100, 20
(2) >> 연산자
오른쪽으로 n비트 이동하면 기존 값을 n^2만큼 나눈다.
int num = 10; //000001010
num >> 2; //00000010, 2
(3) >>> 연산자
>>> 시프트 연산자는 >>연산과 동일하게 비트를 오른쪽으로 이동한다. 차이가 있다면 >>>연산자는 왼쪽으로 채워지는 비트 값이 부호 비트와 상관없이 무조건 0이 된다.
- 아래의 예제에서 주의할점은 비트를 이동했다고 해서 num값이 바로 변하지는 않는다는 것이다. num값을 참조해 이동했을 뿐 이동한 값을 num에 대입하지는 않았기 때문이다.
package operator;
public class OperationEx5{
public static void main(String[] args){
int num = 0B00000101; //5를 8비트 2진수로 나타냄
System.out.println(num << 2); //20
System.out.println(num >> 2); //1
System.out.println(num >>> 2); //1
System.out.println(num); //5
num = num << 2;
System.out.println(num); //20
}
}
-3. 연산자 우선 순위
| 우선순위 | 형 | 연산자 | 연산방향 |
| 1 | 일차식 | () [] . | ---> |
| 2 | 단항 | ! ++ -- + - | <--- |
| 3 | 산술 | % / | ---> |
| 4 | 산술 | + - | ---> |
| 5 | 비트 이동 | << >> | ---> |
| 6 | 관계 | < > <= >= | ---> |
| 7 | 관계 | == != | ---> |
| 8 | 비트 곱 | & | ---> |
| 9 | 비트 차 | ^ | ---> |
| 10 | 비트 합 | | | ---> |
| 11 | 논리 곱 | && | ---> |
| 12 | 논리 합 | || | ---> |
| 13 | 조건 | ? : | ---> |
| 14 | 대입 | = += -= *= %= /= | <--- |
- 단항 연산자가 가장 높고, 이항, 삼항 연산자 순서이다.
- 대입 연산자의 우선순위가 가장 낮다.
- 산술, 관계, 논리, 대입 연산자 순서로 우선순위를 가지며 ()의 연산자가 가장 우선순위가 높습니다.
'Programming > JAVA' 카테고리의 다른 글
| [JAVA] Integer와 Int의 차이 (Wrapper Class란) (0) | 2023.09.05 |
|---|---|
| Ch4. 제어 흐름 이해하기 (0) | 2021.07.18 |
| Ch2. 변수와 자료형 (5) | 2021.07.06 |
| Ch1. 자바 프로그래밍 시작하기 (0) | 2021.07.06 |
| 스레드와 멀티태스킹, 고급 스윙 컴포넌트 (0) | 2020.12.30 |
댓글