이 튜토리얼에서는 다양한 프로그래밍 언어에서 두 변수의 값을 서로 바꾸는 방법을 알아봅니다. 스왑(swap)이란 두 변수가 담고 있는 값을 서로 맞바꾸는 연산을 의미합니다. 먼저 간단한 예시로 살펴보겠습니다.
입력
a = 3 b = 5
출력
a = 5 b = 3
그럼 각 언어별로 하나씩 자세히 살펴보겠습니다.
Python(파이썬)
파이썬은 단 한 줄의 코드로 두 변수를 교환할 수 있습니다. 튜플 언패킹(tuple unpacking) 문법 덕분인데요, 별도의 임시 변수 없이 우변의 값들을 좌변에 한 번에 대입할 수 있습니다. 코드를 확인해 보겠습니다.
예제
# 변수 초기화
a, b = 3, 5
# 교환 전 출력
print("Before swapping:-", a, b)
# 변수 교환
a, b = b, a
# 교환 후 출력
print("After swapping:-", a, b)
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Before swapping:- 3 5 After swapping:- 5 3
C/C++, PHP, Java와 같은 언어에는 파이썬과 같은 언패킹 문법이 없기 때문에, XOR(^) 비트 연산자를 활용하면 임시 변수 없이 간결하게 스왑을 구현할 수 있습니다. XOR 연산을 이용하면 한 줄의 코드로 교환 작업을 완료할 수 있습니다. 참고로 XOR 스왑은 정수형 변수에만 적용할 수 있습니다. 프로그램 작성 과정을 단계별로 정리하면 다음과 같습니다.
- 두 변수를 서로 다른 값으로 초기화합니다.
- 두 변수에 XOR 연산을 수행한 결과를 첫 번째 변수에 대입합니다.
- 다시 XOR 연산을 수행한 결과를 두 번째 변수에 대입합니다.
- 마지막으로 한 번 더 XOR 연산을 수행한 결과를 첫 번째 변수에 대입합니다.
- 두 변수의 값이 서로 교환됩니다.
이제 각 언어별 코드를 살펴보겠습니다.
C/C++
C/C++에서는 콤마 연산자를 이용해 세 번의 XOR 연산을 한 줄로 나열할 수 있습니다.
예제
# include <stdio.h>
int main() {
int a = 3, b = 5;
printf("Before Swapping:- %d %d", a, b);
(a ^= b), (b ^= a), (a ^= b);
printf("After Swapping:- %d %d", a, b);
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Before swapping:- 3 5 After swapping:- 5 3
Java
자바에서는 대입식을 식(expression) 안에 포함시키는 방식으로 a = a ^ b ^ (b = a);처럼 한 줄로 처리할 수 있습니다.
예제
class Swap {
public static void main(String[] args) {
int a = 3, b = 5;
System.out.println("Before Swapping:- " + a + " " + b);
a = a ^ b ^ (b = a);
System.out.println("After Swapping:- " + a + " " + b);
}
}
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Before swapping:- 3 5 After swapping:- 5 3
PHP
PHP 역시 C 스타일의 XOR 할당 연산자(^=)를 지원하므로 동일한 원리로 구현할 수 있습니다.
예제
<?php
$a = 5;
$b = 10;
echo "Before Swapping:- ", $a, " ", $b;
($a ^= $b);
($b ^= $a);
($a ^= $b);
echo "\nAfter Swapping:- ", $a, " ", $b;
?>
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Before Swapping:- 5 10 After Swapping:- 10 5
마무리
지금까지 네 가지 언어에서 두 변수를 한 줄로 교환하는 방법을 알아보았습니다. 파이썬에서는 튜플 언패킹을, C/C++·PHP·Java에서는 XOR 연산자를 활용하면 임시 변수 없이 깔끔하게 구현할 수 있습니다. 튜토리얼 내용에 대해 궁금한 점이 있다면 댓글로 남겨주세요.