layout: post
title: "자바가 제공하는 다양한 연산자"
date: 2022-05-04T00:00:00-00:00
author: sangyeop
categories: Sproutt-2nd
연산자 | 사용법 | 설명 |
---|---|---|
+ | a+b | a와 b의 값을 더한다, 또한 문자열을 연결할때도 사용하기도 한다. |
- | a-b | a의 값에서 b의 값을 뺀다. |
* | a*b | a와 b의 값을를 곱한다. |
/ | a/b | a의 값을 b의 값으로 나눈 몫을 구한다. |
% | a%b | a의 값을 b의 값으로 나눈 나머지 값을 구한다. |
전위연산자
연산자 | 사용법 | 설명 |
---|---|---|
++ | ++a | a의 값을 1증가 시킨다. a의 값은 1증가된 상태로 측정된다. |
-- | --a | a의 값을 1감소 시킨다. a의 값은 1감소된 상태로 측정된다. |
후위연산자
연산자 | 사용법 | 설명 |
---|---|---|
++ | a++ | a의 값을 1증가 시킨다. a의 값은 1증가 되기 전 상태로 측정된다. |
-- | a-- | a의 값을 1감소 시킨다. a의 값은 1감소 되기 전 상태로 측정된다. |
비트단위 연산자는 입력값의 이진수 또는 비트들로 동작한다. 이를 long
, int
, short
, char
, byte
등 정수형으로도 사용할 수 있다.
비트단위 연산자는 10진수와 동일하게 작동하고 연산자에 따라서 비트 단위로 연산을 수행한다. 연산이 수행되는 과정은 다음과 같다. 먼저 연산이 어떠한 과정으로 이루어 지는지를 알아보자.
비트단위 논리 연산자
OR(|
)
두 정수의 각 이진수를 비교하고 둘 중 하나의 값이 1이라면 1을 반환한다.
0110
0101
----
0111
위와 같이 둘 다 0이라면 0이 되고, 둘 중 하나라도 1이라면 1이 반환된다.
AND(&
)
두 정수의 각 이진수를 비교하고 둘 다 1이라면 1을 반환하고, 그렇지 않다면 0을 반환한다.
0110
0101
----
0100
XOR(^
)
두 정수의 각 이진수를 비교하고 둘의 값이 서로 다르다면 1을 반환한다.
0110
0101
----
0011
보수(~
)
한 정수의 보수는 해당 정수를 이진수로 바꾼 값에서 1과 0을 바꾼 값이 된다.
0000 0110
---------
1111 1001
비트 단위 Shift 연산자
이진수 쉬프트 연산자는 입력값의 모든 비트를 연산자에 따라 왼쪽과 오른쪽으로 이동시킬 수 있다. 사용법은 아래와 같다.
value <operator> <number_of_times>
Signed Left Shift(<<
)
<number_of_times>
에 적은 숫자 만큼 비트를 왼쪽으로 옮기고 비어있는 오른쪽 공간은 0으로 채운다.
12 << 2
// 00001100
-------
48
// 00110000
Signed Right Shift(>>
)
<number_of_times>
에 적은 숫자 만큼 비트를 오른쪽으로 옮긴다. 왼쪽 값은 입력된 값에 따라서 다르게 채우는데
입력된 값이 양수일 때
즉, 가장 왼쪽 비트 값이 0일때, 비어있는 왼쪽 공간을 0으로 채운다.
입력된 값이 음수일 때
즉, 가장 왼쪽 비트 값이 1일때, 비어있는 왼쪽 공간을 1로 채운다.
Unsigned Right Shigt(>>>
)
앞의 Signed Shift 연산자와 유사하지만, 입력값이 음수인지 양수인지에 상관없이 무조건 왼쪽 비어있는 공간을 0으로 채운다는 점이 다르다.
==
동등성을 확인하는 연산자이다. 피연산자와 같은 객체이면 true
를 반환하고, 그렇지 않으면 false
를 반환한다.
!=
비동등성을 확인하는 연산자이다. 피연산자와 같은 객체이면 false
를 반환하고 그렇지 않으면 true
를 반환한다.
<
미만을 나타내는 연산자이다.
>
초과를 나타내는 연산자이다.
<=
이하를 나타내는 연산자이다.
>=
이상을 나타내는 연산자이다.
관계 연산자는 데이터 여러 데이터 타입들을 지원한다
==
와 !=
연산자는 모든 primitive type에 사용이 가능하고, 객체들에게도 사용이 가능하다.논리연산자는 "AND", "OR" 그리고 "NOT" 과 같은 논리적인 연산을 수행할 때 사용된다.
&&
양쪽의 조건이 모두 참일 경우 true
를 반환한다. 그렇지 않을 경우 false
를 반환한다.
condition1 && condition2
||
양쪽 조건 중 하나 이상이 참이라면 true
를 반환한다. 둘 모두 거짓이라면 false
를 반환한다.
condition1 || condition2
!
주어진 조건을 만족하지 않거나, false
일경우 true
를 반환한다. 만약 condition이 false
라면 true
일 경우에 true
를 반환하고, true
라면 false
일 경우 true
를 반환한다.
!(condition)
instanceof
는 어떤 객체가 주어진 타입에 해당하는 객체인지 검사하는 바이너리 연산자이다. 결과로는 true
또는 false
를 반환한다. 흔히 타입 비교 연산자로 알려져 있다.
확인되지 않은 객체를 캐스팅하기 전에, instanceof
가 사용된다. 그렇게 함으로써 ClassCastException
을 피하도록 도와준다. 사용법은 아래와 같다.
(object) instanceof (type)
public class Car {
public Car() {
}
}
public class SUV extends Car{
public SUV() {
}
}
public class Main {
public static void main(String[] args) {
SUV suv = new SUV();
System.out.println(suv instanceof Car);
}
}
true
아마 프로그래밍을 하면서 가장 많이 사용하는 연산자 중 하나일 것이다. 할당 연산자는 변수에 값을 할당할 때 사용한다. 할당 연산자의 왼쪽은 변수이고 오른쪽에는 할당하고자하는 값이 들어간다. 사용법은 아래와 같다
(type) (variable) (operator) (value);
기본적인 할당 연산자
연산자의 왼쪽에 할당하고자 하는 변수, 오른쪽에 값을 적어 연산자를 사용하는 방법이다. 이때 할당하고자 하는 값의 타입과 할당되는 변수의 타입이 일치해야 한다.
int a = 1;
복합 할당 연산자
+,-,*,/
와 함께 사용되는 =
연산자를 의미한다.
int a = 1;
a = a+1;
위의 코드는 아래와 같다
int a = 1;
a += 1;
->
화살표 연산자는 람다 함수를 정의한다. 람다로 인해 코드를 디자인하고 작성하는 방법을 크게 바뀌었다. 람다로 인해 함수형 프로그래밍이 가능해졌다. 이것은 프로그래밍의 패러다임이 바뀌었음을 의미한다.
람다 표현법
parameters -> body
parameters
람다의 파라미터는 단일 파라미터의 경우에는 소괄호()
가 생략될 수 있으며, 여러개의 파라미터가 들어갈 경우 쉼표,
로 구분할 수 있다.
->
화살표 연산자라고도 한다. 이는 문법적으로 parametes
와 body
를 분리하기 위해 사용된다.
body
여러개의 문장을 사용하여 중괄호{}
가 사용될 경우 세미콜론;
이 요구되며, 그렇지 않을 경우 중괄호와 세미콜론의 생략이 가능하다.
람다의 타입 추정
람다에서 파라미터의 타입을 지정하지 않으면 컴파일러는 바디로부터 파라미터의 타입을 추정한다. 만약 타입을 지정할 경우에는 모든 파라미터의 타입을 지정해야 하며, 그렇지 않을 경우에는 모든 파라미터의 타입을 지정해서는 안된다. 그렇지 않으면 컴파일러 에러가 발생한다.
(int a) -> a + a // a와 a를 더한 int 타입의 값을 반환한다.
x -> x * x // x의 타입을 추정하여, x를 x로 곱한 값을 반환한다.
() -> System.out.prinnln("TEST") // 반환 값이 없이 "TEST"를 출력한다.
3항 연산자 ?
는 값 반환이 가능한 if-else
의 축약형이다. 사용법은 다음과 같다.
booleanExpression ? expression1 : expression2
첫 번째 피연산자는 반드시 boolean
표현이어야 한다. 만약 첫 번째 피연산자가 참이면 expression1
을 반환하고, 거짓이라면 expression2
를 반환한다.
number==100 ? "숫자가 100입니다." : "숫자가 100이 아닙니다";
자바에서 연산은 다음 연사자 우선순위 표에 따라서 수행이 된다.
연산자 | 우선순위 |
---|---|
postfix increment and decrement | ++, -- |
prefix increment and decrement and unary(단한연산자) | ++,--,+,-,~,! |
multiplicative | *,/,% |
additive | +,- |
shift | <<,>>,>>> |
relational | <,>,<=,>=,instanceof |
equality | ==,!= |
bitwise AND | & |
bitwise exclusive OR | ^ |
bitwise inclusive OR | | |
logical AND | && |
logical OR | || |
ternary | ? : |
assignment | =,+=,-=,*=,/=,%=,&=,^=,|=,<< |
기존에 장황하던 switch-case
문을 Java 13에서 개선하였다. 기존의 switch-case
문을 보자
String name = "채";
switch(name) {
case "채":
System.out.println("일치합니다");
break;
case "상":
System.out.println("일치하지 않습니다");
break;
}
이를 개선해보면 다음과 같다.
switch(name) {
case "채" -> System.out.println("일치합니다");
case "상" -> System.out.println("일치하지 않습니다");
}
참고문헌
- Java Arithmetic Operators
- Java Bitwise Operators
- Java Relational Operators
- Java instanceof
- Java assignment operator
- Java arrow operator
- Java ternary operator
- Java 13. switch operator