증감 연산자
- 증감 연산자(++) : 피연산자의 값을 1 증가시킨다.
- 감소 연산자(- -) : 피연산자의 값을 1 감소시킨다.
j = ++i; // 전위형 : 값이 참조되기 전에 증가시킨다. j = i++; // 후위형 : 값이 참조된 후에 증가시킨다.
✨ 예제 1
public class OperatorEx1 {
public static void main(String[] args) {
int i=5;
i++; // i=i+1; 과 같은 의미이다. ++i;로 바꿔 써도 결과는 같다.
System.out.println(i);
i=5; // 결과 비교를 위해i를 5로 변경
++i;
System.out.println(i);
}
}
✨ 예제 2
public class OperatorEx2 {
public static void main(String[] args) {
int i=5, j=0;
j = i++;
System.out.println("j=i++; 실행 후, i=" + i + ", j=" + j);
i=5;
j=0;
j = ++i;
System.out.println("j=++i; 실행 후, i=" + i + ", j=" + j);
}
}
=> 전위형 'j=++i;'에서는 i의 값을 증가시킨 후에 읽어오므로 i의 값이 5에서 6으로 증가된 후에 이 값이 j에 저장되며, 후위형 'j=i++;'에서는 i값인 5를 먼저 읽어온 다음에 i를 증가시키므로 j에 5가 저장된다.
부호 연산자는 '+','-'로 boolean형과 char형을 제외한 기본형에만 사용할 수 있다.
✨ 예제 3
public class OperatorEx4 {
public static void main(String[] args) {
int i = -10;
System.out.println(i);
i = -i;
System.out.println(i);
}
}
사칙 연산자는 더하기, 빼기, 곱하기, 나누기가 있으며 피연산자의 타입을 일치시켜야한다.
- 피연산자가 int(4byte)보다 작은 타입일 경우, int로 변환 후 연산을 수행한다.
✨ 예제 4
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c); //오류 발생
=> 이 경우 오류가 발생한다. a와 b는 모두 int형보다 작은 byte형이기 때문에 연산자 '+'는 이 두 개의 피연산자들의 자료형을 int형으로 변환한 다음 연산을 수행한다. 그래서 'a+b'의 연산결과는 byte형이 아닌 int형(4byte)이기 때문에 byte c에 저장할 수 없어 오류가 발생하는 것이다.
byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);
# 출력
30
이처럼 큰 자료형의 값을 자료형의 변수에 저장하려면 명시적으로 형변환 연산자를 사용해서 형변환해주어야 한다.
나머지 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자이다.
- 몫은 '/'이고, 나머지는 '%'이다.
- 나머지 연산자는 나누는 수로 음수도 허용한다. 다만, 부호는 무시되므로 결과는 음수의 절대값으로 나눈 나머지와 같다.
✨ 예제 5
public class OperatorEx5 {
public static void main(String[] args) {
int x = 10;
int y = 8;
System.out.printf("%d", x%y);
}
}
비교 연산자는 두 피연산자를 비교하는 데 사용되는 연산자로, 연산결과는 오직 true와 false 둘 중 하나이다.
=> 피연산자1(좌측)을 기준으로 비교 연산이 참이면 true, 거짓이면 false를 반환한다.
✨ 예제 6
float f = 0.1f;
double d = 0.1;
System.out.printf("%b", d==f);
=> '10.0 == 10.0f'는 true인데 '0.1==0.1f'는 false인 이유가 뭘까?
10.0f는 오차없이 저장할 수 있는 값이라서 double로 형변환해도 그대로 10.0이 되지만, 0.1f는 저장할 때 2진수로 변환하는 과정에서 오차가 발생한다. double타입의 상수인 0.1도 저장되는 과정에서 오차가 발생하지만, float타입의 리터럴인 0.1f보다 적은 오차로 저장된다.
문자열 비교는 비교 연산자 '==' 대신 equals()라는 메서드를 사용해야 한다. 비교 연산자는 두 문자열이 완전히 같은 것인지 비교할 뿐이므로, 문자열의 내용이 같은지 비교하기 위해서는 equals()를 사용하는 것이다. 비교하는 두 문자열이 같으면 true를, 다르면 false를 반환한다.
✨ 예제 7
String str = new String("abc");
boolean result = str.equals("abc");
# 출력
true
|| (OR결합) : 피연산자 중 어느 한 쪽만 true이면 true
&& (AND결합) : 피연산자 양쪽 모두 true이어야 true
| (OR연산자) : 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
& (AND연산자) : 피연산자 양쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
^ (XOR연산자) : 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.
조건식 ? 식1 : 식2
- 유일한 삼항 연산자로 조건식의 평가결과에 따라 다른 결과를 반환한다.
- 조건식의 평가결과가 true이면 식1, false이면 식2가 연산결과가 된다.
✨ 예제 8
result = (5 > 3) ? 5 : 3; // 조건식이 참이므로 식1인 5가 연산결과가 된다.
// 출력
5;
참고
자바의 정석(저자: 남궁성)
앞서 정리했던 연산자의 종류에 대해 보다 상세히 정리했다. 예제를 통해 연산자 사용법을 익히려고 노력했다. 증감연산자와 논리연산자가 익숙하지 않아 더 많은 연습이 필요해보인다.
다음에는 조건문과 반복문에 대해 공부해보겠다.