우연히 다른 사람의 블로그를 돌아다니다가 참 기발한 글을 발견했다...
Swap을 변수 없이 할 수 있다는 글이었다...
(http://oneil.cafe24.com/tatter/28?TSSESSION=320992d2262813b724e59568228f6253)

방법은 다음과 같다...

a ^= b
b ^= a
a ^= b

or

a = a+b
b = a-b
a = a-b

Very clever... 아니면 나만 모르고 있었나? Anyway, 추가적인 변수 없이 swap을 할 수 있다는 사실은 performance 향상 및(생각해보니 performance 향상은 그다지 없을것 같다) resource의 효율적인 활용을 의미한다... 하지만... 이것은 정수에 한해서만 가능할것 같다. 그래서 나는 이 방법을 굳이 권하고 싶지 않다.

객체지향 언어에 있어서 있어서 가장 중요한 aspect중에 하나는 reusable code이다. 그리고 정말 reusable한 code를 만들기 위해서는 template을 사용하는것은 불가피하다고 생각한다.
변수값간에 swap은 sorting 할때 많이 쓰이는데 sorting 은 정수 뿐만 아니라 어떤 형태의 data에도 해야만 하는 경우가 생길 수 있기 때문에 보통 sort algorithm은 template으로 구현하지 않나?
그래서 정수에 한해서만 swap이 가능한 저 방법은 좋지 않다고 생각한다...
그리고 요새 컴퓨터의 발달로 요새는 performance나 resource efficiency 보다는 code의 reusability 또는 maintainability에 더 중점을 두고 소프트웨어를 설계하는 경향이라고 생각한다.

하지만... 만약 data structure에 저장된 data의 탑이 pointer형이라면... pointer는 정수값을 가지고 있으니 위의 방법을 응용해서 써도 되지 않을까 싶기도 하다... On the other hand, 변수를 하나 사용해서 일반적으로 널리 알려진 방법대로 swap을 하는 경우와 위의 방법으로 assignment 대신 다른 operation을 통해서 swap의 효과를 얻는다고 해서 얼마나 큰 효과를 볼 수 있을까 싶기도 하다... 어차피 assignment operation이나 XOR같은 operation은 모두 한 사이클에 벌어질법한 일들이니까...
아닌가?

어쨌든, 변수 하나 아낄 수 있다는것으로 만족할만한 당신이라면... 저 방법을 쓰시오...
하지만 굳이 data structure에 pointer형으로 저장할 필요가 없음애도 불구하고 pointer형을 쓴다면 극서에 따른 overhead도 있을테니... 잘 고려해보세요~

여러분들의 생각은 어떠세요?

Posted by Dansoonie