연산자는 '연산을 수행하는 기호'이다. 피연산자는 연산의 대상이다.
그래서 연산자는 연산을 수행한 후 반드시 결과값을 반환한다.
y = x + 6
위와 같은 식에서 +
는 덧셈 연산자이고 =
는 대입 연산자이다.
덧셈 연산자는 두 값을 더한 결과를 반환하므로, 두 개의 피연산자를 필요로 한다. 따라서 x
와 6
이 피연산자이다. 대입 연산자는 우변의 값을 좌변에 저장하고 저장된 값을 연산결과로 반환한다. 그러므로 x+6
의 결과값인 한 개의 피연산자를 갖는다.
이처럼 피연산자의 개수에 따라 '단항 연산자', '이항 연산자', '삼항 연산자'로 구분한다. 아래에 설명할 대입 연산자와 증감 연산자가 단항 연산자이고, 조건 연산자가 삼항 연산자이다. 그 외 연산자들은 모두 이항 연산자이다.
사칙연산과 나머지연산을 수행하여 그 결과값을 반환한다.
연산자 | 설명 |
---|---|
+ | 덧셈연산을 수행한다 |
- | 뺄셈연산을 수행한다 |
* | 곱셈연산을 수행한다 |
/ | 나눗셈연산을 수행한다 |
% | 나머지연산을 수행한다 |
int a = 10
int b = 3
int c1 = a + b // c1의 값은 13이다.
int c2 = a - b // c2의 값은 7이다.
int c3 = a*b // c3의 값은 30이다.
int c4 = a/b // c4의 값은 3이다.
int c5 = a%b // c5의 값은 1이다.
오른쪽의 값을 왼쪽에 대입한다.
연산자 | 설명 |
---|---|
= | 오른쪽의 값을 왼쪽에 대입한다. |
+= | 더한 값을 대입한다. |
-= | 뺀 값을 대입한다. |
*= | 곱한 값을 대입한다. |
/= | 나눈 값을 대입한다. |
%= | 나머지 값을 대입한다. |
int a = 10
int b = 10
int c = 10
int d = 10
int e = 10
a += 10 // a의 값은 20이다.
b -= 10 // b의 값은 0이다.
c *= 3 // c의 값은 30이다.
d /= 3 // d의 값은 3이다.
e % = 3 // e의 값은 1이다.
변수의 값을 1증가시키거나 1감소시킨다.
연산자 | 설명 |
---|---|
++ | 변수의 값을 1증가시킨다. |
-- | 변수의 값을 1감소시킨다. |
int a = 10
int b = 10
a++ // a의 값은 11이다.
b-- // b의 값은 9다.
++a // a의 값은 12다.
--b // b의 값은 8이다.
증감 연산자가 피연산자의 왼쪽에 위치하면 '전위형', 오른쪽에 위치하면 '후위형'이다. 증감 연산자의 위치에 따라 결과값에 차이가 있다. 다음의 예제를 보자
public class Op {
public static void main(String[] args) {
int i = 5;
int j = 0;
j = i++;
System.out.println(i); // i는 6 출력
System.out.println(j); // j는 5 출력
i = 5;
j = 0;
j = ++i;
System.out.println(i); // i는 6 출력
System.out.println(j); // j는 6 출력
}
}
출력을 보면 i
값은 두 경우 모두 1이 증가되어 같지만 j
값은 그렇지 않다. 전위형은 피연산자의 값(i
)을 먼저 증가시킨 후 j
에 대입하지만, 후위형은 먼저 j
에 i
의 값을 대입시킨 후 i
를 증가시킨다.
두 값을 비교해서 비교 결과를 boolean 타입의 값으로 반환한다.
연산자 | 설명 |
---|---|
> | 좌항의 값이 우항의 값보다 크면 연산결과는 true다. |
>= | 좌항의 값이 우항의 값보다 크거나 같으면 연산결과는 true다. |
< | 좌항의 값이 우항의 값보다 작으면 연산결과는 true다. |
<= | 좌항의 값이 우항의 값보다 작거나 같으면 연산결과는 true다. |
== | 좌항의 값이 우항의 값과 서로 일치하면 연산결과는 true다. |
!= | 좌항의 값이 우항의 값과 서로 일치하지 않으면 연산결과는 true다. |
int a = 3
int b = 3
int c = 5
boolean result1 = a > b // result1의 값은 false다.
boolean result2 = a >= b // result2의 값은 true다.
boolean result3 = a < c // result3의 값은 true다.
boolean result4 = a <= c // result4의 값은 true다.
boolean result5 = a == b // result5의 값은 true다.
boolean result6 = a == c // result6의 값은 false다.
boolean result7 = a != b // result7의 값은 false다.
boolean result8 = a != c // result8의 값은 true다.
두 문자열을 비교할 때는, 비교 연산자 ==
대신 equals()
메소드를 사용하는게 좋다. 이유는 ==
와 equals()
메서드의 비교 방식이 다르기 때문이다. 어떤 방법을 사용하느냐에 따라 같은 문자열을 비교해도 결과값이 달라진다. 더 자세한 내용은 뒤에서 배우게 될테니 일단 넘어가도록 한다.
public class OpApp {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
boolean result1 = str1 == str2;
boolean result2 = str1 == str3;
boolean result3 = str1.equals(str3);
System.out.println(result1); // true
System.out.println(result2); // false
System.out.println(result3); // true
}
}
논리곱, 논리합, 논리부정에 대한 연산을 수행하여 결과를 boolean타입의 값으로 반환한다. 피연산자로 boolean타입 또는 boolean타입을 결과로하는 조건식만을 허용한다. 일반적으로 명제논리에서 쓰이는 것과 같이 사용한다.
연산자 | 설명 |
---|---|
&& | AND (논리곱) |
|| | OR (논리합) |
! | NOT (부정) |
^ | XOR (배타적 논리합) |
public class OpApp {
public static void main(String[] args) {
// 유상수리 여부는 운행거리가 50000km을 초과하거나 사용기간이 3년 이상인 차량으로 한다.
int distance = 35000; // 운행거리(km)
int usedYear = 3; // 사용기간(년)
boolean result = distince > 50000 || usedYear >= 3;
// result에 true가 대입된다.
System.out.println("유상수리 여부: " + result);
// "유상수리 여부: true"가 출력된다.
}
}
다음은 논리 연산자를 사용할 때 주의해야 할 점들이다.
x
는 10보다 크고, 20보다 작다.
두 조건문이 AND로 연결되었으므로 다음과 같이 쓸 수 있다.
x > 10 && x < 20
또는 10 < x && x < 20
.
보통은 변수를 왼쪽에 쓰지만 두 번째 식처럼 표현하는게 가독성이 좋다. 그러나 두 번째 식에서 논리연산자를 생략하고 10 < x < 20
와 같이 표현하는 것은 허용되지 않는다.
i
는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.
OR로 연결된 두 조건문에 AND로 다른 하나의 조건문이 결합된 문장이다. 이 문장은 다음과 같이 표현할 수 있다.
(i%2==0 || i%3==0) && i%6!=0
.
만일 앞의 두 조건을 괄호로 묶지 않으면 &&
를 먼저 연산한다. &&
가 ||
보다 우선순위가 높기 때문이다.
제시된 조건식이 true 혹은 false 중에서 무엇으로 판정되느냐에 따라 연산결과값이 달라지는 연산자다.
조건 연산자
변수 = 조건식 ? 값1 : 값2;
* 조건식이 true으로 판정되면 값1을 반환하고 변수에 대입한다.
* 조건식이 false로 판정되면 값2를 반환하고 변수에 대입한다.
public class OpApp {
public static void main(String[] args) {
int score = 90;
String result = score >= 60 ? "합격" : "불합격";
// result에는 "합격"이 대입된다.
System.out.println("판정결과: " + result);
// "판정결과: 합격"이 출력된다.
}
}
식에 사용된 연산자가 둘 이상인 경우, 연산자의 우선순위에 의해서 연산순서가 결정된다. 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다는 것은 상식적으로 알고 있는 내용이다. 아래의 표를 통해 확인해보자.
산술 연산자의 우선순위를 나타내기 위한 관례(Convention)는 다음과 같다.
(*, /, %)
가 (+, -)
보다 우선순위가 높음을 나타낸다.
x + y
x - y
x*y
x/y
x%y
하나의 식에 같은 우선순위의 연산자들이 여러 개 있는 경우, 결합규칙에 따라 연산을 수행한다.
(a) 3 + 4 - 5
(b) x = y = 3
식 (a)의 산술 연산자의 결합규칙은 왼쪽에서 오른쪽이다. 따라서 3+4
를 먼저 계산하고 그 결과인 7
을 5
와 뺄셈한다.
식 (b)의 대입 연산자는 결합규칙이 오른쪽에서 왼쪽이다. 따라서 y=3
이 먼저 수행되어 y
에 3
이 저장된 후, x=3
이 수행되어 x
에 3
이 저장된다.
우선순위와 결합규칙을 정리하면 다음과 같다.