Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# Stack.Equals() 메서드 완벽 정리: 스택 객체 동등성 비교 방법

C#에서 Stack.Equals() 메서드는 Stack 클래스 객체가 다른 객체와 동일한지 여부를 확인하는 데 사용됩니다. 이 메서드는 두 객체가 같은 인스턴스를 참조하는지 비교하며, 기본적으로 참조(reference) 기준으로 동등성을 판단합니다.

구문(Syntax)

Stack.Equals() 메서드의 기본 구문은 다음과 같습니다.

public virtual bool Equals (object ob);

여기서 매개변수 ob는 현재 객체와 비교할 대상 객체를 의미합니다. 반환값은 두 객체가 동일하면 true, 그렇지 않으면 false입니다.

예제 1: Clone()으로 복제한 스택 비교하기

먼저 스택을 생성하고 요소를 추가한 뒤, Clone() 메서드로 복제한 스택과 Equals()로 비교해 보겠습니다.

using System;
using System.Collections;
public class Demo {
    public static void Main(){
        Stack stack = new Stack();
        stack.Push(150);
        stack.Push(300);
        stack.Push(500);
        stack.Push(750);
        stack.Push(1000);
        stack.Push(1250);
        stack.Push(1500);
        stack.Push(2000);
        stack.Push(2500);
        Console.WriteLine("스택 요소...");
        foreach(int val in stack){
            Console.WriteLine(val);
        }
        Console.WriteLine("요소 개수 = "+stack.Count);
        stack.Push(3000);
        stack.Push(3500);
        stack.Push(4000);
        Console.WriteLine("\n업데이트된 스택 요소...");
        foreach(int val in stack){
            Console.WriteLine(val);
        }
        Console.WriteLine("\n업데이트 후 요소 개수 = "+stack.Count);
        Stack stack2 = (Stack)stack.Clone();
        Console.WriteLine("\n복제된 스택 요소...");
        foreach(int val in stack2){
            Console.WriteLine(val);
        }
        Console.Write("복제된 스택의 요소 개수 = "+stack2.Count);
        Console.WriteLine("\n두 스택이 동일한가? = "+stack.Equals(stack2));
    }
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

스택 요소...
2500
2000
1500
1250
1000
750
500
300
150
요소 개수 = 9
업데이트된 스택 요소...
4000
3500
3000
2500
2000
1500
1250
1000
750
500
300
150
업데이트 후 요소 개수 = 12
복제된 스택 요소...
4000
3500
3000
2500
2000
1500
1250
1000
750
500
300
150
복제된 스택의 요소 개수 = 12
두 스택이 동일한가? = False

결과 분석

흥미로운 점은 Clone()으로 복제한 스택조차도 Equals() 결과가 False라는 것입니다. 그 이유는 Clone()이 내용은 같지만 새로운 객체를 생성하기 때문입니다. Stack 클래스는 Equals()를 재정의하지 않았으므로 Object 클래스의 기본 구현인 참조 동등성 비교가 수행되어, 서로 다른 인스턴스에 대해서는 항상 false가 반환됩니다.

예제 2: 서로 다른 내용의 두 스택 비교하기

이번에는 서로 다른 값을 가진 두 개의 스택을 만들어 비교해 보겠습니다.

using System;
using System.Collections;
public class Demo {
    public static void Main(){
        Stack stack1 = new Stack();
        stack1.Push(150);
        stack1.Push(300);
        stack1.Push(500);
        stack1.Push(750);
        stack1.Push(1000);
        Console.WriteLine("첫 번째 스택(stack1) 요소...");
        foreach(int val in stack1){
            Console.WriteLine(val);
        }
        Stack stack2 = new Stack();
        stack2.Push(350);
        stack2.Push(400);
        stack2.Push(500);
        stack2.Push(850);
        stack2.Push(900);
        Console.WriteLine("두 번째 스택(stack2) 요소...");
        foreach(int val in stack2){
            Console.WriteLine(val);
        }
        Console.WriteLine("\n두 스택이 동일한가? = "+stack1.Equals(stack2));
    }
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

첫 번째 스택(stack1) 요소...
1000
750
500
300
150
두 번째 스택(stack2) 요소...
900
850
500
400
350
두 스택이 동일한가? = False

정리

C#의 Stack.Equals() 메서드는 객체 간 동등성을 확인하지만, 기본적으로 참조 동등성을 기준으로 판단한다는 점을 기억해야 합니다. 따라서 내용이 완전히 같은 복제된 스택이라도 서로 다른 인스턴스라면 false가 반환됩니다. 스택의 내용 자체를 비교하고 싶다면 요소를 하나씩 순회하며 직접 비교하거나, LINQ의 SequenceEqual() 같은 방법을 활용하는 것이 좋습니다.