자바가 제공하는 다양한 연산자 이해하기
산술 연산자
연산 | 연산자 |
덧셈 | + |
뺄셈 | - |
곱셈 | x |
나눗셈 | / |
나머지 | % |
int num1 = 7;
int num2 = 3;
System.out.println(num1 + num2); // 10
System.out.println(num1 - num2); // 4
System.out.println(num1 * num2); // 21
System.out.println(num1 / num2); // 2
System.out.println(num1 % num2); // 1
// 오버플로우 안나게 중간값 계산하는 방법
int start = 2_000_000_000;
int end = 2_100_000_000;
// int mid = (start + end) / 2; 오버플로우남
int mid = start + (end - start) / 2;
System.out.println(mid);
mid = (start + end) >>> 1; // 비트연산자 이용해서 중간값 계산하기
System.out.println(mid);
비트 연산자
피연산자를 비트단위로 논리 연산한다
연산자 | 논리 | 설명 |
& | AND | 양 쪽 비트 모두 1이어야 결과로 1을 얻는다. 그 외에는 0을 얻는다 |
| | OR | 대응되는 비트 중 한 쪽 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다 |
^ | XOR | 대응되는 비트 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다 |
~ | NOT | 비트 값을 바꾼다. 논리 부정 연산자 !와 유사하다 |
<< | left shift | 명시된 수만큼 비트들을 전부 왼쪽으로 이동시킨다 |
>> | right shift | 부호를 유지하며 지정한 수만큼 비트를 오른쪽으로 이동시킨다 |
>>> | shift | 지정한 수만큼 비트를 오른쪽으로 이동시킨다, 새로운 비트는 모두 0이 된다 |
쉬프트 연산자 <<, >>
10진수 -8은 2진수로 11111000이다
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
8 << 2는 8의 2진수를 왼쪽으로 2칸 움직인다 (빈칸은 0으로 채운다)
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
8 >> 2는 8의 진수를 오른쪽으로 2칸 움직인다 (빈칸은 최상위 부호비트와 같은 값으로 채워진다)
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
8 >>> 2는 8의 2진수를 오른쪽으로 2칸 움직인다 (빈칸은 0으로 채운다)
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 |
x << n 은 x * 2 의 결과와 같다
x >> n 은 x / 2 의 결과와 같다
+, - 와 같은 산술 연산자보다 프로그램 실행속도가 빠르지만 가독성은 떨어진다
보다 빠른 실행이 요구되어질때 적절하게 사용하는 것이 좋
관계 연산자
연산자 | 설명 |
> | 왼쪽이 크면 true |
< | 왼쪽이 작으면 true |
≥ | 왼쪽이 더크거나 같으면 true |
≤ | 왼쪽이 더작거나 같으면 true |
== | 두 항의 값이 같으면 true |
≠ | 두 항의 값이 다르면 true |
논리 연산자
연산자 | 논리 | 설명 |
&& | 곱 | 두 항이 모두 true면 true |
|| | 합 | 두 항중 하나라도 true면 true |
! | 부정 | 참인경우 false 거짓인경우 true |
public static void main(String[] args) {
// ||과 | 차이 연산결과
int i = 0;
int j = 0;
if (i++ == 0 || j++ == 0) {
System.out.println("Hello");
}
System.out.println(i);
System.out.println(j);
// i = 1 이 되고 j = 0인 상태다
i = 0;
j = 0;
if (i++ == 0 | j++ == 0) {
System.out.println("World");
}
System.out.println(i);
System.out.println(j);
// i = 1, j = 1인 상태가 된다
}
instanceof 객체 타입 확인
객체 타입 확인하는 연산자
형변환 가능 여부를 확인해 boolean(true / false)
반환한다
주로 상속 관계에서 부모객체인지 자식 객체인지 확인하는데 사용
'객체 instanceof 클래스' 를 선언해서 사용함
=> '객체'는 '클래스'로 형변환 할수 있나요?
예시.
class Parent{}
class Child extends Parents{}
public class InstanceofTest {
public static void main(String[] args) {
Parent parent = new Parent();
Child child = new Child();
System.out.println(parent instanceof Parent); // true
System.out.println(child instanceof Parent); // true
System.out.println(parent instanceof Child); // false
System.out.println(child instanceof Child); // true
}
}
assignment(=) operator 대입 연산자
변수에 값을 대입할 때 사용하는 이항 연산자
연산자 | 설명 |
= | 왼쪽 변수에 오른쪽 값 대입 |
+= | 왼쪽 변수에 오른쪽 값 더한 후, 그 결과값 왼쪽 변수에 대입 |
-= | 왼쪽 변수에서 오른쪽 값 뺀 후, 그 결과값 왼쪽 변수에 대입 |
*= | 왼쪽 변수에 오른쪽 값 곱한 후, 그 결과값 왼쪽 변수에 대입 |
/= | 왼쪽 변수에 오른쪽 값 나눈 후, 그 결과값 왼쪽 변수에 대입 |
%= | 왼쪽 변수에 오른쪽 값 나눈 후, 그 나머지 왼쪽 변수에 대입 |
&= | 왼쪽 변수에 오른쪽 값과 비트 AND 연산 후, 그 결과값 왼쪽 변수에 대입 |
l= | 왼쪽 변수에 오른쪽 값과 비트 OR 연산 후, 그 결과값 왼쪽 변수에 대입 |
^= | 왼쪽 변수에 오른쪽 값과 비트 XOR 연산 후, 그 결과값 왼쪽 변수에 대입 |
<<= | 왼쪽 변수에 오른쪽 값만큼 왼쪽 시프트 후, 그 결과값 왼쪽 변수에 대입 |
>>= | 왼쪽 변수에 오른쪽 값만큼 부호 그대로 오른쪽 시프트 후, 그 결과값 왼쪽 변수에 대입 |
>>>= | 왼쪽 변수에 오른쪽 값만큼 부호상관없이 오른쪽 시프트 후, 그 결과값 왼쪽 변수에 대입 |
화살표(->) 연산자
Java8 에서 람다 표현식이 추가되면서, 람다 표현식을 구성하는 데 사용하는 화살표 연산자가 등장함
익명클래스 대신 사용하며 간결하고 읽기 쉬워졌다
예제.
익명클래스 만들기
Runnable r = new Runnable() {
@Override
public void run() {
System.out.print("Run method");
}
};
-> 화살표 연산자로 바꾸기(람다 표현식 사용하기)
Runnable r = () -> System.out.print("Run method");
메서드 구현하기
interface Drawable{
public void draw();
}
public class Main{
public static void main(String[] args) {
int width = 20;
Drawable d2 = () -> {
System.out.println("Drawing width: "+ width);
}
d2.draw();
}
}
3항 연산자
true / false 를 판단할 수 있는 변수나 조건식을 작성후 연산 결과에 해당하는 true, false에 실행되는 표현식을 작성하면 된다
코드를 좀 더 간결하게 작성할 수 있지만 속도는 변함없고, 잘못 사용할 경우 오히려 가독성을 해칠수 있다
연산자 우선 순위
괄호 > 산술 > 비교 > 논리 > 대입. (단항 > 이항 > 삼항)
(optional) Java 13. switch 연산자
Java 13 버전부터 switch operator 함수가 새롭게 생겼다(기존 switch 문은 그대로 있으며 새롭게 생긴거다)
lambda를 사용할수 있어졌으며 case “first” → System.out.println(”ok”);
와 같이 가능해졌으며 ‘ : ‘ 와 혼동해서 사용할수는 없다
예시 1
public static void main(String [] args) {
String str = "hello";
int value = switch (str) {
case "hi_How_are_you":
System.out.println("I am not just str!");
yield 1;
case "hello":
System.out.println("Me too.");
default:
System.out.println("OK");
yield -1;
};
}
// 출력 결과 : Me too
switch의 리턴값을 반환 할 수 있게 되었으며 yield 라는 산출값을 리턴할수 있다(예전 break 대신 yield 사용)
예시 2
int num = 2;
String result = switch (num) {
case 1 -> "One";
case 2 -> "Two";
case 3 -> "Three";
default -> "Other";
};
System.out.println(result); // 출력 결과: "Two"
참조
'TIL > 백기선 온라인 자바 스터디' 카테고리의 다른 글
5주차. 클래스 (1) | 2023.10.15 |
---|---|
4주차-2. live-study 대시 보드를 만들기 (0) | 2023.08.26 |
4주차 -1. Junit5, 제어문 학습, Linkedlist, Stack, Queue 구현 (0) | 2023.08.26 |
2주차. 자바 데이터 타입, 변수, 배열 이해하기 (1) | 2023.05.16 |
1주차. 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기 (1) | 2023.03.04 |