목표
- 자바가 제공하는 다양한 연산자를 학습합니다.
학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- 대입 연산자
- instanceof
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선 순위
- (optional) Java 13. switch 연산자
연산자
우선 연산자에 대해서 알아봅시다.
- 연산자는 변수의 값을 변경하거나 대입하는데 사용됩니다.
- 자바에서는 연산자에 따라 연산 대상이 될 수 있는 데이터 타입이 정해져 있습니다. (정수나 실수만 가능)
- 오버플로(overflow) 또는 언더플로(underflow) 등 범위를 벗어나는 연산들에 대해서는
- 연산 결과에 불필요한 값이 저장됩니다.
- 0으로 나눌 경우는 오류가 발생합니다.
산술 연산자 ( +, -, *, /, % )
- 산술 연산자는 사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자입니다.
- 산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.
- 나머지 연산은 결과가 항상 정수입니다.
관계 연산자 ( <, <=, >, >=, ==, != )
- 비교 연산자의 결과 값은 크기 값을 비교하여 조건을 만족하면 true 그렇지 않으면 false를 반환합니다.
- 만약 비교되는 숫자의 데이터 타입이 다를 경우 기본적으로 크기가 큰 데이터 타입에 맞추어 비교 연산을 실행합니다.
비트 연산자
비트 연산자 ( &, |, ^ )
- 비트 연산자는 두 수를 각각 2진수로 변환하여 두 수의 각 비트 연산을 수행합니다.
- & (비트곱): 두 비트가 1일 때 1, 나머지는 0.
- | (비트합): 두 비트 중 하나 이상이 1이면 1, 두 비트 모두 0이면 0.
- ^ (xor 배타적 논리합): 두 비트가 다르면 1, 같으면 0.
비트 이동 연산자 ( <<, >> )
- 왼쪽 항의 값을 2진수로 변환하여 오른쪽 항의 값만큼 비트를 왼쪽(<<), 오른쪽(>>)으로 이동시키는 연산을 수행합니다.
논리 연산자 ( &, |, &&, || )
- & : 연산을 수행하여 양쪽 항이 모두 true일 때만 true를 반환합니다.
- | : 연산을 수행하여 양쪽 항 중 한쪽만 true를 만족해도 true를 반환합니다.
- && : 만일 왼쪽 항이 false일 경우에는 오른쪽 항을 수행하지 않고 무조건 false를 반환합니다. (양쪽 항을 모두 검사하는 & 보다 속도가 빠름)
- || : 만일 왼쪽 항이 true일 경우에는 오른쪽 항을 수행하지 않고 무조건 true를 반환합니다. (양쪽 항을 모두 검사하는 | 보다 속도가 빠름)
대입 연산자 (=, +=, -=, *=, /=, %=)
- 대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽입니다.
- 또한, 앞서 살펴본 산술 연산자와 결합한 다양한 복합 대입 연산자가 존재합니다.
3항 연산자
- 단순한 IF문일 경우 라인수를 획기적으로 줄여주는 방식이 바로 3항 연산자입니다.
- 삼항연산자는 (조건문) : ? 참 : 거짓 이라는 문법을 가지게 됩니다.
//IF ELSE
int a;
if(5<4) {
a = 50;
}else {
a = 40;
}
System.out.println(a); //결과 = 40
//삼항연산자
int b = (5 < 4) ? 50 : 40;
System.out.println(b); //결과 = 40
- 위와같이 삼항연산자가 할수있는 것은 IF ELSE문을 통해서도 처리가 가능합니다.
- 삼항연산자를 사용하여 코드의 라인이 줄어들었다고 컴파일 속도가 빨라지는 것은 아닙니다.
- 삼항연산자를 중복해서 처리할 경우. 가독성이 떨어질 수 있으므로 중복처리는 피하는것이 좋습니다.
산술, 관계, 비트, 대입, 3항 연산자 정리
구분 | 연산자 | 사용예 | 설명 |
---|---|---|---|
산술 연산자 | + | a + b | 덧셈 |
- | a - b | 뺄셈 | |
* | a * b | 곱셈 | |
/ | a / b | 나눗셈 | |
% | a % b | 나머지 | |
++ | ++a | 연산전에 변수값 1증가 | |
a++ | 연산후에 변수값 1증가 | ||
-- | --a | 연산전에 변수값 1감소 | |
a-- | 연산후에 변수값 1감소 | ||
관계 연산자 | > | a > b | a 가 b 보다 크면 true |
>= | a >= b | a 가 b 보다 크거나 같으면 true | |
< | a < b | a 가 b 보다 작으면 true | |
<= | a <= b | a 가 b 보다 작거나 같으면 true | |
== | a == b | a 가 b 와 같으면 true | |
!= | a != b | a 가 b 와 같지 않으면 true | |
비트 연산자 | && | a && b | a, b 모두 true 이면 true |
|| | a || b | a,b 둘 중 하나라도 true 이면 true | |
! | !a | a 가 true 이면 false, false 이면 true | |
대입 연산자 | = | a = 9; | 변수 a 에 값 9 를 할당 |
+= | 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; | |
3항 연산자 | max = a > b ? a : b; | a 가 b 보다 크면 a의 값을 max 에 할당 a 가 b 보다 크지 않다면 b의 값을 max 에 할당 |
instanceof
- 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용합니다.
- 주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치합니다.
- 연산의 결과로 boolean값인 true, false 중의 하나를 반환 합니다.
- instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻합니다.
화살표(->) 연산자
람다식에 사용되는 연산자입니다.
- 람다식이란 식별자없이 실행가능한 함수를 의미합니다.
- 함수인데 함수를 따로 만들지 않고 코드한줄에 함수를 써서 그것을 호출하는 방식입니다.
(매개변수, ...) -> { 실행문 ... }
(매개변수, ...)
는 오른쪽 중괄호 { }
블록을 실행하기 위해 필요한 값을 제공하는 역할을 합니다. 매개 변수의 이름은 개발자가 자유롭게 지정할 수 있으며 인자타입도 명시하지 않아도 됩니다. ->
기호는 매개 변수를 이용해서 중괄호 { }
바디를 실행한다는 뜻으로 해석하면 됩니다.
람다식 장점
- 코드를 간결하게 만들 수 있습니다.
- 코드가 간결하고 식에 개발자의 의도가 명확히 드러나므로 가독성이 향상됩니다.
- 함수를 만드는 과정없이 한번에 처리할 수 있기에 코딩하는 시간이 줄어듭니다.
- 병렬 프로그래밍이 용이합니다.
람다식 단점
- 람다를 사용하면서 만드는 무명함수는 재사용이 불가능합니다.
- 디버깅이 다소 까다롭습니다.
- 람다를 남발하면 코드가 지저분해질 수 있습니다. (비슷한 함수를 계속 중복생성할 가능성이 높음)
- 재귀로 만들경우에는 다소 부적합한면이 있습니다.
연산자 우선 순위
- 최우선연산자 ( ., [], () )
- 단항연산자 ( ++,--,!,~,+/- : 부정, bit변환>부호>증감)
- 산술연산자 ( *,/,%,+,-,shift) < 시프트연산자 ( >>,<<,>>> ) >
- 비교연산자 ( >,<,>=,<=,==,!= )
- 비트연산자 ( &,|,,~ )
- 논리연산자 (&& , || , !)
- 삼항연산자 (조건식) ? :
- 대입연산자 ( =,*=,/=,%=,+=,-= )
(optional) Java 13. switch 연산자
Java 12부터 프리뷰로 추가되었습니다.
: 대신 -> 를 사용할 수 있습니다.
int a = 1;
switch(a){
case 1 -> System.out.println("case1");
case 2 -> System.out.println("case2");
}
yield 기능을 이용해 값을 리턴 할 수 있습니다.
int a = 1;
int b = switch (a) {
case 1 ->{
System.out.println("case1");
yield 10;
}
case 2 ->{
System.out.println("case2");
yield 12;
}
}
출처
'Java' 카테고리의 다른 글
[Java] 클래스 (live-study 5주차) (0) | 2020.12.18 |
---|---|
[Java] 제어문 (live-study 4주차) (0) | 2020.12.11 |
[Java] 자바 데이터 타입, 변수 그리고 배열 (live-study 2주차) (0) | 2020.11.21 |
[Java] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (live-study 1주차) (0) | 2020.11.21 |
[이펙티브 자바] 일반적인 프로그래밍 원칙 (0) | 2020.09.21 |