Java 관련/Java

[Java] 자바 연산자(Operator)

씨네 2021. 10. 7. 07:37
728x90


자바에서는 우리가 흔히 사용하는 사칙연산 외에도 다른 연산이 존재합니다.

크게 보면 이러한 사칙연산을 포함한 산술연산자, 대입을 위한 대입 연산자, 다양한 문법에 사용 가능한 증감 연산자, 변수들의 비교를 위한 비교연산자, 참 거짓을 판단하는 논리연산자, 비트 단위 연산의 비트 연산자 등이 있습니다.

이런 다양한 연산자들을 조금 자세히 볼까요?

1. 산술연산자

산술연산자는 우리가 알고 있는 사칙연산( +, -, *, /) 외에도 % 연산이 존재합니다.

또한 다른 연산자에도 산술연산이 많이 포함되어 있으며 가장 많이 쓰는 연산자라고 할 수 있습니다.

연산을 할 때 두 개 이상의 연산자가 들어갈 수도 있겠죠?

산술연산자 설명
+ 왼쪽의 피연산자에 오른쪽 피연산자를 더합니다.
- 왼쪽의 피연산자에 오른쪽 피연산자를 뺍니다.
* 왼쪽의 피연산자에 오른쪽 피연산자를 곱합니다.
/ 왼쪽의 피연산자에 오른쪽 피연산자를 나눕니다.
% 왼쪽의 피연산자에 오른쪽 피연산자를 나눈 후, 그 나머지를 반환합니다.

int num1 = 10; 
int num2 = 15; 

System.out.println("+연산자 결과 : " + (num1 + num2)); 
System.out.println("-연산자 결과 : " + (num1 - num2)); 
System.out.println("*연산자 결과 : " + (num1 * num2)); 
System.out.println("/연산자 결과 : " + (num1 / num2)); 
System.out.println("%연산자 결과 : " + (num1 % num2));

해당 코드를 출력시키면 어떤 결과가 나올까요?

이런 결과가 나옵니다!

나누기 연산자는 나눈 후 값의 나머지는 버리고 출력이 된다는 걸 알 수 있습니다.

그런데 이런 연산에서도 우선순위가 있습니다!

연산은 왼쪽에서부터 순차적으로 하는 것을 기본 시 하지만 위 그림처럼 +보다는 *가 먼저 처리됩니다. 또한 ( ) 안에 들어있는 것을 가장 먼저 처리합니다.

2. 대입 연산자

대입 연산자는 변수에 값을 대입할 때 주로 사용되는 연산자입니다.

대입 연산자는 산술 연산자와 다르게 결합의 방향이 오른쪽에서 왼쪽입니다.

대입 연산자 설명
= 왼쪽의 피연산자에 오른쪽의 피연산자를 대입합니다
+= 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후 그 결과를 왼쪽의 피연산자에 대입합니다.
-= 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후 그 결과를 왼쪽의 피연산자에 대입합니다.
*= 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후 그 결과를 왼쪽의 피연산자에 대입합니다.
/= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후 그 결과를 왼쪽의 피연산자에 대입합니다.
%= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후 그 나머지를 왼쪽의 피연산자에 대입합니다.
&= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산 후 그 결과를 왼쪽의 피연산자에 대입합니다.
|= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산 후 그 결과를 왼쪽의 피연산자에 대입합니다.
^= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산 후 그 결과를 왼쪽의 피연산자에 대입합니다.
int num1 = 10, num2 = 10, num3 = 10, num4 = 10, num5 = 10; 

num1 += 5; //num1 = num1 + 5; 와 같음 
num2 -= 5; //num2 = num2 - 5; 와 같음 
num3 *= 5; //num3 = num3 * 5; 와 같음 
num4 /= 5; //num4 = num4 / 5; 와 같음 
num5 %= 5; //num5 = num5 % 5; 와같음 

System.out.println("+=연산자 결과 : " + num1); 
System.out.println("-=연산자 결과 : " + num2); 
System.out.println("*=연산자 결과 : " + num3); 
System.out.println("/=연산자 결과 : " + num4); 
System.out.println("%=연산자 결과 : " + num5);

위 코드에서 보면 변수를 선언할 때 초기화를 시켜주는 과정에서 대입 연산자가 사용되었습니다.

그리고 해당 출력값을 보면 다음과 같습니다.

type 변수 = 변수 + 값; type += 변수;

이런 형태로 출력이 됩니다.

산술 연산은 왼쪽부터 진행이 되지만 대입 연산은 위 그림과 같이 오른쪽부터 진행이 됩니다. 따라서 여러 개의 대입 연산이 있을 때는 가장 오른쪽에 있는 값이 순차적으로 들어갑니다.

3. 증감 연산자

증감 연산자 설명
++i 먼저 피연산자의 값을 1 증가시킨 후에 해당 연산을 진행합니다.
i++ 먼저 해당 연산 수행 후 피연산자의 값을 1 증가시킵니다.
--i 먼저 피연산자의 값을 1 감소시킨 후에 해당 연산을 진행합니다.
i-- 먼저 해당 연산 수행 후 피연산자의 값을 1 감소시킵니다.
int num1 = 10, num2 = 10, num3 = 10, num4 = 10; 

System.out.println("++i연산자 결과 : " + ++num1); 
System.out.println("i++연산자 결과 : " + num2++); 
System.out.println("--i연산자 결과 : " + --num3); 
System.out.println("i--연산자 결과 : " + num4--);

위 코드의 출력은 다음과 같습니다.

++나 --가 앞에 있을 경우 연산을 먼저 수행하고 값이 들어가고 뒤에 있을 경우 값은 명령 수행 후에 변화합니다.

4. 비교 연산자

비교 연산자는 말 그대로 피연산자의 값을 비교합니다.

비교 연산자 설명
== 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 참을 반환합니다.
!= 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참을 반환합니다.
> 왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 참을 반환합니다.
>= 왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 참을 반환합니다.
< 왼쪽의 피연산자가 오른쪽의 피연산자보다 작으면 참을 반환합니다.
<= 왼쪽의 피연산자가 오른쪽의 피연산자보다 작거나 같으면 참을 반환합니다.
int i1 = 1, i2 = 2; 

System.out.println("==연산자 결과 : " + (i1 == i2)); 
System.out.println("!=연산자 결과 : " + (i1 != i2)); 
System.out.println(">연산자 결과 : " + (i1 > i2)); 
System.out.println(">=연산자 결과 : " + (i1 >= i2)); 
System.out.println("<연산자 결과 : " + (i1 < i2)); 
System.out.println("<=연산자 결과 : " + (i1 <= i2));

비교 연산자는 비교적 어렵지 않으시죠?

5. 논리 연산자

논리 연산자는 식을 판단해서 참인지 거짓인지를 구분하여 리턴해주는 연산자입니다.

논리 연산자 설명
&& 논리식이 모두 참이면 참을 반환합니다. (논리 AND 연산)
|| 논리식 중에서 하나라도 참이면 참을 반환합니다. (논리 OR 연산)
! 논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환합니다. (논리 NOT 연산)

6. 비트 연산자

비트 연산자는 논리 연산자와 비슷할 수 있지만 비트 단위의 논리 연산을 할 때 사용합니다.

비트 단위에서 왼쪽 또는 오른쪽으로 이동시키거나 보수를 만들 때 사용되기도 합니다.

비트 연산자 설명
& 대응되는 비트가 모두 1이면 1을 반환합니다. (비트 AND 연산)
| 대응되는 비트 중에서 하나라도 1이면 1을 반환합니다. (비트 OR 연산)
^ 대응되는 비트가 서로 다르면 1을 반환합니다. (비트 XOR 연산)
~ 비트를 1이면 0으로, 0이면 1로 반전시킵니다. (비트 NOT 연산, 1의 보수)
<< 명시된 수만큼 비트들을 전부 왼쪽으로 이동시킵니다. (left shift 연산)
>> 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킵니다. (right shift 연산)

AND 연산은 두 비트를 비교한 후에 둘 다 1일 경우 0을 반환합니다.

하나라도 0이면 0을 반환합니다.

OR 연산은 두 비트를 비교하고 둘 중 하나라도 1이면 1을 반환합니다.

두 비트 모두 0일 때만 0을 반환합니다.

XOR 연산은 두 비트를 비교하여 두 비트가 둘 다 0이거나 둘 다 1일 경우 0을 반환합니다.

하나는 1하나는 0일 경우 0을 반환합니다.

NOT은 어떤 비트에서 비트의 값을 반전시켜줍니다.

즉, 1일 경우 0을 반환하고 0일 경우 1을 반환합니다.

7. 삼항연산자

삼항연산자는 피 연산자 3개가 필요한 연산자입니다.

(조건식) ? 참일때 반환값 : 거짓일때 반환값;

 

을 기본 형태로 하는데요.

조건식에 따라 결과가 참이면 왼쪽 반환값을 반환하고 거짓이면 오른쪽 반환값을 반환합니다.

삼 항 연산자는 2개를 사용할 수도 있습니다.

(조건식) ? (조건식) ? 참일때반환값 : 거짓일때 반환값 : 거짓일때 반환값;

 

int a = 10; 
int b = 7; 

int result = (a > b) ? a - b : b - a; 

System.out.println(result); 

String res = (a > b) ? "a가 b보다 크다" : (a < b) ? "a가 b보다 작다" : "a와 b는 같다"; 
System.out.println(res);

위 코드를 이클립스에서 실행시켜보면 이렇게 출력이 되네요.

728x90