#03. 항과 연산자
1. 항과 연산자
- 항: 연산에 사용되는 값
- 연산자: 항을 이용하여 연산하는 기호 (*항의 개수에 따른 연산자 구분 : 단항 / 이항 / 삼항 연산자)
2. 연산자
1) 대입 연산자 [=]
: 변수에 값을 대입하는 연산자
: 연산 결과를 L-value에 R-value를 대입
: 우선 순위가 가장 낮은 연산자
2) 부호 연산자 [+, -]
: 양수와 음수를 나타내는 연산자
<대입 연산자 & 부호 연산자 예제>
package assignment;
public class OperationEx {
public static void main(String[] args) {
//대입 연산자
int age = 24;
System.out.println(age);
//부호 연산자
int num = 10;
int num2 = -num;
System.out.println(num);
System.out.println(num2);
num = -num;
System.out.println(num);
}
}
3) 산술 연산자 [+, -, /, %]
: %는 나머지를 구하는 연산자
: 숫자 N의 나머지는 0~N-1 범위의 수 (특정 범위 안의 수를 구할 때 종종 사용)
4) 증가 감소연산자 [++, --]
: 1만큼 더하거나, 뺄 때 사용하는 연산자 (단항 연산자)
1) 앞에 있을 때 ▶︎ 해당 statement가 끝나기 전에 수행 (ex. ++a)
2) 뒤에 있을 때 ▶︎ 해당 statement가 끝난 후에 수행 (ex. a++)
5) 관계연산자 [<, >, <=, >=, ==, !=]
: 연산 결과가 true / false로 반환되는 연산자 (이항 연산자)
: 같다는 의미로 ==가 사용되고, 같지 않다는 의미로 !=가 사용된다.
<증가 감소 연산자 & 관계 연산자 예제>
package assignment;
public class OperationEx2 {
public static void main(String[] args) {
//증가 감소 연산자
int num = 10;
System.out.println(num++);
System.out.println(num);
int num2 = 10;
System.out.println(++num2);
System.out.println(num2);
//관계 연산자
int first = 5;
int second = 8;
boolean flag = (first > second);
boolean flag2 = (first < second);
System.out.println(flag);
System.out.println(flag2);
}
}
- num에 10이 할당되고, 증가 연산자가 뒤에 위치하기 때문에 10이 먼저 출력된 후에 1이 증가한다.
- num2에 10이 할당되고, 증가 연산자가 앞에 위치하기 때문에 1이 먼저 증가되고 11이 출력된다.
5) 논리연산자 [&&, ||, !]
: 연산의 결과는 true/false로 반환되는 연산자
: 관계 연산자와 혼합하여 많이 사용
: &&(논리 곱: 둘다 모두 참인 경우 참) / ||(논리 합: 둘 중 하나만 참이면 참) / !(부정: 참이면 거짓, 거짓이면 참으로 바꿔줌)
*단락 회로 평가 (Short Circuit Evaluation : SCE)
: 논리 곱, 논리 합
: 논리 곱 = 두 항이 모두 true 일 때만 결과가 true
: 논리 합 = 두 항이 모두 false 일 때만 결과가 false
<논리연산자 예제>
package assignment;
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);
System.out.println(num1);
System.out.println(i);
int num2 = 10;
int j = 2;
boolean value2 = ( ((num2 = num2 + 10) > 10) && ((j = j + 2) > 10) );
System.out.println(value2);
System.out.println(num2);
System.out.println(j);
int num3 = 10;
int k = 2;
boolean value3 = ( ((num3 = num3 + 10) > 10) || ((k = k + 2) > 10) );
System.out.println(value3);
System.out.println(num3);
System.out.println(k);
int num4 = 10;
int l = 2;
boolean value4 = ( ((num4 = num4 + 10) > 10) && ((l = l + 2) > 10) );
System.out.println(value4);
System.out.println(num4);
System.out.println(l);
}
}
- 첫번째 (&&) : 앞에가 false이기 때문에 이미 조건을 충족시킬 수 없기 때문에 뒤에 식을 연산하지 않는다.
- 두번째 (&&) : 앞에가 true여도 뒤에 식도 true여야 충족시킬 수 있기 때문에 뒤에 식을 연산한다.
- 세번째 (||) : 앞에가 true이기 때문에 이미 조건을 충족하였기에 뒤에 식을 연산하지 않는다.
- 네번째 (&&) : 앞에가 false여도 뒤에 식이 true면 조건을 충족시킬 수 있기 때문에 뒤에 식을 연산한다.
6) 복합 대입연산자 [+=. -=, *=, /=, %=, <<=, >>=, >>>=, &=, !=, ^=]
: 자기 자신에게 연산한 값 할당
: 대입 연산자와 다른 연산자를 함께 사용
: 비트 연산자와도 같이 사용할 수 있다.
7) 조건연산자
: 조건문 ? 결과1 : 결과2 (삼항 연산자)
: 결과가 true/false에 따라 다른 식이나 결과가 수행된다. (조건문이 true = 결과1 수행 / 조건문이 false = 결과2 수행)
: 조건문을 간단히 표현할 때 사용할 수 있다.
<복합 대입 연산자 & 조건 연산자 예제>
package assignment;
public class OperationEx4 {
public static void main(String[] args) {
//복합 대입 연산
int num = 10;
System.out.println(num+=1);
System.out.println(num%=10);
num-=1;
System.out.println(num);
//조건 연산자
int num1 = (5 > 3) ? 10 : 20;
System.out.println(num1);
}
}
- num이 10일 때, num+=1은 num=num+1과 같은 의미이기 때문에 결과값이 11이 나온다.
- num의 값이 11이 되었고, num%=10은 num=num%10과 같은 의미이기 때문에 결과값이 1이 나온다.
- num의 값이 1이 되었고, num-=1은 num=num-1과 같은 의미이기 때문에 결과 값이 0이 나온다.
- 조건문이 5>3으로 true이기 때문에 결과 값이 10이 나온다.
8) 비트연산자 [~, &, |, ^]
: 비트 연산자는 정수에만 사용 가능
: ~ (비트 반전, 1의 보수)
: & (비트 단위 AND) ▶︎ 1 & 1 : 1 반환, 그 외에는 0 반환
: | (비트 단위 OR) ▶︎ 0 | 0 : 0 반환, 그 외에는 1 반환
: ^ (비트 단위 XOR) ▶︎ 두 개의 비트가 서로 다른 경우에 1 반환
9) 비트연산자 - 시프트 연산자 [<<, >>, >>>]
: 자바에서는 기본적으로 4바이트(32비트)가 주어진다.
: << (왼쪽 shift) ▶︎ a<<2 : a를 2비트 만큼 왼쪽 이동 / 뒤에는 0으로 채워짐
*한 비트가 옆으로 이동하게 되면 *2 한 것과 같아진다. (*2^n한 값과 같아짐) ex) 15<<2 면 15x4한 값
: >> (오른쪽 shift) ▶︎ a>>2 : a를 2비트 만큼 오른쪽으로 이동
* 한 비트가 옆으로 이동하게 되면 /2 한 것과 같아진다 (/2^n한 값과 같아짐)
: >>> (오른쪽 shift) ▶︎ >>와 동일한 연산 / 채워지는 비트가 부호와 상관없이 0으로 채워진다.
<비트 연산자 & 시프트 연산자 예제>
package assignment;
public class OperationEx5 {
public static void main(String[] args) {
//비트 연산자
int num1 = 5;
int num2 = 10;
int num3 = 11;
int result = num1 & num2;
int result2 = num1 & num3;
int result3 = num1 | num2;
System.out.println(result);
System.out.println(result2);
System.out.println(result3);
//비트 연산자 - 시프트 연산자
int num4 = 5; //00000101
System.out.println(num4 << 2);
System.out.println(num4);
System.out.println(num4 <<= 2);
System.out.println(num4);
int num5 = 5; //0000101
System.out.println(num5 >> 1);
}
}
- num1 = 5 = 101 (2) / num2 = 10 = 1010(2) ▶︎ 0101 & 1010 하면, 같은 자리에 1이 있는 경우가 없으므로 결과 값은 0
- num1 = 5 = 101 (2) / num3 = 11 = 1011(2) ▶︎ 0101 & 1011 하면, 마지막 자리에 1로 같기 때문에 결과 값은 1
- num1 = 5 = 101 (2) / num2 = 10 = 1010(2) ▶︎ 0101 | 1010 하면, 같은 자리에 0이 있는 경우가 없으므로 결과 값은 15
- num4 = 5 = 00000101(2)를 <<2 하면, 결과 값은 20 = 00010100(2)
- 하지만 << 만으로는 num4의 값 자체가 변하지는 않는다 (<<= 필요)
- num5 = 5 = 00000101(2)fmf >>1 하면, 결과 값은 2 = 00000010(2)
3. 연산자 우선 순위
일차식 ((), []) ➤ 단항 (++ -- + = ~ !) ➤ 산술(* % /) ➤ 산술(+ -) ➤ 비트이동(<< >>) ➤ 관계(< > <= >=) ➤ 관계(== !=) ➤ 비트 곱(&) ➤ 비트 차(^) ➤ 비트 합(|) ➤ 논리 곱(&&) ➤ 논리 합(||) ➤ 조건(조건?참:거짓) ➤ 대입(= += -= *= /= %=)
'공부 > Java' 카테고리의 다른 글
#06. 클래스 / 객체 / 패키지 / 메서드 (0) | 2022.01.27 |
---|---|
#05. 반복문 (0) | 2022.01.25 |
#04. 조건문 (0) | 2022.01.25 |
#02. 진수/변수/상수 이해하기 (0) | 2022.01.07 |
#01. Java 시작하기 (0) | 2022.01.07 |
댓글