학습내용
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선 순위
- (optional) Java 13. switch 연산자
자바 스터디 시작 3일차 입니다.
이번 스터디 내용은 연산자입니다. 연산자를 공부하기 전에 연산, 연산자, 피연산자에 대해 간단히 적어보겠습니다.
- 연산은 컴퓨터가 어떠한 값, 데이터를 처리해서 결과를 내는 행위를 뜻합니다.
- 연산자는 피연산자를 계산하는 기호, 혹은 문자를 뜻하며 +, -, *, / 등 기본 연산자와 사용자가 정의한 연산자가 있습니다.
- 피연산자는 연산하는 대상을 뜻합니다.
산술 연산자
기본적인 산술 연산
산술 연산자는 일반 수학에서 볼 수 있는 +, - 을 포함한 연산자를 뜻합니다.
연산자 | 동작 | 예제 |
+ | 덧셈 | 4 + 2 = 6 |
- | 뺄셈 | 2 - 4 = -2 |
* | 곱셈 | 2 * 4 = 8 |
/ | 나눗셈 | 2 / 4 = 2 |
% | 나머지 | 2 % 4 = 0 |
증가/감소 연산자
변수의 값을 하나씩만 증가 시키며, 앞에 선언하는 전위, 뒤에 선언하는 후위로 선언할 수 있다.
연산자 | 동작 | 예제 |
++ | 전위/후위 증가 | ++val, val++ |
-- | 전위/후위 감소 | --val, val-- |
증가/감소 연산자의 경우 전위/후위 선언 방식에 따라 작게는 print값의 오류, 크게는 프로그램의 버그를 발생 시킬 수 있어 조심스럽게 사용해야 합니다.
int val = 10;
System.out.println(val++);
System.out.println(++val);
위 예제의 경우 간단히 보면 두 경우 모두 11을 출력할 것 같지만 전위/후의 선언 방식의 차이로
10
12
를 출력합니다.
이는 전위/후위 방식의 매커니즘을 통해 확인 할 수 있습니다.
- 전위
값 1을 증가, 증가 시킨후 값을 반환 - 후위
값 1을 증가, 값을 먼저 반환한 후 증가
위의 설명을 봤을때 int val의 값은 아래와 같이 사용 됩니다.
int val = 10; 최초 선언 val = 10
val++ 10을 먼저 print 한뒤 val 값 1 증가 val =11
++val 11에 1을 증가 한뒤 12 print val = 12
대입 연산자
대입 연산자는 다른 연산자를 대입해서 함께 쓰는 연산자이며 간단하게는 +, - 와 같은 기본 연산자를 대입할 수 있지만 추가로 << (shift연산자) 또한 자바에서는 지원 하고 있으며 a <<= b 처럼 사용 할 수 있다.
연산자 | 동작 | 예제 | 의미 |
+= | 덧셈 대입 | 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 |
비트 연산자
비트 연산자는 일반 비트 연산자와, 시프트 연산자가 있습니다. 비트 연산자는 비트 단위로 연산을 하게 되며 AND, OR, NOR,.. 의 논리 게이트 연산을 할 수 있습니다.
- 일반 비트 연산자
연산자 | 동작 | 예제 | |
& | AND | Val1 & Val2 | 비트 논리곱 |
| | OR | Val1 | Val2 | 비트 논리합 |
^ | XOR | Val1 ^ Val2 | 비트 배타적 논리합 |
~ | NOT | Val1 & Val2 | 비트 부정 |
일반 비트 연산자는 값을 2진 비트로 연산 할 수 있습니다. 과거 중학교때 배운 2진법을 다시 기억할 수 있는 계기가 되겠습니다.
ex)
int a = 3;
int b = 4;
일때 AND 와 OR 의 예를 들어 보겠습니다.
3 & 4 = 0
3 | 4 = 7
3 과 4를 비트로 변환 했을때 각 11, 100 이 됩니다.
계산 하면 OR은 111(2)로 7 AND는 000(2) 로 0의 결과를 보입니다.
- 시프트 연산자
연산자 | 동작 | 예제 | 의미 |
>> | NOT | Val >> 2 | Val을 2 만큼 오른쪽으로 쉬프트 |
<< | NOT | Val << 2 | Val을 2 만큼 왼쪽으로 쉬프트 |
>>> | NOT |
Val >>> 2 | Val을 2 만큼 오른쪽으로 쉬프트 하며 왼쪽은 항상 0이 채워짐 (부호 무관) |
위 에서 확인 했던 int b = 4; 1000 >> 2 를 하면 1000 >> 2 = 10(2)인 2가 되며
4 << 2 의 경우 또한 1000 << 2 = 100000(2) 인 16 이 됩니다.
이 때 4 >>> 2 를 하게 되면 0010이 됩니다 (왼쪽에 0을 채움)
관계 연산자
관계 연산자는 간단하게는 참과 거짓을 판별하는 연산자 입니다. 참과 거짓의 형태를 가지고 있기 때문에 if 문과 같은 제어문이나 for문의 반복문에 자주 사용됩니다.
연산자 | 동작 | 예제 | 의미 |
> | a > b a가 b보다 크다 | 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 |
instanceof | 인스턴스가 같다 | a instanceof b | a 인스턴스와 b 인스턴스가 같은 인스턴스 일때 true |
논리 연산자
논리 연산자 또한 참과 거짓을 결과로 출력하기 때문에 if문과 for문에 자주 사용됩니다.
이때 &&, || 과 같은 단축 논리 연산자가 있는데 이는 왼쪽부터 연산자가 진행되는데 미리 결과가 나오면 오른쪽 부분은 판별하지 않고 바로 결과를 도출 합니다.
ex) True || False || True 의 경우 첫번째 항목에서 True를 리턴하기 때문에 오른쪽 || 은 계산하지 않습니다.
연산자 | 동작 | 예제 | 의미 |
& | AND | a & b | a 와 b 둘다 True 일때 True |
&& | 단축 AND | a && b | a 와 b 둘다 True 일때 True |
| | OR | a | b | a 와 b 둘다 False 일때 False |
|| | 단축 OR | a || b | a 와 b 둘다 False 일때 False |
^ | XOR | a ^ b | a 와 b 중 하나 이상이 True 일때 False |
! | NOT | !a | a 가 True 일때 False, a 가 False 일때 True |
논리 연산자는 대입 연산자 또한 사용할 수 있습니다. 그 중 하나는 이전에도 만났습니다. !=의 경우 입니다. !이라는 not 논리 연산자와 = 의 대입 연산자가 만나서 논리 대입 연산자로 사용합니다.
연산자 | 동작 | 예제 | 의미 |
&= | AND 대입 | A &= B | A = A & B |
|= | OR 대입 | A |= B | A = A | B |
^= | XOR 대입 | A ^= B | A = A ^ B |
instanceof
instanceof는 객체타입을 확인하는데 사용하게 됩니다. 결과는 True, False 값을 내는 연산자 이며 부모 클래스를 인식하기 때문에 자식 클래스는 부모 클래스와 같은 취급을 받게 됩니다.
Class A
Class B extends A
public static void main(String[] args){
A a = new A();
B b = new B();
(a instanceof A)
(a instanceof B)
(b instanceof A)
(b instanceof B)
}
일때 위의 경우 부터
true
false
true
true
를 리턴하게 되는데 a instanceof B 가 false인 이유는 자식 클래스를 부모 클래스에 비교 했기 때문에 상속 관계가 반대가 됩니다.
assignment(=) operator
할당연산자 = 는 이미 알고 계신분이 많겠지만 위에 계속 설명했던 대입연산자 입니다.
+=, -= 를 시작으로 !=, >>= 까지 다양한 할당연산자에 사용할 수 있습니다.
화살표(->) 연산자
-> 는 화살표, 람다식으로 표현되는 연산자 입니다.
람다식 이란 익명함수를 의미하는 용어 입니다. 간단하게 말하면 함수를 단순하게 표현하기 위해 사용하는 기호 입니다.
Java8에서 추가 되었으며 객체지향 보다 함수지향에 가깝다고 볼 수 있습니다.
int x = 3;
int y = 4;
int a = (x, y) -> (x >= y) ? x:y;
int b = (int x, int y) -> x + y;
위 예시의 경우 아래와 같은 결과를 나타냅니다.
a = 4;
b = 7;
3항 연산자
연산자의 목록을 보다보면 : ? 를 만나게 됩니다. 3항 연산자는 평소에는 자주 사용하지 않지만 if 문이 많아질때 유용하게 사용할 수 있습니다.
int a = 2;
int b = 3;
int c = (a > b) ? a : b;
위의 예시를 보면 a 와 b 의 대소 비교를 먼저 하게 됩니다. 이 때 ()안의 내용이 True이면 : 앞의 내용을 False면 : 뒤의 내용을 선택하게 됩니다.
예제의 경우 a보다 b가 크기 때문에 c 에는 3이 저장됩니다.
int c = 3;
연산자 우선 순위
연산자는 우선순위가 존재합니다. 사칙 연산에서 먼저 계산하는 순서가 있듯 연산자에도 우선 순위가 있습니다.
연산자 | 예제 |
1 | () [] |
2 | ++ -- ~ ! |
3 | * / % |
4 | + - |
5 | >> >>> << |
6 | > >= < <= |
7 | == != |
8 | & |
9 | ^ |
10 | | |
11 | && |
12 | || |
13 | ? : |
14 | = op= |
(optional) Java 13. switch 연산자
java에도 c와 c++에서 볼 수 있는 switch 문법이 있습니다. 일반적으로는 C/C++ 과 비슷하게 선언합니다.
static String getInt(int num){
String text;
swith (num) {
case 1, 2:
text = "case a";
break;
case 3, 4:
text = "case b";
break;
}
return text;
}
이는 java 12에서 조금 업그레이드 되었습니다. 위에서 봤던 람다식이 사용이 가능하게 되었습니다.
swith (num) {
case 1, 2 -> "case a";
case 3, 4 -> "case b";
}
그러나 이 또한 Java12 GA배포 이후 사용자의 피드백을 받아 기존에 break를 사용하던 문법을 yield로 수정하였습니다.
yield는 쓰레드와 관련된 문법으로 yield가 사용되면 다른 쓰레드에게 실행을 양보하게 됩니다.
이 yield문법은 멀티 쓰레드가 사용되는 반복문에서 가장큰 효율을 발휘할 수 있게됩니다.
static String getInt(int num){
String text;
swith (num) {
case 1, 2:
text = "case a";
yield;
case 3, 4:
text = "case b";
yield;
}
return text;
}
'IT 이야기 > Java' 카테고리의 다른 글
[Java Study] 5일차 클래스, 메소드 (class ,method) (0) | 2020.12.14 |
---|---|
[Java] JUnit5 (0) | 2020.12.06 |
[Java Study] 4일차 선택문,조건문, junit5.. 그리고 트리 구조 (0) | 2020.12.05 |
[Java Study] 2일차 타입(프리미티브 타입) 변수 (0) | 2020.11.21 |
[aws] maven 세팅하기 (0) | 2020.08.24 |
댓글