+,-,*,/와 같이 계산을 수행하는 기호를 연산자라 한다. 자바에는 다음과 같은 다양한 연산자가 있다.
연산자 종류
산술 연산자 +,-,*,/,%(나머지 연산자)
증감(증가 및 감소 연산자) : ++, --
비교 연산자 : ==, !=, >, <, >=, <=
논리 연산자 : && (AND), ||(OR), !(NOT)
대입 연산자 : =, +=, -=, *=, /=, %=
삼항 연산자 : ? :
package operator;
public class Operator1 {
public static void main(String[] args) {
// 변수 초기화
int a = 5;
int b = 2;
// 덧셈
int sum = a + b;
System.out.println("sum = " + sum); // 출력 : a + b = 7
// 뺄셈
int sub = a - b;
System.out.println("sub = " + sub); // 출력 : a - b = 3
// 곱셈
int mul = a * b;
System.out.println("mul = " + mul); // 출력 : a * b = 10
// 나눗셈
int div = a / b;
System.out.println("div = " + div); // 출력 : a / b = 2
// 나머지
int mod = a % b;
System.out.println("mod = " + mod); // 출력 : a % b = 1
}
}
실행 결과
sum = 7
sub = 3
mul = 10
div = 2
mod = 1
5/2의 결과는 2.5가 되어야 하지만 결과는 소수점이 제거된 2 가 나왔다.int형끼리 계산하면 계산 결과도 같은 int형을 사용한다. int형은 정수이기 때문에 소수점 이하를 포함할 수 없다.%) : 이름 그대로 나머지를 구하는 연산자이다. 5 / 2는 몫이 2 나머지가 1이다. 따라서 나머지 연산자 5 % 2의 결과는 1이 된다.주의!! 0으로 나누기
10 / 0 과 같인 숫자는 0으로 나눌 수 없다. (수학에서 허용하지 않는다.)
방금 예제에서 변수 b = 0을 대입하면 5 / 0이 된다. 이 경우 프로그램에 오류가 발생한다.
Exception in thread "main" java.lang.ArithmeticException: / by zero at operator.Operator1.main(Operator1.java:24)
+연산자를 사용할 수 있다. 문자열에 +연산자를 사용하면 두 문자를 연결할 수 있다.package operator;
public class Operator2 {
public static void main(String[] args) {
//문자열과 문자열 더하기
String result1 = "hello" + " world";
System.out.println("result1 = " + result1);
//문자열과 문자열 더하기2
String s1 = "string1";
String s2 = "string2";
String result2 = s1 + s2;
System.out.println("result2 = " + result2);
//문자열과 숫자 더하기
String result3 = "a + b = " + 10;
System.out.println("result3 = " + result3);
//문자열과 숫자 더하기
int num = 20;
String str = "a + b = " ;
String result4 = str + num;
System.out.println("result4 = " + result4);
}
}
실행 결과
result1 = hello world
result2 = string1string2
result3 = a + b = 10
result4 = a + b = 20
문자열과 숫자 더하기1
다음 식은 문자열과 숫자를 더한다. 자바에서 문자와 숫자를 더하면 숫자를 문자열로 변경한 다음에 서로 더한다.
"a + b = " + 10
문자 "a + b = "
숫자 : 10
계산 과정
"a + b = "(String) + 10(int) //문자열과 숫자 더하기
"a + b = "(String) + "10"(int -> String) //숫자를 문자열로 변경
"a + b = " + "10" //문자열과 문자열 더하기
"a + b = 10" //결과
문자열과 숫자 더하기2
int num = 20;
String str = "a + b = " ;
String result4 = str + num;
System.out.println(result4);
"a + b = 20" //결과
마찬가지로 변수에 담겨 있어도 문자와 숫자를 더하면 문자가 된다.
즉 자바는 문자열은 String 타입에 다른 타입을 더하는 경우 대상 타입을 문자열로 변경한다. 쉽게 이야기해서 문자열에 더하는 것은 다 문자열이 된다.
| 우선순위 | 연산자 | 설명 | 결합 방향 |
|---|---|---|---|
| 1 | (), [], . | 괄호, 배열 접근, 멤버 접근 | 왼→오 |
| 2 | ++, -- | 단항 증가/감소 (후위) | 왼→오 |
| 3 | ++, --, +, -, ~, ! | 단항 연산자 (전위), 부호 연산, 비트 NOT, 논리 NOT | 오→왼 |
| 4 | new, (타입) | 객체 생성, 형변환 | 오→왼 |
| 5 | *, /, % | 곱셈, 나눗셈, 나머지 | 왼→오 |
| 6 | +, - | 덧셈, 뺄셈 | 왼→오 |
| 7 | <<, >>, >>> | 비트 이동 | 왼→오 |
| 8 | <, <=, >, >=, instanceof | 비교, instanceof 연산자 | 왼→오 |
| 9 | ==, != | 동등 비교 | 왼→오 |
| 10 | & | 비트 AND | 왼→오 |
| 11 | ^ | 비트 XOR | 왼→오 |
| 12 | ` | ` | 비트 OR |
| 13 | && | 논리 AND | 왼→오 |
| 14 | ` | ` | |
| 15 | ? : | 삼항 연산자 | 오→왼 |
| 16 | =, +=, -=, *=, /=, %=, &=, ^=, ` | =, <<=, >>=, >>>=` | 대입 연산자 |
증가 및 감소 연산자를 줄여서 증감 연산자라 한다.
증감 연산자는 ++와 --로 표현되며, 이들은 변수의 값을 1만큼 증가시키거나 감소시킨다.
전위, 후의 증감 연산자
증감 연산자는 피연산자 앞에 두거나 뒤에 둘 수 있으며, 연산자의 위치에 따라 연산이 수행되는 시점이 달라진다.
++a: 증감 연산자를 피연산자 앞에 둘 수 있다. 이것을 앞에 있다고 해서 전위(Prefix) 증감 연산자라 한다.
a++: 증감 연산자를 피연산자 뒤에 둘 수 있다. 이것을 앞에 있다고 해서 후위(Postfix) 증감 연산자라 한다.
package operator;
public class OperatorAdd2 {
public static void main(String[] args) {
//전위 증감 연산자 사용 예
int a = 1;
int b = 0;
b = ++a; // a의 값은 먼저 증가시키고, 그 결과를 b에 대입합니다.
System.out.println("a = " + a + ", b = " + b); // 결과: a = 2, b = 2
//후위 증감 연산자 사용 예
a = 1; // a를 다시 1로 초기화
b = 0; // b를 다시 0으로 초기화
b = a++; // a의 값을 먼저 b에 대입하고, 그 다음 a의 값을 증가시킵니다.
System.out.println("a = " + a + ", b = " + b); // 결과: a = 2, b = 1
}
}
실행 결과
a = 2, b = 2
a = 2, b = 1
==: 동등성(equal to)
!=: 불일치(not equal to)
>: 크다(greater than)
<: 작다(less than)
>=: 크거나 같다(greater than or equal to)
<=: 작거나 같다(less than or equal to)
비교 연산자를 사용하면 참(true)또는 거짓(false)이라는 결과가 나온다. 참 거짓은 boolean형을 사용한다.
여기서 주의할 점은 =와 ==(=x2)이 다르다는 점이다.
=:대입 연산자, 변수에 값을 대입한다.
==:동등한지 확인하는 비교 연산자
문자열 비교
문자열이 같은지 비교할 때는 ==이 아니라 .equals() 메서드를 사용해야 한다.
==를 사용하면 성공할 때도 있지만 실패할 때도 있다.
package operator;
public class Comp2 {
public static void main(String[] args) {
String str1= "문자열1";
String str2= "문자열2";
boolean result1 = "hello".equals("hello"); //리터럴 비교
boolean result2 = str1.equals("문자열1"); //문자열 변수, 리터럴 비교
boolean result3 = str1.equals(str2); //문자열 변수 비교
System.out.println("result1 = " + result1);
System.out.println("result2 = " + result2);
System.out.println("result3 = " + result3);
}
}
실행 결과
result1 = true
result2 = true
result3 = false
boolean형인 true, false를 비교하는데 사용한다.&&(그리고) : 두 피연산자가 모두 참이면 참을 반환, 둘중 하나라도 거짓이면 거짓을 반환
||(또는) : 두 피연산자가 중 하나라도 참이면 참을 반환, 둘다 거짓이면 거짓을 반환
!(부정) : 피연산자의 논리적 부정을 반환. 즉, 참이면 거짓을, 거짓이면 참을 반환
package operator;
public class Logical1 {
public static void main(String[] args) {
System.out.println("&&: AND 연산");
System.out.println("true && true : " + (true && true));
System.out.println("true && false : " + (true && false));
System.out.println("false && false : " + (false && false));
System.out.println("||: OR 연산");
System.out.println("true || true : " + (true || true));
System.out.println("true || false : " + (true || false));
System.out.println("false || false : " + (false || false));
System.out.println("!: NOT 연산");
System.out.println("!true : " + (!true));
System.out.println("!false : " + (!false));
System.out.println("변수 활용");
boolean a = true;
boolean b = false;
System.out.println("a && b : " + (a && b));
System.out.println("a || b : " + (a || b));
System.out.println("!a : " + (!a));
System.out.println("!b = " + (!b));
}
}
실행 결과
&&: AND 연산
true && true : true
true && false : false
false && false : false
||: OR 연산
true || true : true
true || false : true
false || false : false
!: NOT 연산
!true : false
!false : true
변수 활용
a && b : false
a || b : true
!a : false
!b = true
=)는 값을 변수에 할당하는 연산자다. 이 연산자를 사용하면 변수에 값을 할당할 수 있다.int a = 1는 a라는 변수에 1이라는 값을 할당한다.축약(복학) 대입 연산자
산술 연산자와 대입 연산자를 한번에 축약해서 사용할 수 있는데, 이것을 축약(복합) 대입 연산자라 한다.
연산자의 종류: +=, -=, *=, /=, %=
package operator;
public class Assign1 {
public static void main(String[] args) {
int a = 5; // 5
a += 3; // 8 ( 5 + 3 ) : a = a + 3;
a -= 2; // 6 ( 8 - 2 ) : a = a - 2;
a *= 4; // 24 ( 6 * 4 ) : a = a * 4;
a /= 3; // 8 ( 24 / 3 ) : a = a / 3;
a %= 5 ; // 3 ( 8 % 5 ) : a = a % 5;
System.out.println("a = " + a);
}
}
실행 결과
a = 3
자주 사용하는 연산자
| 종류 | 연산자 | 설명 |
|---|---|---|
| 산술 연산자 | +, -, *, /, % | 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 |
| 증가 및 감소 연산자 | ++, -- | 값 1 증가/감소 |
| 비교 연산자 | ==, !=, >, <, >=, <= | 값 비교 |
| 논리 연산자 | &&, ` | |
| 대입 연산자 | =, +=, -=, *=, /=, %= | 변수에 값 할당 및 연산 |
추가적으로 자주 사용하는 연산자
| 종류 | 연산자 | 설명 |
|---|---|---|
| 삼항 연산자 | ? : | 조건에 따라 값 선택 |
| instanceof 연산자 | instanceof | 객체 타입 확인 |
| 기타 | new, [], ., () | 객체 생성, 배열 인덱스, 객체 멤버 접근, 메서드 호출 |
비트 연산자 (실무에서 거의 사용되지 않음)
| 종류 | 연산자 | 설명 |
|---|---|---|
| 비트 연산자 | &, ` | , ^, ~, <<, >>, >>>` |