자바에는 여러가지 종류의 연산자가 있다.
- 기본연산자
- 복합 대입 연산자
- 단항 연산자
- 비교 연산자
- 논리 연산자
- 삼항 연산자
비트 연산자(추후 업데이트)instanceof(추후 업데이트)
1. 기본 연산자
기본 연산자는 boolean을 제외한 기본 자료형을 더하거나 빼는 등의 계산을 위해 사용한다. 참조 자료형은 기본적으로 연산자를 사용할 수 없지만, 예외적으로 String클래스만 + 연산이 가능하다.
- 대입 연산자(=)
- int a = 3;
- 왼쪽의 변수에 오른쪽의 값을 할당(대입)할때 사용.
- 기본 연산자(+, -, *, /, %)
- +, - : 양쪽의 값을 더하거나 뺀다.
- *, / : 양쪽의 값을 곱하거나 나눈다.
- % : 왼쪽의 값을 오른쪽의 값으로 나눈 나머지 구한다.
public class BasicOperator {
public static void main(String[] args) {
int a = 3;
int b = 2;
System.out.println(a+b); // 결과 : 5
System.out.println(a-b); // 결과 : 1
System.out.println(a*b); // 결과 : 6
System.out.println(a/b); // 결과 : 1(?)
System.out.println(a%b); // 결과 : 1
// String +연산
String name = "molt";
String birth = "6월 5일";
System.out.println(name+" "+birth); // 결과 : molt 6월 5일
// 나눗셈 연산은 실수형 타입(double, float로 처리해야 그나마 정상적으로 출력됨.)
double a1 = 3;
double b1 = 2;
double result = a1/b1;
System.out.println(result); // 결과 : 1.5
}
}
▷ String의 + 연산은 문자열을 '이어붙이는' 결과가 나타난다.
▷나눗셈의 경우 소수형태의 자료형(double, float)으로 계산해야 일반적으로 받아들일 수 있는 결과가 나온다.
(자바에서 이자, 돈 등 중요한 숫자 계산은 BigInteger, BigDecimal 클래스를 사용해야 정확한 계산이 가능하다.)
2. 복합 대입 연산자
복합 대입 연산자(+=, -=, *=, /=, %=)는 자기 자신의 값에 특정 값을 더할 필요가 있는 경우에 사용한다. 이 연산자를 사용하면 계산을 간단하게 표현할 수 있다.
public class CompoundAssignmentOperator{
public static void main(String[] args) {
int a = 2;
// 변수에 2를 더해라.
// a = a+2;
a += 2;
System.out.println(a); // 2+2 = 4
// 변수에 2를 빼라.
// a = a - 2;
a -= 2;
System.out.println(a); // 4-2 = 2
// 변수에 2를 곱해라.
// a = a * 2;
a *= 2;
System.out.println(a); // 2*2 = 4
// 변수를 2로 나눠라.
// a = a / 2;
a /= 2;
System.out.println(a); // 4/2 = 2
// 변수를 2로 나눈 나머지를 구해라.
// a = a % 2;
a %= 2;
System.out.println(a); // 2/2 = 1 나머지 0
String str = "문자열";
str += "은 이렇게";
System.out.println(str); // 문자열은 이렇게
}
}
▷ 앞에서 String은 + 연산이 된다고 했는데, 복합 대입 연산자도 당연히 된다.
3. 단항연산자
앞서 배운 기본 연산자나 복합대입연산자는 연산자 앞뒤에 있는 두개의 피연산자를 사용한다. 하지만 여기서 볼 단항 연산자(+, -, ++, --, !)는 피연산자가 하나만 존재한다.
public class UnaryOperator{
public static void main(String[] args){
int value = 1;
// +, -
System.out.println(+value); // 1
System.out.println(-value); // -1
// ++, --
int value2 = 1;
System.out.println(value2++); // 1
System.out.println(value2); // 2
System.out.println(++value2); // 3
System.out.println(value2--); // 3
System.out.println(value2); // 2
System.out.println(--value2); // 1
// !
boolean bool = true;
System.out.println(bool); // true
System.out.println(!bool); // false
}
}
▷ +나 -는 기본연산자에 있는것과 같지만, 다른 역할을 수행한다.
→ + 는 연산자 뒤의 숫자*1, -는 연산자 뒤의 숫자*-1을 의미한다.
▷ ++나 --는 1만큼 증가하거나, 감소할 경우 사용한다. 연산자가 붙는 위치에 따라서 의미가 다르다.
→ 연산자가 앞에 붙으면 참조하기 전에 증가, 감소시키고, 뒤에 붙으면 참조하고 나서 증가, 감소 시킨다.
▷ ! 연산자는 boolean에서만 사용 가능하다. 어떤 계산의 결과가 boolean 일때도 사용 가능. 값을 반대로 바꾼다.
4. 비교연산자
비교연산자는 등가 비교 연산자와 대소비교 연산자가 있다. 모든 비교 연산자의 결과는 boolean 이다.
- 등가비교연산자(==, !=)
- 기본 자료형과 참조 자료형에서 사용 가능함.
- 기본 자료형은 같은 종류끼리 비교가 가능하다. 자료형이 다른 숫자(long vs int)끼리도 비교가 가능하다. 하지만 boolean vs int 와 같은 형식으로 사용 할수 없다.
- 참조 자료형은 그 주소값이 같은지 확인한다.
- 대소비교연산자(>, >=, <, <=)
- boolean이나 참조 자료형에는 사용할 수 없다.
public class CompareOperator {
public static void main(String[] args) {
// 등가 비교 연산자 != , ==
int a = 13;
long b = 13L;
if(a == b) {
System.out.println("같다!"); // 타입은 다르지만 숫자끼리 비교 가능.
} else {
System.out.println("다르다!");
}
// 참조자료형(문자열 비교)
String str1 = "문자열";
String str2 = new String("문자열");
System.out.println(str1); // 문자열
System.out.println(str2); // 문자열
if(str1 == str2) {
System.out.println("같다!");
} else {
System.out.println("다르다!"); // 같지 않다는 결과?!
}
}
}
▷등가비교 연산자 ==, !=는 참조 자료형의 경우 그 주소값을 비교한다. str1과 str2는 그 값은 "문자열"로 같지만, 메모리상의 주소가 다르기 때문에 다르다는 결과가 나온다.(String Pool과 heap 영역)
5. 논리 연산자
- 논리 연산자(&&, ||, &, |, ^)
- && : 연산자 양쪽의 조건이 모두 true일때, true임. 왼쪽의 값이 false이면 오른쪽은 검사하지 않음.
- || : 연산자 양쪽의 조건중 하나라도 true이면, true임. 왼쪽의 값이 true이면 오른쪽 값은 검사하지 않음.
- &, |, ^ : 이 연산자들은 숫자에 쓰면 비트연산, boolean에 쓰면 논리연산을 수행.
- & : 연산자 양쪽의 조건이 모두 true일때, true임. 왼쪽의 값이 false이더라도 오른쪽 조건을 검사함. 양쪽의 값을 비교하는 비트연산자 이기 떄문
- | : 연산자 양쪽의 조건중 하나라도 true이면, true임. 왼쪽의 값이 true이더라도 오른쪽 조건을 검사함. 양쪽의 값을 비교하는 비트연산자 이기 때문
- ^ : 두 조건이 서로 다를경우 true, 모두 true 이거나 false이면 false. 두 조건의 일치여부까지 검사.
public class LogicOperator {
public static void main(String[] args) {
LogicOperator logicOperator = new LogicOperator();
// &&
if( logicOperator.isFirst(true) && logicOperator.isSecond(false) ){
System.out.println("들어옴!");
} else {
System.out.println("안 들어옴!");
}
// ||
if( logicOperator.isFirst(true) || logicOperator.isSecond(false) ){
System.out.println("들어옴!");
} else {
System.out.println("안 들어옴!");
}
// &
if( t.isFirst(true) & t.isSecond(true) ){
System.out.println("들어옴!");
} else {
System.out.println("안 들어옴!");
}
// |
if( t.isFirst(true) | t.isSecond(false) ){
System.out.println("들어옴!");
} else {
System.out.println("안 들어옴!");
}
// ^
if( t.isFirst(true) ^ t.isSecond(true) ){
System.out.println("들어옴!");
} else {
System.out.println("안 들어옴!");
}
}
public boolean isFirst (boolean result){
System.out.println("isFirst called!");
return result;
}
public boolean isSecond (boolean result){
System.out.println("isSecond called!");
return result;
}
}
▷ 거의 대부분의 경우 &&, ||를 사용함.
6. 삼항 연산자
변수 = (조건식, boolean) ? true 일때 : false 일때;
변수에 값을 할당할 때 사용한다. = 뒤의 조건식은 반드시 boolean 값을 반환해야 한다. 조건식의 true, false 여부에 따라서 ? 우측의 블록을 선택적으로 실행한다. 삼항연산자를 사용하면 코드 한줄로, 특정 조건에 따라서 변수에 다른 값을 할당할 수 있다.
public class TernaryOperator{
public static void main(String[] args) {
String cham = (true) ? "참!" : "거짓!";
System.out.println(cham); // 참!
String geojit = (false) ? "참!" : "거짓!";
System.out.println(geojit); // 거짓!
}
}
※ 자바의 계산 순서
자바에는 연산자의 우선순위가 있다.
연산자 | 기호 | 우선순위 |
단항연산자 | +, -, ++, --, !, ~ | 1 |
산술연산자 | *, /, % | 2 |
+, - | 3 |
우선순위가 높은 순서로 먼저 계산되지만, 아무리 연산 우선순위가 있어도, 괄호보다 높지는 않다. 헷갈리면 괄호 치는 습관을 들이는게 좋다.
public class CalcOrder {
public static void main(String[] args) {
System.out.println(1+2*3); // 7
System.out.println((1+2)*3); // 9
}
}
'Java' 카테고리의 다른 글
[자바의 신] 참조 자료형 - 생성자 (0) | 2020.09.21 |
---|---|
[자바의 신] 변수 하나에 여러 개의 데이터를 담을 수 없을까? (0) | 2020.09.15 |
[자바의 신] 자료형이 뭐죠? (0) | 2020.09.10 |
[자바의 신] 변수에도 이름이 있다? (0) | 2020.09.10 |
[자바의 신] 클래스와 객체는 같은건가? (0) | 2020.09.09 |