[Java] Operator

Syeon2·2023년 1월 10일
0

Java

목록 보기
5/5
post-thumbnail

Operator에 대해 간략한 특징들 위주로 알아보았다.

📌 Operator란?

데이터들을 산술적인 연산이나 논리적인 여부를 알아내는 연산 등 다양한 방법으로 데이터를 처리할 수 있다.

일반적으로 산술연산자 (+, -, *, /, %) 등은 기본 자료형 중 boolean을 제외한 나머지에서 모두 사용할 수 있다. 참조 자료형에서는 사용할 수 없는데 예외적으로 String에는 +연산자를 사용할 수 있다.

산술 연산자를 활용할 때 주의할 점이 있다.

byte a = 100;
byte b = 120;

byte mid = (a + b) / 2;

a와 b의 중간값을 구하려고 할 때 무턱대고 a와 b를 더해서 2로 나눠야지~ 생각할 수 있지만.. 약간 위험하다. 왜냐하면 a와 b를 더한 값이 byte의 최대 범위 안에 들어오면 문제가 없겠지만 위에서는 a와 b를 더한 순간 byte의 범위를 넘었기 때문이다. IDE를 사용하면 바로 컴파일 에러가 발생한다.

산술 연산자를 사용할 때는 꼭 정수형 범위의 데이터 범위를 체크하고 사용하는 습관을 기르자! (알고리즘 풀이 때도 간간히 등장한다.)

산술 연산자 우선 순위로는
1. 단항연산자 (++, --, +, -, !, ~)
2. 산술연산자1 (*, /, %)
3. 산술연산자2 (+, -)


🌱 논리 연산자

논리 연산자는 2두가지로 나누어 알아보자.

  1. &&, || : &&과 ||는 2가지 조건을 비교하여 그에 맞게 true, false로 처리된다. 이 때 아래의 2번과 다른점은 &&과 ||은 첫 조건에서 만족하지 못한다면 바로 그 다음 조건의 연산을 하지 않는다.
int a = 0;
int b = 0;

if (a++ == 0 || b++ == 0) {
	System.out.print("Good");
}

System.out.println(a);
System.out.println(b);

위의 예제에서 출력이 어떻게 될까?? 바로 Good, 1, 0이다.
왜냐하면 a++는 ++가 a를 참조하고 난 이후에 +1이되기 때문에 조건의 a++ == 0은 참이다. 여기서 ||는 앞에서 이미 true가 나왔기 때문에 뒤의 코드는 읽지 않아도 전체 조건에 대한 결과는 true이다. 그렇기 때문에 b++에 대한 연산은 아예 하지 않고 넘어가 Good, 1, 0이 나오는 것이다.

  1. &, |, ^ : 반면에 2번 연산자들은 위의 1번 연산자들과 다르게 조건들을 무조건적으로 검사한다. 코드의 실행을 조금이나마 단축시키기 위해서는 위의 연산자들을 이용하는 것이 효과적일 것이다. 또한 이 연산자들은 하나의 특징이 하나 더 있다. 어디선가 봤던 것 같지만 바로 산술연산자의 비트연산자와 동일하다. 2번 연산자들은 정수 연산일 경우 비트연산을, 조건 연산일 경우에는 논리 연산을 수행한다.

🌱 삼항 연산자

가독성에 대한 이야기가 나오는 연산자 삼항연산자이다. 삼항 연산자는 조건부 if를 생략하여 변수에 값을 할당할 수 있는 연산자이다.

boolean a = (1 > 2) ? true : false;

앞의 조건부가 맞다면 true를 아니라면 false를 a에 할당한다.


🌱 비트 연산자

비트연산자는 정수형 자료형을 bit으로 변환했을 때 나오는 값을 가지고 연산을 한다.

비트 연산자는 비트를 비교하여 연산하는 bitwise 연산, 비트를 이동시키는 bitshift연산 이렇게 2가지로 나누어볼 수 있다.

  1. bitwise : &(AND), |(OR), ^(XOR)
    bitwise 연산자들은 서로의 비트로 변환되었을 때의 값과 비교하여 처리한다.
    &(AND)연산자는 두 이진수를 자리수마다 비교했을 때 두 수의 같은 자리수를 비교하며 두개 다 1이어야 그 자리수는 1로 처리한다.
    |(OR)연산자는 AND와 다르게 둘중 하나만 1이어도 그 자리수는 1로 처리한다.
    ^(XOR)연산자는 두 수의 같은 자리수가 동일하면 0, 다르다면 1으로 처리한다.
  2. bitshift : >>, <<, >>>
    bitshift연산자는 정수형 데이터 하나에 얼만큼 해당 방향으로 비트를 이동시킬건지를 처리한다.
    <<연산자는 전체 비트를 왼쪽으로 이동시킨다. 이동시킬 때 맨 왼쪽의 데이터는 삭제되며 오른쪽의 새로 생긴 1의 자리수는 0으로 처리한다.
    >>연산자는 전체 비트를 오른쪽으로 이동시킨다. 다만 이 연산자는 처리하는 정수형 데이터가 음수라면 왼쪽에 새로생긴 앞자리 수를 1로 생성하고 그렇지 않다면 0으로 생성한다. 맨 오른쪽의 데이터는 삭제된다.
    >>>연산자는 위의 >>데이터처럼 전체 비트를 오른쪽으로 이동시키지만 음수, 양수 구별하지 않고 오른쪽으로 이동하기만 한다. 새로 생성되는 맨 왼쪽 데이터는 무조건 0이다.

🌱 Java13 Switch Operator

기존의 switch 문이 바뀐 것이 아닌 switch operator은 Java 13버전에 새로 생긴 개념이다.

기존의 switch문을 사용하려면 다음과 같이 써야했다.

String date = "Monday";

switch(date) {
	case "Monday":
    case "Tuesday":
    case "Wednesday:
    	System.out.println("So hard");
        break;
    case "Thursday":
    case "Firday":
    	System.out.println("Good");
        break;
    case "Saterday":
    case "Sunday:
    	System.out.println("Very Good);
        break;
    default:
    	break;
}

이런 식으로 switch를 사용했다.
하지만 Java 13의 switch를 사용하면 (->)화살표 연산자와 yield를 추가적으로 볼 수 있다. (yield는 switch operator에서 사용할 수 있는 return이다.)

String date = "Monday";

switch(date) {
	case "Monday", "Tuesday", "Wednesday" -> System.out.println("So hard");
    case "Thursday", "Firday" -> System.out.println("Good");
    case "Saturday", "Sunday" -> System.out.println("Very Good");
    default -> System.out.println("Not Date");
}

String a = switch(date) {
	case "Monday", "Tuesday", "Wednesday" -> {
    	yield "So hard";
    }
    case "Thursday", "Firday" -> {
    	yield "Good";
    }
    case "Saturday", "Sunday" -> {
    	yield "Very Good";
    }
    default -> {
        yield  "Not Date";
    }
};

🌱 InstanceOf

instanceOf는 참조 자료형 데이터에만 사용할 수 있는 연산자이다.
사용 용도는 간단하게 말하자면 a라는 변수가 b타입이 맞는지 true, false값을 알기위한 용도이다.

int[] arr = new int[10];
System.out.println(arr instanceOf int[]);

instanceOf를 제대로 알기 위해서는 객체와 상속에 대해서 알아볼 필요가 있다. 참조 자료형 중 객체는 부모 객체, 자녀 객체같이 '상속'이 가능하다. 객체 또한 앞에서 다뤘던 것처럼 변수에 클래스를 통해서 객체 인스턴스를 할당한 것처럼 변수에 할당이 가능하다. 할당된 변수는 instanceOf로 이 클래스로 만들어진 객체인지 논리값을 알 수 있다. 여기서 instanceOf는 그 객체를 형성할 때 사용한 객체뿐 아니라 그 객체의 부모 객체 또한 true로 처리한다.
자세한건 '상속'을 공부하고 다루어야겠다.

profile
공부한 것을 기록합니다📝

0개의 댓글