본문 바로가기
JAVA

3주차. 연산자

by AndoneKwon 2022. 9. 2.

1. 산술 연산자

산술 연산자란 사칙연산을 다루는 연산자로 모든 연산자의 가장 기초이다.

산술 연산자는 항상 왼쪽에서 오른쪽 방향으로 이루어 진다.

산술 연산자 설명
+ 왼쪽의 피 연산자에서 오른쪽 피연산자를 더함.
- 왼쪽의 피 연산자에서 오른쪽 피연산자를 뺌
* 왼쪽의 피 연산자에서 오른쪽 피연산자를 곱합
/ 왼쪽의 피 연산자에서 오른쪽 피연산자를 나눔. 단, 0으로 나누는 경우 에러가 발생함
% 왼쪽의 피 연산자에서 오른쪽 피 연산자로 나눈 후 그 나머지를 반환함

 

2. 비트 연산자

비트 연산자는 비트(bit) 단위로 연산하기 위해서 사용되는 연산자이다.

예를들어 7이라는 숫자를 비트로 바꾸게 되면 111 로 변환된다.

비트 연산자 설명
& 대응되는 두 비트가 모두 1인 경우 1을 반환함
| 대응되는 두 비트가 둘 중 하나라도 1인 경우 1을 반환함
^ 대응되는 두 비트가 서로 다르면 1을 반환 같으면 0을 반환 함
~ 비트가 1인 경우는 0을 0인 경우는 1을 반환 함
<< 비트를 전부 왼쪽으로 이동시킴
>> 비트를 전부 오른쪽으로 이동시킴

 

3. 관계 연산자

비교 연산자라고도 부르며 수학에서의 부등호를 생각하면 된다.

관계 연산자 설명
> 왼쪽 항이 더 큰 경우 참을 반환 합니다.
< 오른쪽 항이 더 큰 경우 참을 반환합니다.
>= 왼쪽 항이 더 크거나 같으면 참을 반환합니다.
<= 오른쪽 항이 더 크거나 같을 경우 참을 반환합니다.
== 두 항이 모두 같을 경우 참을 반환 합니다.
!= 두 항이 다를 경우 참을 반환 합니다.

* 여기서 잠깐!

지난주 과제에서 Wrapper Type에 대해서 설명하였는데 이 경우에는 동등 연산이 어떻게 작동할까?

Wrapper 클래스는 Heap영역 메모리에 저장 되기 때문에 두개의 Wrapper 클래스를  동등 연산으로 비교하면 주소 값을 비교를 하게 됩니다.

따라서, 아래와 같이 동작하게 됩니다.

public class Main {
	public static void main(String arg[]) {
    	Integer num1 = new Integer(10);
        Integer num2 = new Integer(10);
        
        System.out.println(num1 == num2); // false
        System.out.println(num1.equals(num2)); // true
    }
}

객체의 동등성 비교는 따라서 equals 메서드를 사용해야하며 이는 스트링도 마찬가지 입니다.

(다만 Integer가 -127~128 사이 이거나 스트링의 경우 = 연산으로 집어 넣는 경우는 스트링 풀(상수 풀)에 저장되기 때문에(New 제외)  true라고 나오게 된다. 이 부분은 별도로 작성 예정)

 

4. instanceof

객체의 타입을 확인 하는 연산자로 형 부모 객체인지 자식객체인지를 확인이 가능하다.

형변환이 가능한지 여부를 판단해준다.

class Parents {}
class Child extends Parents {}

public class Main {
	public static void main(String arg[]) {
    	Parents parent = new Parent();
        Child child = new Child();
        
        System.out.println(partent instanceof Parents); // true
        System.out.println(partent instanceof Child); // false
        System.out.println(child instanceof Parents); // true
    }
}

 

5. Assignment(=) operator

 대입 연산자 설명
= 왼쪽의 피 연산자에 오른쪽의 피연산자를 대입함
+= 왼쪽의 피 연산자에 오른쪽의 피연산자를 더한 후, 그 결과값을 왼쪽의 피 연산자에 대입함.
-= 왼쪽의 피 연산자에 오른쪽의 피연산자를 뺀 후, 그 결과값을 왼쪽의 피 연산자에 대입함.
*= 왼쪽의 피 연산자에 오른쪽의 피연산자를 곱한 후, 그 결과값을 왼쪽의 피 연산자에 대입함.
/= 왼쪽의 피 연산자에 오른쪽의 피연산자를 나눈 후, 그 결과값을 왼쪽의 피 연산자에 대입함.
%= 왼쪽의 피 연산자에 오른쪽의 피연산자를 나머지 연산을 한 후, 그 결과값을 왼쪽의 피 연산자에 대입함.
&= 왼쪽의 피 연산자에 오른쪽의 피연산자를 And 후, 그 결과값을 왼쪽의 피 연산자에 대입함.
|= 왼쪽의 피 연산자에 오른쪽의 피연산자를 Or 후, 그 결과값을 왼쪽의 피 연산자에 대입함.
^= 왼쪽의 피 연산자에 오른쪽의 피연산자를 Not 후, 그 결과값을 왼쪽의 피 연산자에 대입함.
<<= 왼쪽의 피 연산자에 오른쪽의 피연산자를 Left Shift 후, 그 결과값을 왼쪽의 피 연산자에 대입함.
>>= 왼쪽의 피 연산자에 오른쪽의 피연산자를 Right Shift 후, 그 결과값을 왼쪽의 피 연산자에 대입함.
>>>= 왼쪽의 피 연산자에 오른쪽의 피연산자를 부호 상관 없는 Right Shift 후, 그 결과값을 왼쪽의 피 연산자에 대입함.

 

6. 화살표(->) 연산자

자바8 부터 화살표 연산자라는 새로운 연산자가 추가되었다.

람다 표현식이 추가되었으며 이 표현식을 나타내기 위하여 사용된다.

과거 람다가 없었을 시절 익명클래스는 다음과 같이 표현되었다.

Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.print("Run method");
        }
};

하지만 람다 표현식이 추가되며 다음과 같이 표현이 가능해졌다.

Runnable r = () -> System.out.println("Run Method");

이를 통하여 코드를 더 간결하게 표현이 가능해 졌다.