catch ์์ ๋ค์ฃฝ๋ฐ์ฃฝํด์ ํ์ธ
class Program
{
class A
{
public int field;
public static int getField(A obj)
{
return obj.field;
}
}
static void Main(string[] args)
{
try
{
// DivideByZeroException
int a = 10;
int b = 0;
Console.WriteLine(a / b);
// NullReferenceException
A obj = null;
Console.WriteLine(A.getField(obj));
// IndexOutOfRangeException
int[] arr = { 1, 2, 3 };
for (int i = 0; i < 4; i++)
{
Console.WriteLine(arr[i]);
}
}
catch (DivideByZeroException e)
{
Console.WriteLine("์๋ฌ : {0}", e.Message);
}
catch (Exception e)
{
Console.WriteLine("์๋ฌ : {0}", e.Message);
}
catch (IndexOutOfRangeException e)
{
Console.WriteLine("์๋ฌ : {0}", e.Message);
}
catch (NullReferenceException e)
{
Console.WriteLine("์๋ฌ : {0}", e.Message);
}
finally
{
Console.WriteLine("ํ๋ก๊ทธ๋จ ์ข
๋ฃ");
}
}
}
Output
๋ฐฐ์ด์ ๋ํ ์๊ฐ๋ณต์ก๋ => ํด์ฑ๊ณผ ๋น๊ต
๋ฐฐ์ด
๋ฐฐ์ด(array)
์ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์์ ํ ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ํ์๋ฐฐ์ด์ ๋ ผ๋ฆฌ์ ์ธ ์ ์ฅ์์์ ๋ฌผ๋ฆฌ์ ์ธ ์ ์ฅ์์๊ฐ ์ผ์น
๋ฐ๋ผ์
์ธ๋ฑ์ค(index)
๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์์์ ์ ๊ทผํ ์๊ฐ ์๋ค.์ธ๋ฑ์ค๋ฅผ ์๊ณ ์๋ค๋ฉด ๊ฐ๊ฐ์ ์์๋ฅผ ๋ฐ๋ก ์ฐพ์๊ฐ ์ ์๊ฒ ๋๋ฏ๋ก ์์๋ฅผ ์ฐพ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ๋ณต์ก๋๋
O(1)
์ด๋ผ๊ณ ๋ณผ ์ ์๊ณ , ์ด๋ฅผ์์ ์ ๊ทผ(random access)์ด ๊ฐ๋ฅ
ํ๋ค๊ณ ๋งํ๋ค.๋ฐ๋ฉด์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ฝ์ ์ ํ๊ฒ ๋๋ฉด ์กฐ๊ธ ๋ณต์กํด์ง๋ค.
์ญ์ ์ ๊ฒฝ์ฐ ๋จผ์ ํด๋น ์์์ ์ ๊ทผ์ ํด์ ์์ ์ ์๋ฃํ๋๋ฐ
(O(1))
, ์ด ์ํ๋ ๋ฐฐ์ด์ ์ฐ์์ ์ธ ํน์ฑ์ด ๊นจ์ง๊ฒ ๋๋ค.๋ฐ๋ผ์ ์ด๋ฌํ ๋น ๊ณต๊ฐ์ ๋ฉ๊ฟ์ฃผ๊ธฐ ์ํด์ ์ญ์ ํ ์์๋ณด๋ค ๋ ํฐ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ ์์๋ค์ shift ํด์ฃผ์ด์ผ ํ๋ฉฐ, ์ด ๋ ๋น์ฉ์ด ๋ฐ์ํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ์๊ฐ๋ณต์ก๋๋
O(n)
์ด ๋๋ค. ์ฝ์ ์ ๊ฒฝ์ฐ๋ ๋น์ทํ๊ฒ ์๊ฐํด ๋ณผ ์ ์๋ค.๋ํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์ฐ์๋์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
๋ง์ฝ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋๋ ค์ผ ํ ํ์๊ฐ ์๋ค๋ฉด, ํฌ๊ธฐ๊ฐ ํฐ ๋ฐฐ์ด์ ๋ง๋ค์ด์
๊ธฐ์กด ๋ด์ฉ์ ๋ณต์ฌ
ํ๊ฑฐ๋,์ฐ๊ฒฐ ๋ฆฌ์คํธ(LinkedList)
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด ๋ณด์์ผ ํ๋ค.
ํด์ํ ์ด๋ธ
ํด์ํ ์ด๋ธ(HashTable)
์ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํค๋ฅผ ํด์๊ฐ์ผ๋ก ๋งคํํ๊ณ , ์ด ํด์๊ฐ์ ์ธ๋ฑ์ค ํน์ ์ฃผ์๋ก ์ผ์์ ๋ฐ์ดํฐ์ ๊ฐ์ ํค์ ํจ๊ป ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
ํด์ ํจ์
๋ ๋ฐ์ดํฐ์ ํจ์จ์ ๊ด๋ฆฌ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์์ ๊ธธ์ด ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ๋ ๊ธธ์ด ๋ฐ์ดํฐ๋ก ๋งคํํ๋ ํจ์์ด๋ค.์ด ๋ ๋งคํ ์ ์๋ ๋ฐ์ดํฐ ๊ฐ์
ํค(key)
, ๋งคํ ํ ๋ฐ์ดํฐ ๊ฐ์ํด์๊ฐ(hash value)
, ๋งคํํ๋ ๊ณผ์ ์์ฒด๋ฅผํด์ฑ(hashing)
์ด๋ผ๊ณ ํ๋ค.์ด์ ๊ฐ์ด ํด์ฑ์ ํ๊ฒ ๋๋ฉด, ์ ์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ง๊ณ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ค.
- ์๋ฅผ ๋ค๋ฉด ํด์ ํจ์๋ฅผ ํตํด ํ๋๋์คํฌ๋ ํด๋ผ์ฐ๋์ ์กด์ฌํ๋ ๋ฌดํ์ ๊ฐ๊น์ด ๋ฐ์ดํฐ(ํค)๋ค์ ์ ํํ ๊ฐ์์ ํด์๊ฐ์ผ๋ก ๋งคํํจ์ผ๋ก์จ ์์ ํฌ๊ธฐ์ ์บ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ก ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
ํด์ ํจ์
๋ ์ธ์ ๋ ๋์ผํ ํด์๊ฐ์ ๋ฆฌํดํ๊ณ , ์ธ๋ฑ์ค๋ง ์๋ฉด ํด์ ํ ์ด๋ธ์ด ์๋ฌด๋ฆฌ ์ปค๋ ๋ฐ์ดํฐ์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋ค.(๋ฐฐ์ด๊ณผ ์ ์ฌ)๋ฐ๋ผ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๋
O(1)
์ ์งํฅํ๋ ์์์ ๊ฐ๊น์ด ๊ฐ์ด ๋์ค๊ฒ ๋๋ค.๋ฐฐ์ด
์ ๊ฒฝ์ฐ ํ์์ ์๊ฐ๋ณต์ก๋๋O(1)
์ด์ง๋ง,๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ง์ด ํ ๋นํด ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐํจ์จ์ ์ด๋ผ๊ณ ๋ณด๊ธฐ๊ฐ ์ด๋ ต๋ค.
์ด๋ฐ ํด์ ํ ์ด๋ธ์๋ ๋จ์ ์ด ์๋๋ฐ, ๋ฐ๋ก ํด์ ํจ์๊ฐ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํค์ ๋ํด ๋์ผํ ํด์๊ฐ์ ๋ํ๋ด๋
์ถฉ๋(collision)ํ์
์ด ์ผ์ด๋๋ค๋ ๊ฒ์ด๋ค.๋ณดํต ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ฉด, *** ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ(m)๊ฐ ์ค์ ์ฌ์ฉํ๋ ํค ๊ฐ์(n)๋ณด๋ค ์ ์ด์ผ ํ๋๋ฐ(๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค ๋ฌธ์ ๋ฑ), ์ด ๋
n/m
์load factor(ฮฑ)
๋ผ๊ณ ๋ถ๋ฅธ๋ค.load factor
๊ฐ ํด ์๋ก ํด์ ์ถฉ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
์ถฉ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๋ฐฉ๋ฒ
๋ค์ด ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ, ๋ํ์ ์ธ ๋ ๊ฐ์ง ์์ด๋์ด๋๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ(seperate chaining)
๊ณผ๊ฐ๋ฐฉ ์ฃผ์๋ฒ(open addressing)
์ด๋ค.
[Serparate_Chaining](์ถ์ฒ : ratsgo ๊นํ ๋ธ๋ก๊ทธ)
- ๋จผ์
๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ
์ ์ดํด๋ณด๋ฉด ํ๋์ ๋ฒํท๋น ๋ค์ด๊ฐ ์ ์๋ ์ํธ๋ฆฌ์ ์์ ์ ํ์ ๋์ง ์์์ผ๋ก์, ๋ชจ๋ ์๋ฃ๋ฅผ ํด์ํ ์ด๋ธ์ ๋ด๋ ๊ฒ์ด๋ค. ํด๋น ๋ฒํท์ ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ ธ๋์ ๋ ธ๋๋ฅผ ์ฒด์ธ์ฒ๋ผ ์ฐ๊ฒฐํ๋ค๋ ์๋ฏธ์์ chaining์ด๋ผ๋ ์ฉ์ด๊ฐ ๋ถ์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฅ์ ์ ์ ์ฐํ๋ฉฐ, ์ญ์ ๋ฐ ์ฝ์ ์ ์๊ฐ๋ณต์ก๋๊ฐO(1)
์ผ๋ก ๋น ๋ฅด๋ค๋ ์ ์ด ์๋ค. ๋ฐ๋ฉด, ๋จ์ ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ฒด์ ์ ํ์ด ์๋ค๋ณด๋ ์ค๋ฒํค๋๊ฐ ๋ถ๋ด์ด ๋๊ณ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์๋ค๋ ์ ์ด๋ค.- ์ค๋ฒํค๋(overhead)๋ ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด ๋ค์ด๊ฐ๋ ๊ฐ์ ์ ์ธ ์ฒ๋ฆฌ ์๊ฐ ยท ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ ๋งํ๋ค.
[Open_Addressing](์ถ์ฒ : ratsgo ๊นํ ๋ธ๋ก๊ทธ)
๊ฐ๋ฐฉ ์ฃผ์๋ฒ
์ ํ ๋ฒํท๋น ๋ค์ด๊ฐ ์ ์๋ ์ํธ๋ฆฌ๊ฐ ํ๋๋ฟ์ธ ํด์ ํ ์ด๋ธ์ด๋ค.- ํด์ํจ์๋ก ์ป์ ์ฃผ์๊ฐ ์๋, ๋ค๋ฅธ ์ฃผ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋๋ก ํ์ฉํ๋ค๋ ์ทจ์ง์์
open addressing
์ด๋ผ๋ ์ด๋ฆ์ด ๋ถ์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. - ์ด ๋ฐฉ๋ฒ์ ๊ฒฝ์ฐ, ํด์ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด (์ฝ์ ํ๋ ค๋ ํด์ ๋ฒํท์ด ์ด๋ฏธ ์ฌ์ฉ์ค์ธ ๊ฒฝ์ฐ) ๋ค๋ฅธ ํด์ ๋ฒํท์ ํด๋น ์๋ฃ๋ฅผ ์ฝ์ ํ๋ค.
- ์ด ๋ ๋ค๋ฅธ ํด์ ๋ฒํท์ ์ฐพ๋ ํ์ฌ ๊ณผ์ ์
probing
์ด๋ผ๊ณ ํ๋ค. - ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ์ ์ฅ์ ์ ์บ์ ํจ์จ์ด ๋๊ณ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ์ ์ง๋ง, ํด์ ์ถฉ๋์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ์ ๋นํด์ ๋์ผ๋ฉฐ ํน์ ํด์๊ฐ์ด ํค๊ฐ ๋ชฐ๋ฆฌ๊ฒ ๋๋ฉด ํจ์จ์ฑ์ด ๊ธ๊ฒฉํ๊ฒ ๋จ์ด์ง๋ค๋ ๋จ์ ์ด ์๋ค.
์ฐธ๊ณ => https://devowen.com/209
๊ธฐ์กด ์ธ๋ฑ์ ์ฝ๋์์ Resize
๋ฅผ ํ ๋ ref
ํค์๋์ฌ์ฉ
ref
ํค์๋๋ฅผ ํตํด ์ค๊ฐ์์ ๋ฐฐ์ด์ ๋ณต์ฌํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ด๊ณ ์ ์ฌ์ฉ์ ํ์ง๋ง ์ ์ง๋ณด์ ์ธก๋ฉด์์ ์ด๋ค๊ฒ์ด ์ธ์๋ก ๋ค์ด์ ์ด๋ค๊ฒ์ด ๋๊ฐ๋์ง ํ์ธ์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์์ ์ข์ง ์๋ค. ๋ฐ๋ผ์ ์ ์ ์ํ์์๋ref
ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ํ ๊ฒ! => ๋งค๋ด์ผ์์๋ ๊ทธ๋ ๊ฒ ๋์ ์๋ค๊ณ ํ์ฌ.
for{...} ๋ด๋ถ ๋ณ์ ์ ์ธ - ์ค์ฝํ ๊ด๋ จ
์ฝ๋ ์ค๊ฐ์ ๊ฐ์ ์ด๋ฆ์ ๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉํ ์ {}
๋ฅผ ์ ํ์ฉํ๋ฉด ํธํ ์ ์๋ค.
๋ฐ์ฑ & ์ธ๋ฐ์ฑ
Conqurent Queue
public class ConcurrentQueue<T> : System.Collections.Concurrent.IProducerConsumerCollection<T>, System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.ICollection
- ์ค๋ ๋๋ก๋ถํฐ ์์ ํ FIFO(์ ์ ์ ์ถ) ๋ฐฉ์์ ์ปฌ๋ ์ ์ด๋ค.
์ฌ์ฉ ์์ ์ฝ๋
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
class CQ_EnqueueDequeuePeek
{
// Demonstrates:
// ConcurrentQueue<T>.Enqueue()
// ConcurrentQueue<T>.TryPeek()
// ConcurrentQueue<T>.TryDequeue()
static void Main ()
{
// Construct a ConcurrentQueue.
ConcurrentQueue<int> cq = new ConcurrentQueue<int>();
// Populate the queue.
for (int i = 0; i < 10000; i++)
{
cq.Enqueue(i);
}
// Peek at the first element.
int result;
if (!cq.TryPeek(out result))
{
Console.WriteLine("CQ: TryPeek failed when it should have succeeded");
}
else if (result != 0)
{
Console.WriteLine("CQ: Expected TryPeek result of 0, got {0}", result);
}
int outerSum = 0;
// An action to consume the ConcurrentQueue.
Action action = () =>
{
int localSum = 0;
int localValue;
while (cq.TryDequeue(out localValue)) localSum += localValue;
Interlocked.Add(ref outerSum, localSum);
};
// Start 4 concurrent consuming actions.
Parallel.Invoke(action, action, action, action);
Console.WriteLine("outerSum = {0}, should be 49995000", outerSum);
}
}
๋์ค์ ์ค๋ ๋ & ํ์คํฌ์์ ์ฑ ์ ์ค๋ฅ๊ฐ ์๋ค. ์์ ๋ฅผ ํตํด ํ์ตํ ๋ค ์๋ฌ๋ฅผ ์ก์๋ณด์
yield ํค์๋๋ฅผ ์ฌ์ฉํ์๋ Interface๋ฅผ ๊ตฌํํ์ง ์์๋ ๋๋์ด์ ์ ๋ํด์..
Program Counter(PC)
๊ฐ๋ ์ด ๋ค์ด๊ฐ๋ ๊ฒ ๊ฐ์๋ฐ ํ๋ฒ ์ฐพ์๋ณด์๋ฐํ ํ์์ด
IEnumerable
,IEnumerable<T>
,IEnumerator
๋๋IEnumerator<T
> ๋ฉ์๋์yield
ํค์๋๋ฅผ ๋ฃ์ผ๋ฉด ๋ฐํ ํ์ (IEnumerable
๋๋IEnumerator
)์ ๊ตฌํ์ ์์ฑํ๋๋ก ์ปดํ์ผ๋ฌ์ ์ง์ํ๋ค.yield
ํค์๋๋ ์ด๋ก ์ ์ผ๋ก ๋ฌด์ ํ ์ํ์ค์"๋ค์"
์์๋ฅผ ๋ฐํํ๋ ค๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ฏ๋ก ์ฌ์ ์ ์ ์ฒด ์ํ์ค๋ฅผ ๊ณ์ฐํ ์ ์๊ฑฐ๋ ๋ฐํํ๊ธฐ ์ ์ ์ ์ฒด ๊ฐ ์ํ์ค๋ฅผ ๊ณ์ฐํ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ๋ฐ๋์งํ์ง ์์ ์ผ์ ์ค์ง๊ฐ ๋ฐ์ํ ์ ์๋ค.yield break
๋ ๋ํ ์ธ์ ๋ ์ง ์์ด์ ์ข ๊ฒฐํ๋๋ฐ ์ฌ์ฉ๋ ์ ์๋ค.yield
ํค์๋๋IEnumerable<T>
์ ๊ฐ์ ๋ฐํ ์ ํ์ผ๋ก ๋ฐ๋ณต๊ธฐ ์ธํฐํ์ด์ค ์ ํ์ ์๊ตฌํ๊ธฐ ๋๋ฌธ์Task<IEnumerable<T>>
๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฏ๋ก ๋น๋๊ธฐ ๋ฉ์๋์์๋ ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
'๐ป Programming Language > C#' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
6๋ฒ์งธ ์คํฐ๋ (0) | 2022.04.09 |
---|---|
5๋ฒ์งธ ์คํฐ๋ (0) | 2022.04.09 |
3๋ฒ์งธ ์คํฐ๋ ์ดํ ์ ๋ฆฌ (0) | 2022.04.09 |
์คํฐ๋) ๋๋ฒ์งธ ์คํฐ๋ ํผ๋๋ฐฑ ๋ฐ ์ง๋ฌธ ์ ๋ฆฌ๋ด์ฉ (0) | 2022.04.08 |
์คํฐ๋) ์ฒซ๋ฒ์งธ ์คํฐ๋ ํผ๋๋ฐฑ ๋ฐ ์ง๋ฌธ ์ ๋ฆฌ๋ด์ฉ (0) | 2022.04.08 |