4λ²μ§Έ μ€ν°λ μ΄ν μ 리
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>>
κ°μ²΄λ₯Ό λ°ννλ―λ‘ λΉλκΈ° λ©μλμμλ μ΄λ₯Ό μ¬μ©ν μ μλ€.