ㄴㅏ랏말ㅆ.ㅁㅣ
article thumbnail

자바가 제공하는 다양한 연산자 이해하기

산술 연산자

연산 연산자
덧셈 +
뺄셈 -
곱셈 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"

참조

profile

ㄴㅏ랏말ㅆ.ㅁㅣ

@동여우

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그