루비에서 변수 값 스와핑하기
★프로그래밍/Ruby :: 2016. 8. 16. 20:35루비에서 두 변수의 값을 스와핑하는 방법입니다.
예를 들어, a에 2가 대입되어 있고 b에 3이 대입되어 있다고 했을 때 둘을 바꿔치기해서 a=3, b=2로 만드는 방법을 말합니다.
일단 a와 b를 스와핑하는 의사코드를 보겠습니다.
temp ← a a ← b b ← temp
a ← a Xor b b ← a Xor b a ← a Xor b
a, b ← b, a
흔히 사용되는 방법이 첫 번째 방법과 같은 임시변수 선언법이고 두 번째 방법과 같은 XOR 연산도 가끔 쓰이는데, 루비에서는 세 번째 방법대로 간편하게 스와핑을 구현할 수 있습니다.
다음 코드를 봅시다.
a, b = 2, 3 # a에 2를, b에 3을 대입 puts sprintf("%s", [a, b]) # 출력 a, b = b, a # 스와핑 puts sprintf("%s", [a, b]) # 출력
이 코드의 실행 결과는 다음과 같습니다.
[2, 3] [3, 2]
임시변수나 XOR 연산 없이도 간단하게 스와핑이 이루어졌습니다.
물론 이 방법은 배열 안에서도 가능합니다.
a = [2, 3] # 배열 a에 2, 3 대입 puts sprintf("%s", a) # 출력 a[0], a[1] = a[1], a[0] # 스와핑 puts sprintf("%s", a) # 출력
이 코드의 실행 결과는 다음과 같습니다.
[2, 3] [3, 2]
뿐만 아니라 3개 이상의 변수에 대해서도 한꺼번에 스와핑이 가능합니다.
a, b, c = 2, 3, 5 # a, b, c에 2, 3, 5 대입 puts sprintf("%s", [a, b, c]) # 출력 a, b, c = c, a, b # 스와핑 puts sprintf("%s", [a, b, c]) # 출력
이 코드의 실행 결과는 다음과 같습니다.
[2, 3, 5] [5, 2, 3]
심지어는 각기 다른 자료형끼리도 스와핑이 가능합니다.
a, b, c, d = 2, "가", [3, 5], nil # 각기 다른 자료형 대입 puts sprintf("%s", [a, b, c, d]) # 출력 a, b, c, d = d, c, b, a # 스와핑 puts sprintf("%s", [a, b, c, d]) # 출력
이 코드의 실행 결과는 다음과 같습니다.
[2, "가", [3, 5], nil] [nil, [3, 5], "가", 2]
자, 이제 루비에서 간단하게 변수 스와핑하는 방법을 이해하셨나요?
루비의 간편한 변수 스와핑은 매우 유용하게 쓰일 수 있습니다.
많은 도움 되셨기를 바랍니다.
(※참고로 파이썬에서도 이 방법의 스와핑이 가능합니다.)