#1. 들어가기.
코딩을 하다보면 가끔 두 변수의 값을 서로 바꿔야할 때가 있다.
예를 들어, 아래와 같이 변수 A와 B의 값이 서로 다르게 존재한다고 가정해보자.
int a = 10; // a : 10
int b = 20; // a : 20

이때, 서로의 값을 바꾸려면 어떻게 해야할까??
대부분의 사람들은 새로운 변수(temp)를 하나 더 만들어 다음과 같이 서로의 값을 바꾼다.
int temp = a; // a : 10 | b : 20 | temp : 10
a = b; // a : 20 | b : 20 | temp : 10
b = temp; // a : 20 | b : 10 | temp : 10

여기에서, temp변수를 선언하는 것이 왠지 모르게 보기 싫다...
개발자라면 누구나 한 번씩은 고민해볼 것이다.
"temp 변수를 이용하지 않고 서로의 수를 변경할 수 있는 방법이 있을까?"

#2-1. 방법1 - Calculation
수학에 흥미가 있는 개발자라면, 다음과 같은 식을 생각해볼 수 있다.
int a = 2; // a : 2
int b = 4; // b : 4

a = a + b; // a : 6 | b : 4
b = a - b; // a : 6 | b : 2
a = a - b; // a : 4 | b : 2

값이 서로 바뀌었다... 오?!

#2-2. 방법2 - XOR
2-1의 방법과는 조금 다르지만... 간혹(?) 이런 방법을 생각해보는 개발자도 있을것이다...
아래 ( ) 안의 숫자는 binary 값이다.
int a = 2; // a : 2 (0010)
int b = 4; // b : 4 (0100)

a = a ^ b; // a : 6 (0110) | b : 4 (0100)
b = a ^ b; // a : 6 (0110) | b : 2 (0010)
a = a ^ b; // a : 4 (0100) | b : 2 (0010)

이번에도 값이 서로 바뀌었다... 오...
(2진수와 XOR연산의 원리를 잘 모르겠다면 검색을 추천한다.)

#3. 응용.
임시 변수를 이용해 값을 바꾸는 방법까지 총 세가지의 교환 방법을 알아보았는데,
"어떤 방법이 가장 유리한가?" 라는 질문에는
"각각의 상황에 따라 다르다"라고 대답할 수 있다.

예를 들어, 교환해야 할 수의 크기라던가 반복 횟수, 메모리의 제약 등등 고려할 사항이 많아,
상황에 맞추어 단위테스트를 진행해본 후 알고리즘에 적용하면 좋을것이다.

참고 사이트 : http://javarevisited.blogspot.kr/2013/02/swap-two-numbers-without-third-temp-variable-java-program-example-tutorial.html