JAVA

연산자

seungmin576 2024. 12. 6. 16:56

 

  • 항과 연산자

연산에 사용하는 기호를 연산자(operator)라고 한다. 더하기, 빼기 등등

연산에 사용하는 값을 항(operand)이라고 한다.

ex) 3 + 4 에서 3과 4는 항이고 +가 연산자.

 

연산자는 항의 개수에 따라 단항 연산자, 이항 연산자, 삼항 연산자로 나뉜다.

단항 연산자는 항이 한개인 연산자이다.

이항 연산자는 항이 두개인 연산자로 사칙 연산이 대표 예이다.

프로그램에서 사용하는 조건 연산자가 있는데, 바로 항이 세개가 필요한 삼항 연산자이다.

 

연산자 설명 연산 예
단항 연산자 항이 한 개인 연산자 ++num
이항 연산자 항이 두 개인 연산자 num1 + num2;
삼항 연산자 항이 세 개인 연산자 (5 > 3) ? 1 : 0;

 

우리가 사칙 연산을 할 때 순서가 있듯이 연산자에도 '연산자 우선순위'가 있다.

단항 연산자가 가장 높고 이항, 삼항 연산자 순서이다.

 

 

 

  • 대입 연산자

말 그대로 변수에 값을 대입하는 연산자이다.

이항 연산자 중 우선순위가 가장 낮은 연산자이다.

하나의 문장에 여러 연산자가 있을 때 모든 연산을 다 끝낸 후 마지막에 연산 결과를 변수에 대입하는 것이다.

totalScore = mathScore + engScore;  // mathScore 값과 engScore 값을 더한뒤 총점을 의미하는
				   // totalScore 변수에 대입한다.

 

 

 

 

  • 부호 연산자

+, - 두가지가 있다.

더하기, 빼기에 쓰는 이항 연산자이면서 부호를 나타내는 단항 연산자로도 사용한다.

연산자 기능 연산 예
+ 변수나 상수 값을 양수로 만든다 +3
- 변수나 상수 값을 음수로 만든다 -3

 

그러나 변수에 - 연산자만 사용한다고 해서 값 자체가 음수로 바뀌는 것은 아니다.

int num = 10;

System.out.println(+num); // 값 10이 그대로 출력
System.out.println(-num); // 값 10에 -가 붙어서 -10이 출력되지만 num 값이 실제로 바뀌지는 않음
System.out.println(+num); // 값 10이 그대로 출력

num = -num; //num값을 음수로 바꿔서 다시 num에 대입함
System.out.println(num); //값 -10이 출력됨

 

값 자체를 음수로 바꾸려면 대입 연산자를 사용하여 값을 대입해야 한다.

 

 

 

 

  • 산술 연산자

사칙 연산에서 사용하는 연산자이다.

+, -, *, /, % 다섯 가지가 있다.

산술 연산자의 우선순위는 일반 수학의 산술 연산과 같다.

나머지를 구하는 %의 순위는 *, / 와 같다

연산자 기능 연산 예
+ 두 항을 더한다. 5 + 3
- 앞에 있는 항에서 뒤에 있는 항을 뺀다 5 - 3
* 두 항을 곱한다. 5 * 3
/ 앞에 있는 항에서 뒤에 있는 항을 나누어 몫을 구한다. 5 / 3
% 앞에 있는 항에서 뒤에 있는 항을 나누어 나머지를 구한다 5 % 3

 

 

 

 

 

  • 증가, 감소 연산자

단항 연산자이다.

연산자의 앞이나 뒤에 사용하며 값을 1만큼 늘리거나 1만큼 줄인다.

연산자 기능 연산 예
++ 항의 값에 1을 더한다 val = ++num;
//먼저 num 값이 1 증가한 후
val 변수에 대입

val = num++;
//val 변수에 기존 num값을 대입한 후
num 값 1 증가
-- 항의 값에서 1을 뺀다 val = --num;
//먼저 num 값이 1 감소한 후
val 변수에 대입

val = num--;
//val 변수에 기존 num값을 대입한 후
num 값 1 감소

 

연산자를 피연산자 앞에 쓰는 경우와 뒤에 쓰는 경우 결과 값이 전혀 다르다.

 

public class OperationEx {
    public static void main(String[] args){
        int gameScore = 150;

        int lastScore1 = ++gameScore;  //gameScore를 1증가 먼저 시키고 lastScore1에 대입함
        System.out.println(lastScore1);

        int lastScore2 = gameScore++;  //gameScore를 lastScore2에 대입 먼저하고 1증가 시킴
        System.out.println(lastScore2);
        System.out.println(gameScore);
    }
}

lastScore1에서 ++gameScore를 대입했기 때문에 gameScore 값이 151로 증가한 후 대입이 되어 결과 값이 151이 나오는 반면,

lastScore2에서 증가 연산자를 사용했지만 피연산자 뒤에 사용 했기 때문에 gameScore의 값(151)이 lastScore2에 먼저 대입되고 난 뒤에 gameScore의 값이 152로 증가한다.

결론적으로 lastScore2는 gameScore의 증가 이전의 값을 가지고 있기 때문에 증가하지 않는 것처럼 보인다.

따라서  gameScore는 최종적으로 152가 되지만 lastScore2를 출력하면 151이 나온다.

 

 

 

 

 

  • 관계 연산자(비교 연산자)

이항 연산자이다.

두 개의 항 중 어느 것이 더 큰지, 작은지, 같은지 등의 여부를 검사한다.

결과 값은 true, false로 반환된다.

 

연산자 기능 연산 예
> 왼쪽 항이 크면 참을,
아니면 거짓을 반환한다.
num > 3;
< 오른쪽 하잉 크면 참을,
아니면 거짓을 반환한다.
num < 3;
>= 왼쪽 항이 오른쪽 항보다 크거나 같으면 참을, 아니면 거짓을 반환한다. num >= 3;
<= 오른쪽 항이 왼쪽 항보다 크거나 같으면 참을, 아니면 거짓을 반환한다. num <= 3;
== 두 개 항이 같으면 참,
아니면 거짓을 반환한다.
num == 3;
!= 두 개 항이 다르면 참,
아니면 거짓을 반환한다.
num != 3;

 

 

 

 

 

  • 논리 연산자

주로 관계 연산자와 함께 사용된다.

관계 연산자의 우선순위가 논리 연산자 보다 높으므로, 관계 연산자의 결과 값을 기반으로 논리 연산자의 결과 값을 계산한다.

연산자 기능 연산 예
&&
(논리 곱)
두 항이 모두 참인 경우에만 결과 값이 참이다.
그렇지 않을 경우에는 거짓이다.
boolean val =
(5 > 3) && (5 > 2);
||
(논리 합)
두 항 중 하나의 항만 참이면 결과 값은 참이다.
두 항이 모두 거짓이면 결과 값은 거짓이다.
boolean val = 
(5 > 3) || (5 < 2);
!
(부정)
단항 연산자이다.
참인 경우는 거짓으로 바꾸고,
거짓인 경우는 참으로 바꾼다.
boolean val =
!(5> 3);

단락 회로 평가

논리 곱 연산과 논리 합 연산을 할 때 두 항을 모두 실행하지 않더라도 결과 값을 알 수 있는 경우에, 나머지 항은 실행되지 않는다.

public class OperationEx2 {
    public static void main(String[] agrs){
        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);

        value = ((num1 = num1 + 10) > 10) || ((i = i + 2) < 10);
        System.out.println(value);
        System.out.println(num1);
        System.out.println(i);
    }
}

 

6행의 논리 곱에서 앞의 식을 보면 20 < 10 이기 때문에 결과 값이 거짓이다.

논리 곱은 앞 항의 결과 값이 거짓이면 뒤에 나오는 항과 관계 없이 무조건 거짓이기 때문에 그 다음에 오는 식이 실행되지 않아 i 값을 출력해보면 값이 증가하지 않았다.

11행의 논리 합에서 앞의 식을 보면 30 > 10 이기 때문에 결과 값이 참이다.

논리 합은 앞 항의 결과 값이 참이면 뒤에 나오는 항과 관계 없이 무조건 참이기 때문에 그 다음에 오는 식이 실행되지 않아 여전히 i 값은 증가하지 않았다.

이처럼 단락 회로 평가에 의해 예상한 실행 결과와 다를 수 있으므로 주의해야 한다.

 

 

 

 

  • 복합 대입 연산자

대입 연산자와 다른 연산자를 조합해 하나의 연산자처럼 사용하는 연산자이다.

산술 연산자, 비트 연산자와 함께 사용하여 코드를 간결하게 표현가능하다.

비트연산자는 어려우니까 따로 작성.

 

연산자 기능 연산 예
+= 두 항의 값을 더해서 왼쪽 항에 대입한다. num1 += 2;
num1 = num1 + 2; 와 같음
-= 왼쪽 항에서 오른쪽 항을 빼서
그 값을 왼쪽 항에 대입한다
num1 -= 2;
num1 = num1 - 2; 와 같음
*= 두 항의 값을 곱해서 왼쪽 항에 대입한다 num1 *= 2;
num1 = num1 * 2; 와 같음
/= 왼쪽 항을 오른쪽 항으로 나누어
그 몫을 왼쪽 항에 대입한다.
num1 /= 2;
num1 = num1 / 2; 와 같음
%= 왼쪽 항을 오른쪽 항으로 나누어
그 나머지를 왼쪽 항에 대입한다.
num1 %= 2;
num1 = num1 % 2; 와 같음
<<= 비트를 왼쪽으로 이동하고
그 값을 왼쪽 항에 대입한다.
num1 <<= 2;
num1 = num1 << 2;와 같음
>>= 비트를 오른쪽으로 이동하고
그 값을 왼쪽 항에 대입한다.
(왼쪽에 채워지는 비트 값은
부호 비트와 동일)
num1 >>= 2;
num1 = num1 >> 2; 와 같음
>>>= 비트를 오른쪽으로 이동하고
그 값을 왼쪽 항에 대입한다.
(왼쪽에 채워지는 비트 값은
0이다.)
num1 >>>= 2;
num1 = num1 >>> 2; 와 같음
&= 두 항의 & 비트 연산 후
그 값을 왼쪽 항에 대입한다.
num1 &= num2;
num1 = num1 & num2; 와 같음
|= 두 항의 | 비트 연산 후
그 값을 왼쪽 항에 대입한다.
num1 |= num2;
num1 = num1 | num2; 와 같음
^= 두 항의 ^ 비트 연산 후
그 값을 왼쪽 항에 대입한다.
num1 ^= num2;
num1 = num1 ^ num2; 와 같음

 

 

 

 

  • 조건 연산자

연산에 필요한 항의 개수가 세 개이다. (삼항 연산자)

주어진 조건식이 참인 경우와 거짓인 경우에 다른 결과 값이 나온다.

 

연산자 기능 연산 예
조건식 ? 결과1 : 결과2 조건식이 참이면 결과 1,
조건식이 거짓이면 결과2가 선택된다.
int num = (5 > 3) ? 10 : 20;

 

'JAVA' 카테고리의 다른 글

조건문  (2) 2024.12.09
비트 연산자, 연산자 우선순위  (0) 2024.12.09
형 변환  (1) 2024.12.06
상수와 리터럴  (0) 2024.12.03
실수 자료형, 논리 자료형  (0) 2024.12.02