목표
자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선순위
- (optional) Java 13. switch 연산자
프로그램에서 데이터를 처리하고 결과를 산출하는 것을 연산(operations)라고 한다. 연산에 사용되는 표시나 기호를 연산자(operator)라고 하고, 연산되는 데이터는 피연산자(operand)라고 한다. 연산자와 피연산자를 이용하여 연산의 과정을 기술한 것을 연산식(expressions)라고 부른다.
1. 산술 연산자 (+ , - ,* , / , %)
자바에서의 산술 연산자란 덧셈, 뺄셈, 곱셈, 몫, 나머지를 구하는 5가지의 연산자로 나누어진다.
기호 | 기능 | 용례 |
+ | 덧셈 / 부호 | 3 + 4, a + b |
- | 뺄셈 / 부호 | 3 - 4, a - b |
* | 곱셈 | 3 * 4, a * b |
/ | 나눗셈 | 3 / 4, a / b |
% | 나머지 | 3 % 4, a / b |
산술 연산 시 주의할 점은 연산 후의 산출 값이 산출 타입으로 표현 가능한지 알아야 한다. 표현할 수 없는 값이 산출되었을 경우에는 오버플로우가 발생하고 쓰레기 값(엉뚱한 값)을 얻을 수 있다.
ex) 자료형의 범위를 초과하는 연산
/ 와 %를 사용할 경우에도 나누는 우측 피연산자에 0을 사용할 수 없다. 0으로 나누면 컴파일은 동작하지만 ArithmeticException(예외) 이 발생하게 된다. 이러한 경우에는 예외처리를 try catch 구문으로 해서 예외를 피할 수 있다.
try{
}catch(AritemeticExcepton e){
}
이외에도 부동 소수점(실수)을 입력받을 경우에는 NaN 검사를 해야 한다.
2. 비트 연산자 (&, |, ^, ~, <<, >>, >>>)
비트 연산자는 데이터를 비트(bit) 단위로 연산한다. 즉 0과 1이 피연산자가 된다. 따라서 정수 타입만 비트 연산을 수행할 수 있다.
비트 연산자는 비트 논리 연산자와 비트 이동 연산자로 나뉜다.
비트 논리 연산자 (&, |, ^, ~)
AND(논리곱) | 1 | & | 1 | 1 | 두 비트 모두 1일 경우에만 연산 결과가 1 |
1 | 0 | 0 | |||
0 | 1 | 0 | |||
0 | 0 | 0 |
OR(논리합) | 1 | | | 1 | 1 | 두 비트 중 하나만 1이면 연산 결과는 1 |
1 | 0 | 1 | |||
0 | 1 | 1 | |||
0 | 0 | 0 |
XOR(배타적 논리합) | 1 | ^ | 1 | 0 | 두 비트 중 하나는 1이고 다른 하나가 0일 경우 연산 결과는 1 |
1 | 0 | 1 | |||
0 | 1 | 1 | |||
0 | 0 | 0 |
추가적으로 단항 연산자이면서 비트 연산자로도 사용 가능한 ~ 연산자 보수 표현이 있다.
NOT(논리 부정) | ~ | 1 | 0 | 보수 | |
0 | 1 |
비트 이동 연산자 (<<, >>, >>>)
이동(쉬프트) | a | << | b | 정수 a의 각 비트를 b만큼 왼쪽으로 이동(빈자리는 0으로 채워진다.) |
a | >> | b | 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈자리는 정수a의 최상위 부호 비트(MSB)와 같은 값으로 채워진다.) | |
a | >>> | b | 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈자리는 0으로 채워진다.) |
3. 관계 연산자 (<, <=, >, >=, ==, !=)
관계 연산자는 대소(<, <=, >, >=) 또는 동등( ==, !=)을 비교해서 boolean 타입인 true / false를 산출한다. 대소 연산자는 boolean 타입을 제외한 기본 타입에 사용할 수 있고, 동등 연산자는 모든 타입에 사용할 수 있다.
동등 비교 | 피연산자1 | == | 피연산자2 | 두 피연산자의 값이 같은지를 검사 |
피연산자1 | != | 피연산자2 | 두 피연산자의 값이 다른지를 검사 | |
크기 비교 | 피연산자1 | > | 피연산자2 | 피연산자1이 큰지를 검사 |
피연산자1 | >= | 피연산자2 | 피연산자1이 크거나 같은지를 검사 | |
피연산자1 | < | 피연산자2 | 피연산자1이 작은지를 검사 | |
피연산자1 | <= | 피연산자2 | 피연산자1이 작거나 같은지를 검사 |
4. 논리 연산자 (&&, ||, &, |, ^, !)
논리 연산자는 논리곱(&&), 논리합(||), 배타적 논리합(^) 그리고 논리 부정(!) 연산을 수행한다. 논리 연산자의 피연산자는 boolean 타입만 사용할 수 있다.
AND(논리곱) | true | && 또는 & |
true | true | 피연산자 모두가 true일 경우에만 연산 결과는 true |
true | false | false | |||
false | true | false | |||
false | false | false |
OR(논리합) | true | || 또는 | |
true | true | 피연산자 중 하나만 true일 경우에만 연산 결과는 true |
true | false | true | |||
false | true | true | |||
false | false | false |
XOR(배타적 논리합) | true | ^ | true | false | 피연산자가 하나는 true이고 다른 하나가 false일 경우에만 연산 결과는 true |
true | false | true | |||
false | true | true | |||
false | false | false |
NOT(논리부정) | ! | true | false | 피연산자의 논리값을 바꿈 | |
false | true |
5. instanceof
참조 변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다.
주로 조건문에 사용되며, instanceof의 왼쪽에는 참조 변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다. 그리고 연산의 결과로 boolean값인 true, false 중의 하나를 반환한다.
a instanceof b
주의할 점
null은 인스턴스가 아니다.
6. assignment(=) operator
대입 연산자는 오른쪽 피연산자의 값을 좌측 피연산자인 변수에 저장한다. 다음과 같이 복합적으로 사용할 수 있다.
단순 대입 연산자 | 변수 | = | 피연산자 | 우측의 피연산자의 값을 변수에 저장 |
복합 대입 연산자 | 변수 | += | 피연산자 | 변수 = 변수 + 피연산자와 동일 |
변수 | -= | 피연산자 | 변수 = 변수 - 피연산자와 동일 | |
변수 | *= | 피연산자 | 변수 = 변수 * 피연산자와 동일 | |
변수 | /= | 피연산자 | 변수 = 변수 / 피연산자와 동일 | |
변수 | %= | 피연산자 | 변수 = 변수 & 피연산자와 동일 |
복합 대입 연산자 | 변수 | &= | 피연산자 | 변수 = 변수 & 피연산자와 동일 |
변수 | |= | 피연산자 | 변수 = 변수 | 피연산자와 동일 | |
변수 | ^= | 피연산자 | 변수 = 변수 ^ 피연산자와 동일 | |
변수 | <<= | 피연산자 | 변수 = 변수 << 피연산자와 동일 | |
변수 | >>= | 피연산자 | 변수 = 변수 >> 피연산자와 동일 | |
변수 | >>>= | 피연산자 | 변수 = 변수 >>> 피연산자와 동일 |
7. 화살표(->) 연산자
람다 표현식(lambda expression)이란 간단히 말해 메서드를 하나의 식으로 표현한 것이다. 메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다.
자바에서는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스라고 한다.
따라서 자바에서 람다 표현식은 익명 클래스와 같다고 할 수 있다.
new Object() {
int min(int x, int y) {
return x < y ? x : y;
}
}
이를 람다 표현식으로 적용하면 다음과 같다.
(x, y) -> x < y ? x : y;
Java SE 8부터는 이러한 람다 표현식을 사용하여 자바에서도 함수형 프로그래밍을 할 수 있게 되었다.
@FunctionalInterface 어노테이션을 선언 앞에 붙이면, 컴파일러는 해당 인터페이스를 함수형 인터페이스로 인식한다.
@FunctionalInterface
interface Calc { // 함수형 인터페이스의 선언
public int min(int x, int y);
}
public class Lambda02 {
public static void main(String[] args){
Calc minNum = (x, y) -> x < y ? x : y; // 추상 메소드의 구현
System.out.println(minNum.min(3, 4)); // 함수형 인터페이스의 사용
}
}
람다 표현식을 사용할 시 주의할 점
1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다.
2. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있다.
3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있다. (이때 세미콜론(;)은 붙이지 않음)
4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없다.
5. return 문 대신 표현식을 사용할 수 있으며, 이때 반환 값은 표현식의 결괏값이 된다. (이때 세미콜론(;)은 붙이지 않음)
참조 : www.tcpschool.com/java/java_lambda_reference
8. 3항 연산자 (?:)
삼항 연산자는 세 개의 피연산자를 필요로 하는 연산자를 말한다.
조건식 ? 값 또는 연산식(1) : 값 또는 피연산식(2)
조건식이 True면 결과는 (1) 이 되고 False면 결과가 (2) 가 되는 연산이다.
9. 연산자 우선순위
연산자가 복합적으로 구성된 경우에는 연산자 우선순위에 따라 처리된다. 그 과정은 다음과 같다.
10. (optional) Java 13. switch 연산자
'Language > Java' 카테고리의 다른 글
JAVA 5주차 : 클래스 (0) | 2021.02.12 |
---|---|
JAVA 4주차 : 제어문 (0) | 2021.02.12 |
JAVA 2주차 : 자바 데이터 타입, 변수 그리고 배열 (0) | 2021.02.11 |
JAVA 1주차 : JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) | 2021.02.10 |
IntelliJ 다운로드 및 설치 (0) | 2021.01.22 |
댓글