C#에서 임시 변수를 사용하지 않고 변수 값 바꾸기

Bilal Shahid 2023년10월12일
  1. C#에서 튜플 할당 사용
  2. + 연산자를 사용하여 C#에서 사용되는 임시 변수를 둘러싸기
  3. C#에서 임시 변수 사용을 숨기기 위해 명시적 구현 대신 함수를 사용하여 값 교환
  4. XOR 연산자를 사용하여 C#에서 스왑하는 방법
C#에서 임시 변수를 사용하지 않고 변수 값 바꾸기

지금 코드를 작성 중이고 변수 값을 교환하려고 한다고 가정해 보겠습니다. 아마도 다음과 같이 할 것입니다.

using System;

public class Program
{
  public static void Main(string[] args)
  {
      var val_one = 123;
      var val_two = 234;

      var val_swap = val_one;
      val_one = val_two;
      val_two = val_swap;

      Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);
  }
}

이제 여기에서 먼저 val_swap이라는 임시 변수를 만든 다음 val_one 값을 복사하여 val_one 값이 수정된 후 원래 val_one 값을 다시 val_two에 쉽게 복사할 수 있습니다. val_swap의 값을 할당합니다.

오늘 우리는 이 임시 변수의 사용을 제거하고 다른 할당 없이 그러한 교환을 수행하는 방법을 살펴볼 것입니다.

C#에서 튜플 할당 사용

이제 사용할 수 있는 매우 간단한 방법은 다음과 같이 TUPLE 할당을 사용하는 것입니다.

(val_one, val_two) = (val_two, val_one);

Console.WriteLine("The value after swapping from the tuple method is: " + val_one + " and -> " +
                  val_two);

출력:

The value after swapping from the tuple method is: 234 and -> 123

이 방법은 Python에서도 사용되었습니다. 그러나 튜플의 대상이 아닙니다.

그러나 때로는 원하는 것을 얻기 위해 속임수를 사용해야 합니다. 아래의 예를 살펴보겠습니다.

+ 연산자를 사용하여 C#에서 사용되는 임시 변수를 둘러싸기

두 개의 숫자가 있다고 가정해 보겠습니다. 79. 첫 번째 변수의 값은 7이고 두 번째 변수의 값은 9입니다.

97에 추가하면 16이 됩니다. 이제 첫 번째 변수에 16을 할당해 보겠습니다.

첫 번째 변수의 값으로 9를 넣으려면 두 번째 변수에서 9의 값을 빼야 하며 이는 15-9 = 7이 됩니다. 이 값을 사용하고 첫 번째 변수의 15에서 빼서 이제 9 값을 얻습니다.

val_one += val_two;
val_two = val_one - val_two;
val_one = val_one - val_two;

Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);

출력:

The value after swapping is: 234 and -> 123

이것이 스와핑하는 동안 임시 변수 사용을 중지하기 위해 간단한 산술을 사용하는 방법을 알 수 있습니다. 반면에 매우 큰 정확한 값이 있는 경우 이는 비효율적일 수 있으며 이러한 산술을 사용하면 일부 값이 손실될 수 있습니다.

임시 변수의 사용을 제거하지 않고 구현을 숨기려면 다음과 같은 것을 사용할 수 있습니다.

C#에서 임시 변수 사용을 숨기기 위해 명시적 구현 대신 함수를 사용하여 값 교환

다음과 같이 할 수 있습니다.

static void swap(ref int x, ref int y) {
  var temp = x;
  x = y;
  y = temp;
}

그리고 아래와 같이 호출합니다.

swap(ref val_one, ref val_two);
Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);

출력:

The value after swapping is: 234 and -> 123

XOR 연산자를 사용하여 C#에서 스왑하는 방법

아래 코드를 살펴보자.

val_one ^= val_two ^= val_one ^= val_two;

그리고 그 출력:

The value after swapping is: 0 and -> 123

두 번째 변수가 이제 첫 번째 변수의 값을 갖고 제대로 작동하더라도 첫 번째 값이 0임을 알 수 있습니다.

이 문제를 해결하려면 어떻게 해야 합니까? 먼저 다음과 같이 코드를 작성해 보겠습니다.

val_one ^= val_two;
val_two ^= val_one;
val_one ^= val_two;

이제 출력은 다음과 같습니다.

The value after swapping is: 234 and -> 123

무슨 일이야? 먼저 첫 번째 문장에서 주어진 코드를 이해합시다.

다음과 같이 확장할 수 있습니다.

val_one = val_one ^ val_two;
val_two = val_two ^ val_one;
val_one = val_one ^ val_two;

이제 첫 번째 코드가 나중에 제시된 코드와 유사하다고 말할 수 있습니다. 그러면 어떻게 작동하지 않지만 후자는 잘 수행됩니까?

이러한 산술 연산의 순서를 변경하면 다른 결과가 나타날 수 있습니다. 전자의 코드에서 val_one은 자체적으로 XOR을 가지므로 결과는 0입니다.

그러나 후자의 경우 차수가 이미 정의되어 있고 값이 완벽하게 계산되므로 차이가 발생합니다.

그러나 더 높은 코드 수준에 대해 XOR 스와핑을 사용하지 마십시오. 그것은 안전하지 않으며 대용으로 보관해야 합니다.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub