C# ν˜•λ³€ν™˜ 방식 비ꡐ λ³΄κ³ μ„œ

1. κ°œμš”

ν˜•λ³€ν™˜μ€ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 데이터 νƒ€μž…μ„ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. C#μ—μ„œλŠ” 주둜 as ν˜•λ³€ν™˜κ³Ό κ΄„ν˜Έλ₯Ό μ΄μš©ν•œ λͺ…μ‹œμ  ν˜•λ³€ν™˜(μΊμŠ€νŒ…)이 μ‚¬μš©λ©λ‹ˆλ‹€. λ³Έ λ³΄κ³ μ„œμ—μ„œλŠ” 두 κ°€μ§€ ν˜•λ³€ν™˜ λ°©μ‹μ˜ νŠΉμ§•, 차이점, μž₯단점을 λΉ„κ΅ν•˜μ—¬ μ„€λͺ…ν•©λ‹ˆλ‹€.

2. ν˜•λ³€ν™˜ 방식

2.1 as ν˜•λ³€ν™˜

as ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ ν˜•λ³€ν™˜μ€ μ•ˆμ „ν•œ ν˜•λ³€ν™˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. λ³€ν™˜μ΄ μ‹€νŒ¨ν•  경우 μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šκ³  null을 λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž¨μ΄ μ€‘λ‹¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” 주둜 μ°Έμ‘° νƒ€μž…(Reference Type)κ³Ό Nullable ν˜•μ‹μ— μ‚¬μš©λ©λ‹ˆλ‹€.

νŠΉμ§•:

  • ν˜•λ³€ν™˜ μ‹€νŒ¨ μ‹œ null λ°˜ν™˜.
  • μ°Έμ‘° νƒ€μž…κ³Ό Nullable ν˜•μ‹μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯.
  • λ³€ν™˜ 성곡 μ—¬λΆ€λ₯Ό null 체크λ₯Ό 톡해 확인해야 함.

μ˜ˆμ‹œ:

object obj = "Hello";
string str = obj as string;  // 성곡: str은 "Hello"

object obj2 = 123;
string str2 = obj2 as string; // μ‹€νŒ¨: str2λŠ” null

if (str2 == null)
{
    Console.WriteLine("ν˜•λ³€ν™˜ μ‹€νŒ¨");
}

μž₯점:

  • μ˜ˆμ™Έλ₯Ό λ˜μ§€μ§€ μ•Šμ•„ μ•ˆμ •μ .
  • ν”„λ‘œκ·Έλž¨μ˜ 흐름이 μ€‘λ‹¨λ˜μ§€ μ•ŠμŒ.

단점:

  • λ³€ν™˜ μ‹€νŒ¨λ₯Ό null둜 λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— 좔가적인 null 체크가 ν•„μš”ν•¨.
  • κΈ°λ³Έ ν˜•μ‹(int, double λ“±)μ—λŠ” μ‚¬μš©ν•  수 μ—†μŒ.

2.2 κ΄„ν˜Έλ₯Ό μ΄μš©ν•œ λͺ…μ‹œμ  ν˜•λ³€ν™˜

κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜λŠ” ν˜•λ³€ν™˜μ€ λͺ…μ‹œμ  ν˜•λ³€ν™˜(μΊμŠ€νŒ…)으둜, ν˜•λ³€ν™˜μ΄ μ‹€νŒ¨ν•  경우 InvalidCastException μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. μ°Έμ‘° νƒ€μž…κ³Ό κ°’ νƒ€μž… λͺ¨λ‘μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νŠΉμ§•:

  • ν˜•λ³€ν™˜ μ‹€νŒ¨ μ‹œ μ˜ˆμ™Έ λ°œμƒ (InvalidCastException).
  • λͺ¨λ“  νƒ€μž…(μ°Έμ‘° νƒ€μž… 및 κ°’ νƒ€μž…)에 μ‚¬μš© κ°€λŠ₯.
  • κ°•μ œλ‘œ ν˜•λ³€ν™˜ μ‹œλ„.

μ˜ˆμ‹œ:

object obj = "Hello";
string str = (string)obj; // 성곡: str은 "Hello"

object obj2 = 123;
string str2 = (string)obj2; // μ‹€νŒ¨: InvalidCastException λ°œμƒ

μž₯점:

  • κ°•μ œλ‘œ λ³€ν™˜μ„ μ‹œλ„ν•˜λ©° μ˜ˆμ™Έλ₯Ό 톡해 였λ₯˜λ₯Ό 확인할 수 있음.
  • λͺ¨λ“  νƒ€μž…μ—μ„œ μ‚¬μš©ν•  수 있음.

단점:

  • ν˜•λ³€ν™˜ μ‹€νŒ¨ μ‹œ μ˜ˆμ™Έκ°€ λ°œμƒν•΄ ν”„λ‘œκ·Έλž¨μ΄ 쀑단될 μœ„ν—˜μ΄ 있음.
  • μ˜ˆμ™Έλ₯Ό λ°©μ§€ν•˜λ €λ©΄ try-catch 블둝을 μ‚¬μš©ν•΄μ•Ό 함.

3. 차이점 비ꡐ

ꡬ뢄 as ν˜•λ³€ν™˜ κ΄„ν˜Έ ν˜•λ³€ν™˜
μ‹€νŒ¨ μ‹œ κ²°κ³Ό null λ°˜ν™˜ InvalidCastException λ°œμƒ
λŒ€μƒ μ°Έμ‘° νƒ€μž…, Nullable ν˜•μ‹ λͺ¨λ“  νƒ€μž… (μ°Έμ‘°, κ°’ νƒ€μž…)
μ•ˆμ „μ„± μ•ˆμ „ (μ˜ˆμ™Έ μ—†μŒ) μ˜ˆμ™Έ λ°œμƒ μœ„ν—˜
ν˜•λ³€ν™˜ λΆˆκ°€ μ‹œ 처리 null 체크 ν•„μš” μ˜ˆμ™Έ 처리 ν•„μš”
μ½”λ“œ μ˜ˆμ‹œ var result = obj as string; var result = (string)obj;

4. κ²°λ‘  및 μ‚¬μš© κ°€μ΄λ“œ

4.1 as ν˜•λ³€ν™˜ μ‚¬μš© μ‹œμ 

  • μ°Έμ‘° νƒ€μž…μ΄λ‚˜ Nullable ν˜•μ‹μ„ λŒ€μƒμœΌλ‘œ ν•  λ•Œ μ‚¬μš©.
  • ν˜•λ³€ν™˜ μ‹€νŒ¨ μ‹œ μ˜ˆμ™Έλ₯Ό ν”Όν•˜κ³  null을 λ°˜ν™˜ν•˜λ„λ‘ 섀계할 λ•Œ 유리.
  • λ³€ν™˜ 성곡 μ—¬λΆ€λ₯Ό null 체크둜 μ²˜λ¦¬ν•  수 μžˆλŠ” 경우.

4.2 κ΄„ν˜Έλ₯Ό μ΄μš©ν•œ λͺ…μ‹œμ  ν˜•λ³€ν™˜ μ‚¬μš© μ‹œμ 

  • κ°’ νƒ€μž…μ΄λ‚˜ κ°•μ œ ν˜•λ³€ν™˜μ΄ ν•„μš”ν•œ 경우 μ‚¬μš©.
  • λ³€ν™˜ μ‹€νŒ¨ μ‹œ μ˜ˆμ™Έλ₯Ό 톡해 였λ₯˜λ₯Ό ν™•μΈν•˜κ³ μž ν•  λ•Œ 유리.
  • μ„±λŠ₯이 μ€‘μš”ν•œ μ½”λ“œμ—μ„œλŠ” μ˜ˆμ™Έ λ°œμƒμ„ μ΅œμ†Œν™”ν•˜λ„λ‘ μ£Όμ˜ν•΄μ•Ό 함.

4.3 κ²°λ‘ 

ν˜•λ³€ν™˜ 방식을 선택할 λ•Œμ˜ 기쀀은 μ•ˆμ „μ„±κ³Ό μœ μ—°μ„±μž…λ‹ˆλ‹€.

  • μ•ˆμ „ν•œ ν˜•λ³€ν™˜μ΄ ν•„μš”ν•˜λ©΄ asλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • κ°•μ œ ν˜•λ³€ν™˜κ³Ό μ˜ˆμ™Έ μ²˜λ¦¬κ°€ ν•„μš”ν•œ 경우 κ΄„ν˜Έ ν˜•λ³€ν™˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

개발 ν™˜κ²½κ³Ό μš”κ΅¬ 사항에 맞게 μ μ ˆν•œ ν˜•λ³€ν™˜ 방식을 μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.


5. 참고 자료