본문 바로가기
Programming/JAVA

Ch3. 자바의 여러 가지 연산자

by 안녕주 2021. 7. 17.

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 대입 = += -= *= %= /= <---
  • 단항 연산자가 가장 높고, 이항, 삼항 연산자 순서이다.
  • 대입 연산자의 우선순위가 가장 낮다.
  • 산술, 관계, 논리, 대입 연산자 순서로 우선순위를 가지며 ()의 연산자가 가장 우선순위가 높습니다.

댓글