3주차 과제: 연산자
목표
자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선 순위
- (optional) Java 13. switch 연산자
연산자 operator
: 연산을 수행하는 기호
*피연산자 : 연산자의 작업대상
=> 대부분 연산자는 두개의 피연산자를 필요로 한다.
연산자는 피연산자로 연산을 수행하고 나면 결과값을 반환한다.
산술연산자 (+, -, *, /, %)
- * , / , % 연산자는 +, - 연산자 보다 우선순의가 높으므로 먼저 처리된다.
- 피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다. 만일 0으로 나눈다면 실행시 오류(ArtihmeticException)발생.
- 나누기 연산자의 두 피연산자가 모두 int타입인 경우, 연산 결과 역시 int타입이다. 따라서 만약 연산결과가 3.5일지라도 int타입의 값인 3을 반환한다.
- => int타입은 소수점을 저장하지 못하므로 정수만 남기고 소수점이하는 버려진다. 이때, 반올림은 하지않음.
- %(나머지 값을 반환하는 연산자) 는 나눗셈처럼 나누는 수로 0을 사용할 수 없다
- 나머지 연산자의 나누는 수로 음수도 허용. 그러나 부호는 무시되므로 결과는 음수의 절대값으로 나눈 나머지와 결과가 같다.
비트연산자 ( & , | , ^ , ~ , << , >> )
- 비트 연산자는 피연산자를 비트단위로 논리연산한다.
- 피연산자로 실수는 허용하지 않고, 정수(문자 포함)만 허용.
| ( OR연산자 ) | 피연산자 중 한 쪽값이 1이면, 1을 반환한다. 그 외에는 0 반환. |
& ( AND연산자 ) | 피연산자 중 양쪽이 모두 1이어야만 1을 반환한다. 그 외에는 0 반환. |
^ ( XOR연산자 ) | 피연산자의 값이 값이 서로 다를 때만 1을 반환한다. 같을 때는 0 반환. |
X | Y | X|Y | X&Y | X^Y |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 0 | 1 |
0 | 0 | 0 | 0 | 0 |
비트 전환 연산자 ( ~ )
: 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다. 논리부정연산자 '!'와 유사.
X | ~X |
1 | 0 |
0 | 1 |
* 비트연산자 '~'에 의해 비트가 전환되고 나면 부호있는 타입의 피연산자는 부호가 반대로 변경된다.
즉, 피연산자의 '1의보수'를 얻을 수 있다.
그래서 비트전환연산자를 '1의보수 연산자'라고도 한다.
=> 10진수 10을 비트전환연산한 결과는 -11이고, 이 값은 10의 '1의보수' 이다.
쉬프트 연산자 ( << , >> )
: 피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽(>>)' 또는 '왼쪽(<<)'으로 이동(shift) 한다고 해서 '쉬프트연산자'라고 한다.
ex) ' 8 << 2 ' 는 왼쪽 피연산자인 10진수 8의 2진수를 왼쪽으로 2자리 이동한다.
자리이동으로 저장범위를 벗어난 값들은 버려지고 빈자리는 0으로 채워진다.
1. 10진수 8을 2진수로 .
2. 왼쪽으로 2자리 이동
3. 자리이동으로 저장범위를 벗어난 값을 버리고 빈자리는 0으로 채운다.
4. 결과 // 10진수로 32
* '<<'연산자의 경우 피연산자의 부호에 상관없이 각 자리를 왼쪽으로 이동시키며 빈칸을 0으로 채우면 되지만, '>>'연산자는 오른쪾으로 이동시키기 때문에 부호있는 정수는 부호를 유지하기 위해 왼쪽 피연 산자가 음수인 경우, 빈자리를 1로 채운다. 양수일 때는 0으로 채운다.
x << n 은 x*2^n의 결과와 같다.
x >> n 은 x/2^n의 결과와 같다.
=> 나눗셈 '/' 또는 곱셈 '*' 연산자를 사용하는 것보다 더 빠르지만 가독성이 좋지 않다.
관계연산자(비교연산자)
: 두 피연산자를 비교하는데 사용되는 연산자.
주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 true, false 둘 중의 하나이다.
* 비교하는 피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰쪽으로 자동형변환하여 피연산자의 타입을 일치 시킨후에 비교한다.
대소비교연산자 ( < , > , <= , >= )
: 두 피연산자의 값의 크기를 비교하는 연산자. 참이면 true, 거짓이면 false
* 기본형 중 boolean형을 제외한 나머지 자료형에 사용할 수 있지만 참조형에는 사용할 수 없다.
비교연산자 | 연산결과 |
> | 좌변 값이 크면 true, 아니면 false |
< | 좌변 값이 작으면 true, 아니면 false |
>= | 좌변 값이 크거나 같으면 true, 아니면 false |
<= | 좌변 값이 작거나 같으면 true, 아니면 false |
등가비교연산자 ( == , != )
: 두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자.
- 모든 자료형에 사용할 수 있다.
- 기본형의 경우 변수에 저장되어 있는 값이 같은지 알 수 있다.
- 참조형의 경우 객체의 주소값을 저장하기 때문에 두개의 피연산자(참조변수)가 같은 객체를 가리키고 있는지를 알수있다.
- 참조형과 기본형은 서로 형변환이 불가하기 때문에 비교할 수 없다.
연산자 | 연산결과 |
== | 두 값이 같으면 true, 다르면 false |
!= | 두 값이 다르면 true, 같으면 false |
* 문자열의 비교
두 문자열을 비교할 때는 비교연산자 '==' 대신 equals()라는 메서드 사용
문자열의 내용이 같은지 비교하기 위해서 equals()를 사용하는 것, 같으면 true, 다르면 false
논리연산자 ( == , != )
연산자 | 연산결과 |
|| (OR결합) | 피연산자 중 어느 한쪽만 true이면 true를 결과로 얻는다. |
&& (AND결합) | 피연산자 양쪽 모두 true여야 true를 결과로 얻는다. |
x | y | x||y | x&&y |
true | true | true | true |
true | false | true | false |
false | true | true | false |
false | false | false | false |
* 효율적인 연산
- OR연산의 경우, 두 피연산자 중 어느 한쪽만 '참' 이어도 전체 연산 결과가 참이므로 좌측 피연산자가 '참(true)'이면 우측 피연산자의 값은 평가하지 않는다.
- => x가 true이면 x || y 는 항상 true 이다.
- AND연산의 경우, 어느 한쪽만 '거짓'이어도 전체 결과가 거짓이므로 좌측 피연산자가 거짓이면, 우측 피연산자의 값은 평가하지 않는다.
- OR연산의 경우 참일 확률이 높은 피연산자를 왼쪽이 놓고, AND연산의 경우 거짓일 확률이 높은 피연산자를 왼쪽에 놓는 것이 더 빠른 연산 결과를 얻을 수 있다.
=> 같은 조건식이라도 피연산자의 위치에 따라서 연산 속도가 달라질 수 있다.
논리 부정 연산자 ( ! )
: 피연산자가 true이면 false, false이면 true를 반환.
x | !x |
ture | false |
false | true |
instanceof
: 객체 타입을 확인하는데 사용한다.
- 왼쪽에는 참조변수, 오른쪽에는 타입(클래스명)이 피연산자로 위치한다.
- 연산결과로 true 또는 false를 반환한다.
- 연산결과로 true를 얻었다는 것은 참조변수가 검사함 차입으로 형변환이 가능하다는 것을 뜻한다.
대입연산자 ( = , op= )
: 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용.
- 오른쪽 피연산자의 값을 왼쪽 피연산자에 저장
- 연산자들 중 가장 낮은 우선순위를 가지고 있기 때문에 식에서 가장 나중에 수행된다.
* lvalue 와 rvalue
대입연산자의 왼쪽 피연산자를 lvalue(left value), 오른쪽 피연산자를 rvalue(right value)라고 한다.
lvalue : 변수처럼 값을 변경할 수 있는 것
rvalue : 변수, 상수, 식 모두 가능
복합대입 연산자 ( op= )
: 다른 연산자(op)와 결합하여 'op='와 같은 방식으로 사용될 수 있다.
결합된 두연산 자는 반드시 공백없이 붙여 써야 한다.
ex)
i += 3 ; | i = i + 3 ; |
i -= 3 ; | i = i - 3 ; |
i *= 3 ; | i = i * 3 ; |
i /= 3 ; | i = i / 3 ; |
화살표(->) 연산자
: 자바에서는 화살표(->)기호를 사용하여 람다표현식을 작성할 수 있다.
람다표현식(lambda expression)
: 메소드를 하나의 식으로 표현한것.
- 메소드
int min(int x, int y){
return x < y ? x : y ;
}
- 람다식
( x , y ) -> x < y ? x : y;
=> 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다.
* 유의할 사항
1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있습니다.
2. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.
3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다. (이때 세미콜론(;)은 붙이지 않음)
4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.
5. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 됩니다. (이때 세미콜론(;)은 붙이지 않음)
3항연산자
- 첫번째 피연산자인 조건식의 평가결과에 따라 다른 결과를 반환.
- 조건식의 평가 결과가 true이면 식1, false이면 식2가 연산결과가 된다.
* 3항연산자는 조건문인 if문으로 바꿀 수 있다.
- 3항연산자
result = ( x > y ) ? x : y;
- if문
if ( x > y )
result = x ; // x > y가 true일 때,
else
result = y ; // x > y가 false일 때,
연산자 우선순위
- 단항, 이항, 삼항 연산자 순으로 우선순위를 갖는다.
- 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 갖는다.
- 단항과 대입 연산자를 제외한 모든 연산방향은 왼쪽에서 오른쪽이다.
- 복잡한 연산식에는 () 괄호를 사용해서 우선순위를 정해준다.
Java 13. switch 연산자
: java 13 스위치 표현식은 새키워드 yield를 추가하여 이전 표현식을 확장한다.
- break 구문을 yield 대신 사용
// value breaks are superseded by Java 13 'yield' statements.
private static int getValueViaBreak(String mode) {
int result = switch (mode) {
case "a":
case "b":
break 1;
case "c":
break 2;
case "d":
case "e":
case "f":
break 3;
default:
break -1;
};
return result;
}
- yield를 값을 반환하는데 사용
private static int getValueViaYield(String mode) {
int result = switch (mode) {
case "a", "b":
yield 1;
case "c":
yield 2;
case "d", "e", "f":
// do something here...
System.out.println("Supports multi line block!");
yield 3;
default:
yield -1;
};
return result;
}
- 화살표(->) 연산자를 계속 지원한다.
private static int getValueViaArrow(String mode) {
int result = switch (mode) {
case "a", "b" -> 1;
case "c" -> 2;
case "d", "e", "f" -> {
// do something here...
System.out.println("Supports multi line block!");
yield 3;
}
default -> -1;
};
return result;
}
'Development > 백기선님의 온라인 자바 스터디' 카테고리의 다른 글
6주차 과제: 상속 (0) | 2021.01.27 |
---|---|
5주차 과제: 클래스(필수) (0) | 2021.01.27 |
4주차 과제 : 제어문(필수) (0) | 2020.12.12 |
2주차 과제: 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.19 |
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2020.11.14 |