2. 단항 연산자
2.1 증감 연산자 ++, --
일반적으로 단항 연산자는 피연산자의 왼쪽에 위치하지만, ++와 --는 양쪽 모두 위치하는 것이 가능하다. 위치에 따라 연산결과가 달라진다.
증가 연산자(++) : 피연산자의 값을 1 증가시킨다.
감소 연산자(--) : 피연산자의 값을 1 감소시킨다.
boolean 형을 제외한 모든 기본형 변수에 사용 가능하다.
public class ex2 {
public static void main(String[]args) {
int i = 5;
i++;
System.out.println(i);
i=5;
++i;
System.out.println(i);
}
}
[실행 결과]
6
6
두 결과 모두 i의 값을 증가시킨 후 출력한다. 연산자의 위치가 다름에도 결과가 같은 이유는 어떤 수식에 포함된 것이 아니라 단독적으로 사용됐기 때문이다. 그러나 단독으로 사용되지 않고, 다른 수식에 포함되거나 함수의 매개변수로 사용된 경우에는 결과가 다르다.
public class ex2 {
public static void main(String[]args) {
int i = 5;
int j = 0;
j = i++;
System.out.println("i++"+" i="+i+" j="+j);
i = 5;
j = 0;
j = ++i;
System.out.println("++i"+" i="+i+" j="+j);
}
}
[실행 결과]
i++ i=6 j=5
++i i=6 j=6
전위형은 변수의 값을 먼저 증가시킨 후에 변수의 값을 읽어오지만, 후위형은 변수의 값을 먼저 읽어온 후에 값을 증가시킨다.
그렇기 때문에, ++i에서는 i의 값을 증가시킨 후에 읽어오기 때문에 i의 값이 5에서 6으로 증가된 후에 이 값이 j에 저장된다. i++에서는 i값인 5를 먼저 읽어온 후에 i를 증가시키기 때문에 j에 5가 저장된다.
함수의 매개변수에 증감 연산자가 사용된 예시
public class ex2 {
public static void main(String[]args) {
int i = 5, j = 5;
System.out.println(i++);
System.out.println(++j);
System.out.println("i="+i+" j="+j);
}
}
[실행 결과]
5
6
i=6 j=6
i 는 값이 증가되기 전에 참조되므로 println 메서드에 i 에 저장된 값인 5를 넘겨준 후에 i 의 값이 증가하기 때문에 5가 출력된다. j 의 경우에는 j 에 저장된 값을 증가 시킨 후에 println 메서드에 값을 넘겨주므로 6이 출력된다.
'++i' 와 'i=i+1' 의 결과는 같지만 실제 연산이 수행되는 과정은 다르다. '++i' 가 더 적은 명령만으로 작업을 수행하기 때문에 더 빠르고, 수식을 더 간략히 할 수 있다.
'++i' 와 'i=i+1' 를 컴파일 했을 때 생성되는 클래스파일의 바이트 코드 명령어를 비교하면, 'i=i+1' 은 5개의 명령이지만, '++i' 는 2개의 명령으로 이루어진다.
덧셈 연산자 '+' 는 필요에 따라 피연산자를 형변환하지만, 증감 연산자는 형변환없이 피연산자의 값을 변경한다.
2.2 부호 연산자 +, -
부호 연산자는 피연산자의 부호를 변경하는데 사용되며, boolean 형과 char 형을 제외한 나머지 기본형에 사용 가능하다.
부호 연산자 '+' 의 경우는 피연산자에 양수 1을 곱한 결과를 출력하고, 부호 연산자 '-' 의 경우에는 피연산자에 음수 1을 곱한 결과를 출력한다.
public class ex2 {
public static void main(String[]args) {
int i = -10;
i = +i;
System.out.println(i);
i = -10;
i = -i;
System.out.println(i);
}
}
[실행 결과]
-10
10
2.3 비트전환 연산자 ~
비트전환 연산자 '~' 는 정수형과 char 형에서만 사용되며, 피연산자를 2진수로 표현했을 때, 0은 1로 바꾸고 1은 0으로 바꾼다. 그래서 비트전환 연산자 '~' 에 의해 비트전환 되고 나면, 피연산자의 부호가 반대로 변경된다.
[주의] byte, short, char 형은 int 형으로 변환된 후에 전환된다.
2진수 | 10진수 | |||||||
0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 10 |
1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | -11 |
public class ex2 {
public static void main(String[]args) {
byte b = 10;
System.out.println("b = "+b);
System.out.println("~b = "+~b);
System.out.println("-b+1 = "+ (~b+1));
}
}
[실행 결과]
b = 10
~b = -11
-b+1 = -10
양의 정수 b 가 있을 때, b 에 대한 음의 정수를 얻으려면 '~b + 1' 을 계산하면 된다.
2진수 | 10진수 | |||||||
0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 10 |
1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | -11 |
1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | -11 + 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | -10 |
10의 2진수에서 맨 왼쪽의 부호비트를 1로 바꾸면 -11이 되기 때문에 +1을 해줘서 -10으로 만든다.
public class ex2 {
public static void main(String[]args) {
byte b = 10;
//byte result = ~b; ~연산자의 결과가 int 라서 byte 형 변수에 저장하지 못한다.
byte result = (byte)~b;
System.out.println("b = "+b);
System.out.println("~b = "+result);
}
}
[실행 결과]
b = 10
~b = -11
연산자 '~' 는 피연산자의 타입이 int 형보다 작으면 int 형으로 변환한 다음 연산을 하기 때문에 byte 형 변수 b 가 int 형으로 변환된 다음에 연산이 수행되어 연산결과가 int 형이 된다.
연산자 '~' 의 연산결과를 저장하기 위해서는 int 형 변수에 담거나 캐스트 연산자를 사용해야 한다.
2.4 논리부정 연산자 !
boolean 형에만 사용할 수 있으며, true 는 false 로, false 는 true 로 변경한다. 조건문과 반복문의 조건식에 사용되어 효율적인 조건문을 만들어 준다.
전원버튼과 같은 토글버튼을 논리적으로 구현할 수 있다.
public class ex2 {
public static void main(String[]args) {
boolean power = false;
System.out.println(power);
power = !power;
System.out.println(power);
power = !power;
System.out.println(power);
}
}
[실행 결과]
false
true
false