문제의 역사:
Queue 및 Stack 컬렉션은 각각 FIFO(선입선출) 및 LIFO(후입선출) 원칙을 구현하는 기본 데이터 구조입니다. 이들은 고전 VB6 시대부터 활발히 사용되었으며, VB.NET의 도래와 함께 이러한 구조는 표준 클래스가 되었습니다. Queue는 요소가 들어온 순서대로 처리되어야 하는 시나리오(예: 작업 큐)에서 유용하며, Stack은 마지막으로 추가된 요소를 먼저 처리해야 할 때(예: 호출 스택 또는 작업 취소) 사용됩니다.
문제:
종종 특정 작업에 적합하지 않은 구조를 선택하거나 다중 스레드 시나리오에서 안전하지 않게 사용됩니다. 또한 빈 스택이나 큐에서 추출할 때 오류가 발생하여 예외가 발생할 수 있습니다.
해결책:
Visual Basic에서 이러한 구조를 사용하기 위해 다음과 같은 관련 클래스가 있습니다:
System.Collections.QueueSystem.Collections.Stack큐 및 스택 작업 예시:
' 큐 작업 Dim q As New Queue() q.Enqueue("첫 번째") q.Enqueue("두 번째") Dim item = q.Dequeue() ' item = "첫 번째" ' 스택 작업 Dim s As New Stack() s.Push("A") s.Push("B") Dim top = s.Pop() ' top = "B"
주요 특징:
1. For Each를 사용하여 컬렉션 Queue 또는 Stack을 반복하는 동안 컬렉션을 수정할 수 있습니까?
아니요, For Each를 사용하여 컬렉션을 열거하는 중에 컬렉션을 수정(요소 추가 또는 제거)하면 InvalidOperationException이 발생합니다.
코드 예시:
Dim q As New Queue() q.Enqueue(1) q.Enqueue(2) For Each elem In q q.Enqueue(3) ' 반복 중에 예외 발생 Next
2. 빈 Queue 또는 Stack에 대해 Peek() 메서드는 무엇을 반환합니까?
Peek은 컬렉션이 비어 있을 경우 InvalidOperationException을 발생시키며 기본값을 반환하지 않습니다.
코드 예시:
Dim st As New Stack() Dim first As Object = st.Peek() ' 예외 발생!
3. Queue(Of T)와 Queue의 차이점은 무엇이며, 일반 컬렉션을 선호해야 하는 이유는 무엇입니까?
Queue(Of T)는 Queue의 제네릭 버전으로, 타입 안전성을 보장하고 박싱/언박싱을 피할 수 있습니다. 알려진 유형을 사용할 때 항상 이를 선택하는 것이 좋습니다.
Dim numbers As New Queue(Of Integer)() numbers.Enqueue(5) ' 오직 Integer만
문서 인쇄 대기열이 구현된 애플리케이션에서 개발자가 작업을 Stack에 저장하고 큐가 아닌 Stack에 저장했습니다. 그 결과, 문서가 마지막으로 추가된 순서의 반대 순서로 인쇄됩니다.
장점:
단점:
같은 프로젝트가 인쇄 작업을 저장하기 위해 Stack을 Queue로 변경합니다. 이제 문서는 사용자가 기대하는 대로 왼쪽에서 오른쪽으로 인쇄됩니다.
장점:
단점: