JAVA/연산자

2. 단항 연산자

mingul 2020. 2. 4. 22:28

 

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