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두가지로 나누어 알아보자.
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이 나오는 것이다.
가독성에 대한 이야기가 나오는 연산자 삼항연산자이다. 삼항 연산자는 조건부 if를 생략하여 변수에 값을 할당할 수 있는 연산자이다.
boolean a = (1 > 2) ? true : false;
앞의 조건부가 맞다면 true를 아니라면 false를 a에 할당한다.
비트연산자는 정수형 자료형을 bit으로 변환했을 때 나오는 값을 가지고 연산을 한다.
비트 연산자는 비트를 비교하여 연산하는 bitwise 연산, 비트를 이동시키는 bitshift연산 이렇게 2가지로 나누어볼 수 있다.
<<
연산자는 전체 비트를 왼쪽으로 이동시킨다. 이동시킬 때 맨 왼쪽의 데이터는 삭제되며 오른쪽의 새로 생긴 1의 자리수는 0으로 처리한다.>>
연산자는 전체 비트를 오른쪽으로 이동시킨다. 다만 이 연산자는 처리하는 정수형 데이터가 음수라면 왼쪽에 새로생긴 앞자리 수를 1로 생성하고 그렇지 않다면 0으로 생성한다. 맨 오른쪽의 데이터는 삭제된다.>>>
연산자는 위의 >>
데이터처럼 전체 비트를 오른쪽으로 이동시키지만 음수, 양수 구별하지 않고 오른쪽으로 이동하기만 한다. 새로 생성되는 맨 왼쪽 데이터는 무조건 0이다.기존의 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는 참조 자료형 데이터에만 사용할 수 있는 연산자이다.
사용 용도는 간단하게 말하자면 a라는 변수가 b타입이 맞는지 true, false값을 알기위한 용도이다.
int[] arr = new int[10];
System.out.println(arr instanceOf int[]);
instanceOf를 제대로 알기 위해서는 객체와 상속에 대해서 알아볼 필요가 있다. 참조 자료형 중 객체는 부모 객체, 자녀 객체같이 '상속'이 가능하다. 객체 또한 앞에서 다뤘던 것처럼 변수에 클래스를 통해서 객체 인스턴스를 할당한 것처럼 변수에 할당이 가능하다. 할당된 변수는 instanceOf로 이 클래스로 만들어진 객체인지 논리값을 알 수 있다. 여기서 instanceOf는 그 객체를 형성할 때 사용한 객체뿐 아니라 그 객체의 부모 객체 또한 true로 처리한다.
자세한건 '상속'을 공부하고 다루어야겠다.