산술 연산자
+, -, *, /, %, <<, >> : 사칙연산과 나머지 연산
비교 연산자
>, <, >=, <=, ==, != : 크고 작음과 같고 다름을 비교
논리 연산자
&&, ||, !, &, |, ^, ~ : '그리고(AND)'와 '또는(OR)'으로 조건을 연결
대입 연산자
= : 우변의 값을 좌변에 저장
기타
(type) ?: instanceof : 형변환 연산자, 삼항 연산자, instanceof연산자
x << 2 + 1 : 쉬프트연산자(<<)는 덧셈연산자보다 우선순위가 낮다. 그래서 왼쪽의 식은 ' x << ( 2 + 1 ) '과 같다.
data & 0xff == 0 : 논리연산자(&)는 비교연산자(==)보다 우선순위가 낮으므로 비교연산 후에 논리연산이 수행된다. 그래서 왼쪽의 식은 ' data & (0xFF == 0) '과 같다.
x < -1 || x > 3 && x < 5 : 논리연산자중에서 AND를 의미하는 ' && ' 가 OR을 의미하는 ' || ' 보다 우선순위가 높다. 이처럼 수식에 AND와 OR가 함께 사용되는 경우에는 다음과 같이 괄호를 사용해서 우선순위를 명확히 하는 것이 좋다. x < -1 || ( x > 3 && x < 5 )
산술변환이란, 연산 직전에 발생하는 자동 형변환이다. 산술변환의 규칙은 다음과 같다.
* 모든 연산에서 '산술 변환'이 이루어지지만, 쉬프트 연산자(<<, >>), 증감 연산자(++, --)는 예외이다.
- 이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르다면 연산 전에 형변환연산자로 타입을 일치시켜야 한다. 대부분의 경우 두 피연산자의 타입 중에서 더 큰 타입으로 일치시키는데, 그 이유는 작은타입으로 형변환하면 원래의 값이 손실될 가능성이 있기 때문이다.
* 작은 타입에서 큰 타입으로 형변환하는 경우, 자동적으로 형변환되므로 형변환 연산자를 생략할 수 있다.
- 정수형의 기본 타입인 int가 가장 효율적으로 처리할 수 있는 타입이기 때문에 int보다 작은타입인 char나 short일 경우 자동으로 int형으로 형변환된다. 이유는 오버플로우(overflow)가 발생할 가능성이 높기 때문이다.
== : 두 값이 같으면, true 아니면 false
!= : 두 값이 다르면, true 아니면 false
두 문자열을 비교할 때는, 비교 연산자 '==' 대신 equals()라는 메서드를 사용해야 한다. 비교 연산자는 두 문자열이 완전히 같은 것인지 비교할 뿐이므로, 문자열의 내용이 같은지 비교하기 위해서는 equals()를 사용하는 것이다.
String str = new String("abc");
// equals()는 두 문자열의 내용이 같으면 true, 다르면 false
boolean result = str.equals("abc"); // 내용이 같으므로 result에 true가 저장
* 대소문자를 구별하지 않고 비교하고 싶으면, equals()대신 equalsIgnoreCase()를 사용하면 된다.
|| (OR결합) : 피연산자 중 어느 한 쪽만 true이면 true를 결과로 얻는다.
&& (AND결합) : 피연산자 양쪽 모두 true이여야 true를 결과로 얻는다.
어떤 수가 2의 배수라는 애기는 2로 나누었을 때 나머지가 0이라는 뜻이다. 그래서 나머지연산의 결과가 0인지 확인하면 된다. '또는'으로 두 조건이 열결되었으므로 논리 연산자'\'(OR)을 사용해야 한다.
i%2==0 || i%3==0
i의 값이 8일 때, 위의 식은 다음과 같은 과정으로 연산된다.
8%2==0 || 8%3==0
0==0 || 2==0
true || false
true
이전 조건에 6의 배수를 제외하는 조건이 더 붙었다. 6의 배수가 아니어야 한다는 조건은 'i%6!=0'이고, 이 조건을 '&&(AND)'로 연결해야 한다.
( i%2==0 || i%3==0 ) && i%6!=0
사용자로부터 입력된 문자가 숫자('0'~'9')인지 확인하는 식은 다음과 같이 쓸 수 있다.
'0' <= ch && ch <= '9'
import java.util.Scanner;
public class OperatorEx25 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char ch = ' ';
System.out.println("문자를 하나 입력하세요.> ");
String inp = sc.nextLine();
ch = inp.charAt(0);
if('0' <= ch && ch <= '9') {
System.out.print("입력하신 문자는 숫자입니다.\n");
}
if('a' <= ch && ch <= 'z') {
System.out.print("입력하신 문자는 영문자입니다.\n");
}
}
}
이 연산자는 피연산자가 true이면 false를, false이면 true를 결과로 반환한다.
// 1번 코드보다 2번 코드가 이해하기가 더 쉽다.
ch < 'a' || ch > 'z' // 1번
!( 'a' <= ch && ch <= 'z' ) // 2번
조건 연산자는 조건식, 식1, 식2, 모두 세 개의 피연산자를 필요로 하는 삼항 연산자이며, 삼항 연산자는 조건 연산자 하나뿐이다.
result = (x > y) ? x : y; // result = (조건식) ? 식1 : 식2;
위의 문장에서 식 'x > y'의 결과가 true이면, 변수 result에는 x의 값이 저장되고, false이면 y의 값이 저장된다.
만약 x의 값이 5, y의 값이 3이라면, 이 식은 다음과 같은 과정으로 계산된다.
result = (x > y) ? x : y;
result = (5 > 3) ? 5 : 3;
result = (true) ? 5 : 3;
result = 5;
* if문 대신 조건연산자를 사용하여 코드를 간략하게 작성할 수 있다.
대입 연산자는 다른 연산자(op)와 결합하여 'op='와 같은 방식으로 사용될 수 있다. 예를 들면, 'i = i + 3'은 'i += 3'과 같이 표현될 수 있다. 그리고 결합된 두 연산자는 반드시 공백없이 붙여 써야 한다.
