λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ—£οΈ μ‹ μž… 인터뷰/C#

μ‹ μž… 개발자 κΈ°μˆ λ©΄μ ‘ : C# 01

πŸ—£οΈ C#의 μ£Όμš” νŠΉμ§•μ„ μ„€λͺ…ν•΄μ£Όμ„Έμš”. C, C++κ³Ό μ–΄λ–»κ²Œ λ‹€λ₯Έκ°€μš”?

 

C#은 객체지ν–₯, κ°•λ ₯ν•œ νƒ€μž… μ‹œμŠ€ν…œ, μžλ™ λ©”λͺ¨λ¦¬ 관리(가비지 μ»¬λ ‰μ…˜), 버전 관리 및 λ³΄μ•ˆ, ν”Œλž«νΌ 독립성(주둜 .NET ν™˜κ²½) 등을 νŠΉμ§•μœΌλ‘œ ν•˜λŠ” κ³ κΈ‰ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μž…λ‹ˆλ‹€.

C++에 λΉ„ν•΄ 더 μ—„κ²©ν•œ 객체지ν–₯ 원칙과 κ°•λ ₯ν•œ νƒ€μž… μ•ˆμ „μ„±μ„ μ œκ³΅ν•˜λ©°, C와 달리 절차적 ν”„λ‘œκ·Έλž˜λ° λŒ€μ‹  객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ— 쀑점을 λ‘‘λ‹ˆλ‹€.

λ˜ν•œ μžλ™ λ©”λͺ¨λ¦¬ 관리(가비지 μ»¬λ ‰μ…˜)λ₯Ό μ œκ³΅ν•˜μ—¬, C++κ³Ό C의 μˆ˜λ™ λ©”λͺ¨λ¦¬ 관리(예: `new`, `delete`, `malloc`, `free`)와 κ΅¬λ³„λ©λ‹ˆλ‹€.

C#은 λ§ˆμ΄ν¬λ‘œμ†Œν”„νŠΈμ˜ .NET ν”„λ ˆμž„μ›Œν¬μ™€ λ°€μ ‘ν•˜κ²Œ μ—°κ΄€λ˜μ–΄ 있으며, 이λ₯Ό 톡해 λ‹€μ–‘ν•œ ν”Œλž«νΌμ—μ„œ 싀행될 수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. C와 C++은 ν”Œλž«νΌμ— 더 의쑴적이며, 특히 C++λŠ” 크둜슀 ν”Œλž«νΌ 개발 μ‹œ 좔가적인 λ…Έλ ₯이 ν•„μš”ν•©λ‹ˆλ‹€.


πŸ—£οΈ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 원칙은 무엇이며, C#μ—μ„œ 이λ₯Ό μ–΄λ–»κ²Œ κ΅¬ν˜„ν•˜λ‚˜μš”?

 

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ κΈ°λ³Έ 원칙: 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μ£Όμš” μ›μΉ™μ—λŠ” μΊ‘μŠν™”(Encapsulation), 상속(Inheritance), λ‹€ν˜•μ„±(Polymorphism), 그리고 좔상화(Abstraction)κ°€ ν¬ν•¨λ©λ‹ˆλ‹€. 이듀은 λ³΅μž‘ν•œ μ‹œμŠ€ν…œμ„ 더 κ΄€λ¦¬ν•˜κΈ° 쉽고 μœ μ—°ν•˜λ©° ν™•μž₯ κ°€λŠ₯ν•œ λ°©μ‹μœΌλ‘œ μ„€κ³„ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.

μΊ‘μŠν™”: C#μ—μ„œ μΊ‘μŠν™”λŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터와 λ©”μ„œλ“œλ₯Ό ν•œ λ‹¨μœ„λ‘œ λ¬ΆλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 데이터 은닉과 λ³΄μ•ˆμ„ κ°•ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

상속: C#μ—μ„œ 상속은 ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ 클래슀의 속성과 λ©”μ„œλ“œλ₯Ό 물렀받을 수 μžˆλ„λ‘ ν•¨μœΌλ‘œμ¨, μ½”λ“œ μž¬μ‚¬μš©μ„±κ³Ό ν™•μž₯성을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.

λ‹€ν˜•μ„± 및 좔상화: C#μ—μ„œ λ‹€ν˜•μ„±μ€ λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©μ„ 톡해 κ΅¬ν˜„λ˜λ©°, μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 클래슀λ₯Ό μ‚¬μš©ν•œ μΆ”μƒν™”λŠ” ν”„λ‘œκ·Έλž¨ 섀계λ₯Ό 더 일반적이고 ν™•μž₯ κ°€λŠ₯ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.


πŸ—£οΈ C#μ—μ„œ κ°’ νƒ€μž…(Value Type)κ³Ό μ°Έμ‘° νƒ€μž…(Reference Type)의 차이점은 λ¬΄μ—‡μΈκ°€μš”?

 

κ°’ νƒ€μž…(Value Type): C#μ—μ„œ κ°’ νƒ€μž…μ€ 데이터가 직접 λ³€μˆ˜μ— μ €μž₯되며, 주둜 μŠ€νƒ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ©λ‹ˆλ‹€. κ°’ νƒ€μž…μ€ κΈ°λ³Έ 데이터 νƒ€μž…(int, float, bool λ“±)κ³Ό ꡬ쑰체(struct)λ₯Ό ν¬ν•¨ν•˜λ©°, λ³€μˆ˜λ₯Ό 볡사할 λ•Œ λ°μ΄ν„°μ˜ μ‹€μ œ 볡사본이 μƒμ„±λ©λ‹ˆλ‹€.

μ°Έμ‘° νƒ€μž…(Reference Type): μ°Έμ‘° νƒ€μž…μ€ 데이터가 νž™ λ©”λͺ¨λ¦¬μ— μ €μž₯되며, λ³€μˆ˜λŠ” λ°μ΄ν„°μ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€. 클래슀(class), λ°°μ—΄, μΈν„°νŽ˜μ΄μŠ€, λΈλ¦¬κ²Œμ΄νŠΈλŠ” μ°Έμ‘° νƒ€μž…μž…λ‹ˆλ‹€. λ³€μˆ˜λ₯Ό 볡사할 λ•Œ λ©”λͺ¨λ¦¬ μ£Όμ†Œμ˜ 볡사본이 μƒμ„±λ˜λ―€λ‘œ μ—¬λŸ¬ λ³€μˆ˜κ°€ λ™μΌν•œ 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ 관리: κ°’ νƒ€μž…μ€ μŠ€νƒμ— ν• λ‹Ήλ˜μ–΄ ν•¨μˆ˜ 호좜이 λλ‚˜λ©΄ μžλ™μœΌλ‘œ μ •λ¦¬λ˜λŠ” 반면, μ°Έμ‘° νƒ€μž…μ€ νž™μ— ν• λ‹Ήλ˜μ–΄ 가비지 컬렉터에 μ˜ν•΄ κ΄€λ¦¬λ©λ‹ˆλ‹€.

μ„±λŠ₯κ³Ό μ‚¬μš©: κ°’ νƒ€μž…μ€ 일반적으둜 μž‘κ³  κ°„λ‹¨ν•œ 데이터λ₯Ό λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©λ˜λ©°, μ°Έμ‘° νƒ€μž…μ€ 더 λ³΅μž‘ν•œ 데이터 ꡬ쑰와 객체 지ν–₯ 섀계에 μ ν•©ν•©λ‹ˆλ‹€.


πŸ—£οΈ C#의 가비지 μ»¬λ ‰μ…˜(Garbage Collection) λ©”μ»€λ‹ˆμ¦˜μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

 

가비지 μ»¬λ ‰μ…˜ μ •μ˜: C#μ—μ„œ 가비지 μ»¬λ ‰μ…˜(GC)은 .NET λŸ°νƒ€μž„μ˜ μΌλΆ€λ‘œ, 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ μ°Ύμ•„λ‚΄κ³  ν•΄μ œν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€. 이 λ©”μ»€λ‹ˆμ¦˜μ€ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•˜κ³ , λ©”λͺ¨λ¦¬ 관리λ₯Ό κ°œλ°œμžλ‘œλΆ€ν„° μΆ”μƒν™”ν•©λ‹ˆλ‹€.

λ™μž‘ 방식: GCλŠ” μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체, 즉 μ–΄λ–€ 루트 μ°Έμ‘°(예: μ „μ—­ λ³€μˆ˜, μŠ€νƒ λ³€μˆ˜)μ—μ„œλ„ μ ‘κ·Όν•  수 μ—†λŠ” 객체λ₯Ό κ°€λΉ„μ§€λ‘œ κ°„μ£Όν•˜κ³ , μ΄λŸ¬ν•œ 객체가 μ‚¬μš©ν•˜λ˜ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•©λ‹ˆλ‹€.

μ„ΈλŒ€λ³„ μˆ˜μ§‘: .NET의 GCλŠ” μ„ΈλŒ€λ³„(Gen 0, Gen 1, Gen 2) μˆ˜μ§‘ 방식을 μ‚¬μš©ν•˜μ—¬, 객체의 수λͺ…에 따라 λ‹€λ₯΄κ²Œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. μ Šμ€ 객체(짧은 수λͺ…을 가진)λŠ” Gen 0에 ν• λ‹Ήλ˜λ©°, 였래된 κ°μ²΄λŠ” μƒμœ„ μ„ΈλŒ€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.

가비지 μ»¬λ ‰μ…˜μ€ λ©”λͺ¨λ¦¬ 관리λ₯Ό λ‹¨μˆœν™”ν•˜μ§€λ§Œ, GCκ°€ 싀행될 λ•ŒλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 싀행이 μΌμ‹œ 쀑지될 수 μžˆμœΌλ―€λ‘œ, μ„±λŠ₯에 영ν–₯을 쀄 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, GC의 λ™μž‘ 방식과 μ„±λŠ₯에 λŒ€ν•œ μ΄ν•΄λŠ” C# κ°œλ°œμ—μ„œ μ€‘μš”ν•©λ‹ˆλ‹€.


πŸ—£οΈ C#μ—μ„œ μΈν„°νŽ˜μ΄μŠ€(Interface)와 좔상 클래슀(Abstract Class)의 차이점을 μ„€λͺ…ν•΄μ£Όμ„Έμš”.

 

C#μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λŠ” λ©”μ„œλ“œ, ν”„λ‘œνΌν‹°, 이벀트, μΈλ±μ„œμ˜ μ‹œκ·Έλ‹ˆμ²˜λ§Œμ„ μ„ μ–Έν•  수 있으며, κ΅¬ν˜„μ„ 포함할 수 μ—†μŠ΅λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 있고, μΈν„°νŽ˜μ΄μŠ€λŠ” λ‹€ν˜•μ„±μ„ μœ„ν•œ κ³„μ•½μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

좔상 ν΄λž˜μŠ€λŠ” 일뢀 λ˜λŠ” 전체 λ©”μ„œλ“œμ— κ΅¬ν˜„μ„ 포함할 수 있으며, 일뢀 λ©”μ„œλ“œλŠ” 좔상(κ΅¬ν˜„λ˜μ§€ μ•Šμ€) μƒνƒœλ‘œ λ‚¨κ²¨λ‘˜ 수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” 단 ν•˜λ‚˜μ˜ 좔상 클래슀만 상속받을 수 μžˆμŠ΅λ‹ˆλ‹€.

ν΄λž˜μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  λ•ŒλŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•˜μ§€λ§Œ, 좔상 클래슀λ₯Ό 상속받을 λ•ŒλŠ” 이미 κ΅¬ν˜„λœ λ©”μ„œλ“œλ₯Ό μž¬μ‚¬μš©ν•˜κ³  좔상 λ©”μ„œλ“œλ§Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€λŠ” λ‹€μ–‘ν•œ ν΄λž˜μŠ€κ°€ λ™μΌν•œ 계약을 λ”°λ₯΄λ„둝 κ°•μ œν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, 좔상 ν΄λž˜μŠ€λŠ” κ³΅ν†΅μ˜ κΈ°λŠ₯을 가진 ν΄λž˜μŠ€μ— λŒ€ν•œ 베이슀 클래슀둜 μ‚¬μš©λ©λ‹ˆλ‹€.


πŸ—£οΈ C#의 delegate와 event에 λŒ€ν•΄ μ„€λͺ…ν•˜κ³ , μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ 예λ₯Ό λ“€μ–΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#μ—μ„œ μ˜ˆμ™Έ 처리(Exception Handling) 방법에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ LINQ(Language Integrated Query)κ°€ 무엇이며, C#μ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©λ˜λ‚˜μš”?

 

IPλŠ”


πŸ—£οΈ C#의 λ©€ν‹°μŠ€λ ˆλ”©κ³Ό λ™μ‹œμ„± μ²˜λ¦¬μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#μ—μ„œμ˜ ν”„λ‘œνΌν‹°(Properties)와 ν•„λ“œ(Fields)의 차이점은 λ¬΄μ—‡μΈκ°€μš”?

 

IPλŠ”


πŸ—£οΈ C#μ—μ„œμ˜ async/await ν‚€μ›Œλ“œμ— λŒ€ν•΄ μ„€λͺ…ν•˜κ³ , κ·Έ μ‚¬μš© 예λ₯Ό μ œκ³΅ν•΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#μ—μ„œμ˜ μΊ‘μŠν™”(Encapsulation), 상속(Inheritance), λ‹€ν˜•μ„±(Polymorphism)을 μ„€λͺ…ν•΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#의 'using' 문에 λŒ€ν•΄ μ„€λͺ…ν•˜κ³ , μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#의 νŠΉμ„±(Attributes)에 λŒ€ν•΄ μ„€λͺ…ν•˜κ³ , μ‚¬μš© 사둀λ₯Ό μ œκ³΅ν•΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#의 μ œλ„€λ¦­(Generic) νƒ€μž…κ³Ό λ©”μ„œλ“œμ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#μ—μ„œμ˜ μΈλ±μ„œ(Indexer) κ°œλ…μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#μ—μ„œμ˜ Nullable νƒ€μž…μ— λŒ€ν•΄ μ„€λͺ…ν•˜κ³ , μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#μ—μ„œμ˜ Reflection에 λŒ€ν•΄ μ„€λͺ…ν•˜κ³ , μ–΄λ–€ κ²½μš°μ— μ‚¬μš©λ˜λŠ”μ§€ 예λ₯Ό λ“€μ–΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#의 Extension Methods에 λŒ€ν•΄ μ„€λͺ…ν•˜κ³ , μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ 예λ₯Ό λ“€μ–΄μ£Όμ„Έμš”.

 

IPλŠ”


πŸ—£οΈ C#μ—μ„œμ˜ Lambda ν‘œν˜„μ‹μ— λŒ€ν•΄ μ„€λͺ…ν•˜κ³ , μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ 예λ₯Ό λ“€μ–΄μ£Όμ„Έμš”.

 

IPλŠ”


Reference

 

https://hashdork.com/ko/c-hash-interview-questions/