<1> 이항연산자

 

: 피연산자가 두개인 연산자.

1. 연산순서의 결정

1) 우선순위(1차적 요소) : 여러 종류의 연산자가 있을때의 연산순서

2) 결합방향(2차적 요소) : 같은 연산자가 있을때의 결합순서

 

2. 대입연산자(=) 와 산술연산자(+ - * / %)

1)

연산자 

산자의 기능 

결합방향 

 =

 연산자 오른쪽에 있는 값을 왼쪽에 있는 변수에 대입한다

 ( val=20;)

<-

 +

 두 피연산자의 값을 더한다

 (val = 4+3;)

->

 -

 왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺀다

 (vl=4-3;)

->

 *

 두 피연산자의 값을 곱한다

 (val=4*3;)

->

 /

 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다

 (val=7/3;)

->

 %

 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게되는 나머지를  반환한다.

 (val = 7%3;)

->

 

2) 예제 

 

-result선언 : 선언문에도 연산이 올 수 있다.

-System.out.println("곱셈결과 : "+n1*n2); ... 나머지 결과 : 덧셈연산과 곱셈연산 및 나머지, 나눗셈 연산이 같이 오는데 곱셈연산, 나눗셈연산, 나머지연산이 먼저 계산이 된다.

-나눗셈 연산결과가 정수이다 ** 다음 파트에서 다룬다.

 

 

3)'구분자'소괄호의 이용

: 소괄호를 이용하면 우선순위를 기억하지 않고도 원활하게 연산자를 사용할 수 있다. 

위의 예제에서 곱셈, 나눗셈, 나머지 연산을 소괄호를 이용해 표현하면 

System.out.println("곱셈 결과 : " + (n1*n2));

System.out.println("나눗셈 결과 : " +(n1/n2));

System.out.println("나머지 결과 : " +(n1%n2));

 

 

3. 나눗셈 연산자와 나머지 연산자

1)

정수형 나눗셈 : 정수의 몫 + 정수의 나머지 발생 / 두 개의 연산자가 모두 정수이면 발생 , 몫을 반환한다

실수형 나눗셈 : 실수형태의 결과. /두 개의 연산자가 실수이면 발생

 

예제 )

-정수형 나눗셈 : 피연산자가 둘 다 정수이기 때문에 정수형 나눗셈을 실행하였다

-실수형 나눗셈 : 피연산자가 둘 다 실수이기 때문에 실수형 나눗셈을 실행하였다 (f를 안써도 실수형 나눗셈이 발생한다. double형 결과 반환)

-형변환 나눗셈 : (float)7/3  -> 7.0f/3  -(자동형변환)-> 7.0f/3.0f -> 2.3333333

*형변환에 사용되는 소괄호는 '구분자' 가 아니고 '연산자' 이다

 

 

2) 나머지 연산자

: 실수의 나눗셈은 컴파일 오류가 발생하진 않지만 나머지가 존재하지 않는것이 수학적 원칙이기 때문에  나머지 연산은 무의미 하다.

예제 )

** 실수 저장/출력 과정에서 오차

 

 

4. 복합(Compound) 대입 연산자

: 피연산자1 연산 = 피연산자2    (==)   피연산자1 = 피연산자1 연산 피연산자2

: 대입연산자와 다른 연산자를 묶은 형태의 연산자.

 

 복합대입연산자

동일연산 

 a+=b

a=a+b 

 a-=b

a=a-b 

 a*=b 

a=a*b 

 a/=b

a=a/b 

 a%=b

a=a%b 

 

+) &=, ^=, |=, <<=, >>=, >>>= (비트연산자 * )

 

예제)

 

e: (double) 3.1 + (double) 2.1 = (double) 5.2   ,    (double) 5.2 * (int) 2 -> (double)5.2 * (double)2.0 , e=(double) 10.4

n : (int) 5, (int)5 + (double)2.2 -> (double)5.0 + (double) 2.2 -> (double) 11.0 -> (int) 11

* 곱센연산 이후 대입의 과정에서 자료형의 불일치로 인한 문제가 발생하지만 이는 어디까지나 *=연산의 일부이기 때문에 컴파일 에러를 발생시키지 않는다.

 

 

 

 

5. 관계연산자 (>,<,>=,<=,==,!=) (비교연산자)

: 크기 및 동등관계를 따지는 연산자

 

 연산자

연산자의 기능 

결합방향 

 <

n1<n2

n1이 n2보다 작은가? 

 -> 

 >

n1>n2

n1이 n2보다 큰가?

 ->

 <=

 n1<=n2

n1이 n2보다 작거나 같은가?

 ->

 >=

 n1>=n2

n1이 n2보다 크거나 같은가?

 ->

 ==

n1==n2 

n1과 n2가 같은가?

 ->

 !=

n1!=n2 

n1과 n2가 다른가?

 ->

 

 

- 결과에 따라서 false of true를 반환한다. (1byte)

- boolean result = (a==B); //소괄호 생략 가능

 

예제 ) 관계연산자의 활용

 

* if~else문 : true면 if문, false면 else문

 

 

 

6. 논리 연산자 (&& , ||, !)

 연산자

연산자의 기능 

결합방향 

 &&

A && B

논리and, 둘다 참이어야 참이다 

-> 

 ||

A || B

논리 or 둘중에 하나라도 참이면 참

 ->

 ! (->단항연산자)

 !A

A가 true면 false, false면 true

 <-

 

 

예제 ) 기능

 

- && / || 연산자 보다 ==, <=, >=이 우선순위가 더 높기 때문에 ==, <=, >= 연산 먼저 실행되고 그 결과로 &&, ||연산을 실행한다.

 

 

 

7. *우선순위가 없더라도 !

num1==10 && num2==20 의 실행이 우선순위에 의해서만 ==연산이 먼저 진행되는 것 x

가정 ) &&연산이 == 연산보다 우선순위가 높다면

" &&연산의 피연산자로 false나 true대신 ==연산이 있다 -> ==연산의 결과를 받아야한다! " 

따라서 결국엔 ==연산을 먼저 하게 된다.

 

이는 &&연산자와 ==연산자가 대등한 위치가 아닌 &&피연산자로 ==가 놓여있는 위치이기 때문

 

 

 

8. 논리연산자와 Short-Circuit Evaluation (Lazy Evaluation) (SCE)

 

: num2의 값이 하나도 증가하지 않았다.

-> SCE의 특성.

&&연산의 경우 앞의 연산이 false일때 결론이 false로 나오므로 뒤의 연산은 볼것도 없다는 판단이 나서 연산을 하지 않는다.

||연산의 경우는 유사하게 앞의 연산이 true일 경우 결론이 무조건 true로 나오므로 뒤의 연산은 볼것도 없다는 판단이 나서 연산을 하지 않는다

--> SCE의 부작용이 될 수 있으므로 조심해야 한다.

 

 

 

 

 

 

9. 퀴즈

Q1. int형 변수 num1, num2, num3가 각각 10,20,30으로 초기화되어 있는 상황에서 num1=num2=num3; 를 하면 각각의 변수에는 얼마 저장?

답 :

 

num1 : 30, num2 :30 , num3=30

이유 : 결합방향이 <- 이므로 오른쪽에 있는 =연산이 먼저 실행된다 즉, num1 = (num2 = num3) 의 순서로 진행.  

(num2에 num3에 저장된 값이 저장되고, num2에 저장된 값이 num1에 저장)

 

Q2. SCE 예제의 실행결과를 보면 num2가 증가하지 않음을 확인할수 있는데, 이는 SCE에 의해서 두번이나 등장하는 num2+=10이 전혀 실행되지 않기 때문이다. num2+=10이 실행되도록 코드를 수정.

내 풀이 :  

 

-> num1, num2의 초기화 수를 바꾸거나 연산을 바꾸면 원하지 않는 결과가 나올 수 있다.

교재의 풀이 : 문장이 많아졌지만 간결해졌다.

 

'언어 > JAVA' 카테고리의 다른 글

Chapter5. 실행흐름 컨트롤(1)  (0) 2017.05.01
chapter4. 연산자(Operator) (2)  (0) 2017.04.12
chapter3. 상수와 형변환(Type Casting)  (1) 2017.04.06
chapter2. 변수와 자료형  (0) 2017.04.05
chapter1 Java의 시작(2)  (0) 2017.04.04

+ Recent posts