Search

2016년 5월 16일 월요일

[Java] 두 int 값을 바꾸는 방법. (임시 변수 없이)

  #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





댓글 4개:

  1. 오 더하고 빼는 방법은 생각해봤었는데 xor은 처음들어보네요 감사합니다.

    답글삭제
  2. Best explanation with example.
    Thanks,
    https://www.flowerbrackets.com/java-program-to-swap-two-numbers/

    답글삭제
  3. Nice article . There is good coding example collection visit
    Top coding program example

    답글삭제