본문 바로가기

JAVA

자바 기초부터 차근차근...(4)

※ 이번에는 '연산자(Operator)'를 정리하고자 한다.

※ 연산자 또한 잘 기억해둬야 한다.

※ 헷갈리기 쉬운게 많으니 주의할 것.


 

이항 연산자

 

피연산자가 둘인 연산자를 가리켜 '이항 연산자' 라고 한다.

예를들어 +와 -가 있다.

 

사실 연산자를 하나하나 다 적어놓고 달달 외우는것 보다 사용할 때가 되서 외우는게 더 빨리 외워진다.

 

하지만 어떤 연산자가 먼저 계산이 되는지 헷갈릴 때 찾아보기 쉽도록 정리해두는 것도 좋다.

결합 방향과 우선 순위는 연산 진행 순서를 결정하는 요소들이니 알아두도록 하자.

헷갈릴때에는 자주 들여다보고 익숙해지도록 노력해야 한다.

(곱하기는 당연히 플러스,마이너스보단 우선순위가 높으므로 높은 위치에 있다.)

 

 

 

복합 대입 연산자

 

+=, -=와 같이 대입 연산자가 다른 연산자와 묶여서 정의된 형태의 연산자이다.

 

a += 5; 라고 되있다면, 이 문장을 다음과 같이 a = a + 5; 라고 생각하면 된다.

 

a += 5;

a -= 5;

a *= 5;

a %= 5;

a /= 5; 

 

모두 +와 같은 방식이다.

 

여기서 중요한 예제문제를 하나 보도록 하자.

예제문제를 보고 알 수 있듯이 복합 대입 연산자는 알아서 다음과 같이 해석해준다.

 

num += 77L;                 -->>             num = (short)(num + 77L);

 

즉, 복합 대입 연산자를 사용하면 형 변환을 알아서 해준다.

(여기서 명시적인 형 변환을 줄이는 장점을 가져올 수 있다.)

 

 

 

관계 연산자

 

두 개의 피연산자 사이에서 크기 및 동등 관계를 따져주는 이항 연산자를 관계 연산자라 한다.

 

< , > , <= , >= 등등이 있다.

 

위의 연산자들은 연산의 결과에 따라서 true flase 중에 한가지를 반환한다.

 

예문을 살펴보자.

 

자 이 예문에서, 소스코드와 결과값을 확인해보자.

 

첫번째 줄과 두번 째 줄은 생각하는 것과 같은 결과값이 나왔다.

그러나 세번째 줄에서 보면 7.0과 7이 같은가? 에서 의문점이 나올 수 있다.

 

ex ) 컴퓨터에서는 7.0이랑 7이랑 다른걸로 알고 있는데 왜 true 가 정답으로 나올 수 있지?

 

그 이유는 바로 == 연산을 위해 자동 형 변환이 일어나기 때문이다.

7.0 == 7    ->  7.0 == 7.0 이런식으로 변환되고 비교 연산이 진행된다.

 

 

논리 연산자 : &&, ||, !

 

&& 연산자 => ex) a && b

a와 b가 모두 true 이면 연산 결과는 ture (논리 AND)

 

||연산자 => ex) a || b

a와 b 둘 중 하나라도 true 이면 연산 결과는 true(논리 OR)

 

!연산자 => ex) !a

연산 결과가 a가 true 이면 false, a가 false이면 true(논리 NOT)

 

 

이제 논리 연산자와 관련해서 중요한 논점이 들어가 있는 예제를 보자.

헷갈리기도 쉽고 어려우니 잘 해석해보고 판단하자.

 

 

처음부터 한줄한줄 소스코드를 살펴본 후 실행값들도 살펴보자.

우선 num1 값과 num2  값이 0으로 초기화되었다.

 

그리고 논리연산자로 result 값이 선언되었다.

 

이제 result 값을 보자.

result = ((num1 += 10) < 0 ) && ((num2 += 10) > 0);

 

여기서 진행 순서는 -> 으로 간다. (&& 연산자 진행 방향은 ->이다.)

여기서 주의해야할 점이 있다.

num1은 10이 증가되고, num2 또한 10이 증가된 상태로 연산결과를 진행한 뒤에 &&연산자를 진행하지 않는다.

 

출력 값이 나타내는 것을 진행해보면 다음과같다.

 

(num1 += 10 )<0 을 계산한다.

다음 &&연산자를 만난다.

이미 false가 앞에 있으므로 뒤에 true 이든 false 이든 상관 없이 false가 result 에 저장된다.

((num2 += 10) > 0) << 연산은 진행하지 않는다.

 

따라서, 출력값이 num1 = 10 이 되고 num2 = 0 이 되는 것이다.

 

이해가 혹시 안된다면 다음 줄도 확인해보자.

result = ((num1 += 10) > 0 ) || ((num2 += 10) > 0);

 

여기서 ((num1 +=10) > 0) 값이 먼저 계산된다.

결과값은 true,

|| 연산자는 둘중 하나만 true 가 되면 true 이므로 뒤의 ((num2 += 10) > 0) 값은 계산하지 않는다.

 

따라서

num1 = 20; // 이전에 +=10 이 됬었으므로 10의 값이 더해져서 20의 값이 저장됨.

num2 = 0; 이 된다.

 

 

이 부분은 헷갈릴 수 있고 실제로 많이 틀리는 부분이니 주의하자.

(이러한 연산 특정을 가리켜 SEC(Short-Circuit Evaluation)이라 한다.

 

- &&의 왼쪽 피연산자가 false이면, 오른쪽 피연산자는 확인하지 않는다.

- | |의 왼쪽 피연산자가 true이면, 오른쪽 피연산자는 확인하지 않는다.

 

'JAVA' 카테고리의 다른 글

자바 기초부터 차근차근...(6)  (0) 2020.04.21
자바 기초부터 차근차근...(5)  (0) 2020.03.25
자바 기초부터 차근차근(3)  (0) 2020.03.15
자바 기초부터 차근차근(2)  (0) 2020.03.15
자바 기초부터 차근차근(1)  (0) 2020.03.13