1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System; using System.Collections.Generic; class Program { static void Main() { List list = new List(); list.Add(2); list.Add(3); list.Add(7); foreach (int prime in list) // Loop through List with foreach { Console.WriteLine(prime); } for (int i = 0; i < list.Count; i++) // Loop through List with for { Console.WriteLine(list[i]); } } } |
Dictionanry
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
using System; using System.Collections.Generic; class Program { static void Main() { // Dictionary 생성 - string을 키, int를 값으로 가지는 Dictionary Dictionary<string, int> ages = new Dictionary<string, int>(); // Insert - 데이터 추가 ages["Alice"] = 25; ages["Bob"] = 30; ages["Charlie"] = 35; // TryGetValue 사용하여 데이터 찾기 if (ages.TryGetValue("Alice", out int age)) { Console.WriteLine("Alice의 나이는: " + age); } else { Console.WriteLine("해당 키를 찾을 수 없습니다."); } // ContainsKey 사용하여 데이터 찾기 if (ages.ContainsKey("Bob")) { Console.WriteLine("Bob의 나이는: " + ages["Bob"]); } else { Console.WriteLine("해당 키를 찾을 수 없습니다."); } // 데이터 추가 (Add 메서드 사용) ages.Add("Daisy", 40); // 반복문으로 Dictionary 출력 foreach (var entry in ages) { Console.WriteLine($"{entry.Key}의 나이는: {entry.Value}"); } } } |
Update
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using System; using System.Collections.Generic; class Program { static void Main() { // Dictionary 생성 Dictionary<string, int> ages = new Dictionary<string, int>(); // 초기 데이터 추가 ages["Alice"] = 25; ages["Bob"] = 30; ages["Charlie"] = 35; // 기존 키에 값 업데이트 Console.WriteLine("Bob의 나이를 업데이트하기 전: " + ages["Bob"]); ages["Bob"] = 32; // 업데이트 Console.WriteLine("Bob의 나이를 업데이트한 후: " + ages["Bob"]); // 키가 없는 경우에는 새로 추가됨 if (!ages.ContainsKey("Daisy")) { ages["Daisy"] = 40; // 새 키 추가 Console.WriteLine("Daisy가 추가되었습니다. 나이: " + ages["Daisy"]); } // 업데이트 확인 foreach (var entry in ages) { Console.WriteLine($"{entry.Key}의 나이는: {entry.Value}"); } } } |
LINQ 로 검색
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
using System; using System.Collections.Generic; using System.Linq; // LINQ를 사용하려면 추가 class Program { static void Main() { // Dictionary 생성 Dictionary<string, int> ages = new Dictionary<string, int>(); // 초기 데이터 추가 ages["Alice"] = 25; ages["Bob"] = 30; ages["Charlie"] = 35; // 기존 키에 값 업데이트 Console.WriteLine("Bob의 나이를 업데이트하기 전: " + ages["Bob"]); ages["Bob"] = 32; // 업데이트 Console.WriteLine("Bob의 나이를 업데이트한 후: " + ages["Bob"]); // 키가 없는 경우에는 새로 추가됨 if (!ages.ContainsKey("Daisy")) { ages["Daisy"] = 40; // 새 키 추가 Console.WriteLine("Daisy가 추가되었습니다. 나이: " + ages["Daisy"]); } // 25세 이상만 찾는 코드 추가 (방법 1: foreach 사용) Console.WriteLine("\n25세 이상인 사람들 (방법 1):"); foreach (var entry in ages) { if (entry.Value >= 25) { Console.WriteLine($"{entry.Key}: {entry.Value}"); } } // 25세 이상만 찾는 코드 추가 (방법 2: LINQ 사용) Console.WriteLine("\n25세 이상인 사람들 (방법 2):"); var filteredAges = ages.Where(entry => entry.Value >= 25); foreach (var entry in filteredAges) { Console.WriteLine($"{entry.Key}: {entry.Value}"); } } } |
출력 결과
위 코드를 실행하면 아래와 같은 출력이 예상됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Bob의 나이를 업데이트하기 전: 30 Bob의 나이를 업데이트한 후: 32 Daisy가 추가되었습니다. 나이: 40 25세 이상인 사람들 (방법 1): Alice: 25 Bob: 32 Charlie: 35 Daisy: 40 25세 이상인 사람들 (방법 2): Alice: 25 Bob: 32 Charlie: 35 Daisy: 40 |
프로그래밍에서 HashSet
은 효율적인 방식으로 유니크한 요소를 저장하는 컬렉션입니다. 특히, 요소가 컬렉션에서 한 번만 나타나야 하고, 빠르게 접근할 필요가 있을 때 유용합니다. HashSet
은 다양한 프로그래밍 언어에서 구현되어 있으며, 속성과 메서드는 다소 다를 수 있지만, 기본 원리는 비슷합니다.
HashSet의 특성:
- 유니크함 : 각 요소는 유니크해야 하며, 중복은 허용되지 않습니다. 중복 요소를 추가하려고 하면 추가가 실패하거나 무시됩니다.
- 순서 : 요소의 순서를 유지하지 않습니다. 따라서
HashSet
의 요소를 반복해서 접근할 때 매번 다른 순서로 나타날 수 있습니다. - 효율성 : 요소를 추가하거나 제거하거나 요소의 존재 여부를 확인하는 작업은 매우 효율적으로 실행되며, 일반적으로 상수 시간, O(1) 에 실행됩니다. 이러한 효율성은 요소들이 버킷 배열의 인덱스로 해싱되는 해시 테이블을 사용하기 때문입니다.
- Null 값 : Null 값을 허용할 수도 있고 그렇지 않을 수도 있습니다. 예를 들어, 자바에서는 Null 요소를 하나 포함할 수 있고, .NET에서도 요소의 유형이 허용하는 경우 Null 을 저장할 수 있습니다.
HashSet의 실용적 용도:
- 중복 제거: 아이템 컬렉션에서 중복을 제거합니다.
- 멤버십 테스트: 아이템이 세트에 존재하는지 빠르게 확인합니다.
- 교집합과 차집합: 세트간의 공통 요소나 차이를 효과적으로 찾습니다.
C#에서의 예시:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System; using System.Collections.Generic; public class HashSetExample { public static void Main() { HashSet<string> names = new HashSet<string>(); names.Add("Alice"); names.Add("Bob"); names.Add("Charlie"); // 중복 추가 시도 bool added = names.Add("Alice"); Console.WriteLine("Alice가 다시 추가됐나요? " + added); // 출력: false // 'Bob'이 세트 안에 있는지 확인 if (names.Contains("Bob")) { Console.WriteLine("Bob이 세트 안에 있습니다."); } // 모든 이름 출력 foreach (string name in names) { Console.WriteLine(name); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
// C#에서 HashSet 사용 예시 HashSet<string> emails = new HashSet<string>(); emails.Add("example@example.com"); emails.Add("test@test.com"); // 중복된 이메일 추가 시도 bool isAdded = emails.Add("example@example.com"); // false 반환, 추가되지 않음 // 이메일 존재 여부 확인 bool contains = emails.Contains("example@example.com"); // true 반환 |
데이터의 유니크함을 보장하고 효율적으로 데이터를 관리할 수 있습니다. 요소의 순서가 중요하지 않고, 중복을 허용하지 않아야 할 때 적합한 선택입니다.
- List
특징: 요소들이 순차적으로 저장되며, 중복을 허용합니다.
장점: 인덱스를 통한 접근이 빠르고, 순서가 보장됩니다.
단점: 요소의 추가 및 삭제에 따라 성능이 저하될 수 있으며, 특정 요소를 찾기 위해서는 순차 탐색을 해야 해서 비효율적일 수 있습니다.
적합한 사용 예: 순서가 중요하거나 중복된 요소를 허용해야 하는 경우, 예를 들어 순서대로 처리해야 하는 작업 목록 관리 등. - Dictionary
특징: 키-값 쌍으로 데이터를 저장하며, 각 키는 유니크해야 합니다.
장점: 키를 통한 데이터 접근이 매우 빠르며, 키에 의한 직접적인 데이터 검색이 가능합니다.
단점: 메모리 사용이 List나 HashSet에 비해 상대적으로 크고, 키 값이 필요합니다.
적합한 사용 예: 키를 통해 빠르게 값을 검색하거나 업데이트해야 할 때, 예를 들어 사용자 ID로 사용자 정보를 빠르게 찾아야 하는 경우. - HashSet
특징: 유니크한 요소만 저장되며, 요소들의 순서는 무작위입니다.
장점: 요소의 추가, 삭제, 검색이 매우 빠릅니다.
단점: 요소의 순서가 유지되지 않고, 값의 중복을 허용하지 않습니다.
적합한 사용 예: 요소의 유니크함이 중요하거나 중복을 피하고 싶을 때, 예를 들어 방문자의 IP 주소를 저장하며 중복 방문을 체크할 때. - 상황에 따른 선택:
순서 유지와 중복 허용: List
빠른 검색 및 유니크한 키-값 쌍 관리: Dictionary
유니크한 요소의 빠른 추가, 삭제, 검색: HashSet