<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 |