[Book] Effective C# - CHAPTER 1 C# ์–ธ์–ด์š”์†Œ

2020. 11. 14. 19:48ยท๐Ÿ“ Book/โœ Effective

์•„์ดํ…œ 1. ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” var๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค.

var ํ‚ค์›Œ๋“œ๋Š” ์•”์‹œ์  ํƒ€์ž…์˜ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋Œ€์ž…๋œ ๊ฐ’์˜ ํƒ€์ž…์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

์ง€์—ญ๋ณ€์ˆ˜์—๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ •ํ™•ํ•œ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์•Œ์ง€ ๋ชปํ•œ ์ฑ„ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. ex) IQueryable <T>๋ฅผ IEnumerable <T>๋กœ ๊ฐ•์ œ ํ˜•๋ณ€ํ™˜
  • ํƒ€์ž…์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜...

  • ์ •์  ํƒ€์ดํ•‘์„ ํ›ผ์†์‹œํ‚จ๋‹ค: ๋™์  ํƒ€์ดํ•‘์ด ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜์—ฌ ๊ฒฐ์ •ํ•œ๋‹ค.
  • ๊ณผ๋„ํ•œ ์‚ฌ์šฉ์œผ๋กœ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜๊ฑฐ๋‚˜ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ๊ฐํ•œ ํƒ€์ž…๊ณผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ถ”๋ก ํ•œ ํƒ€์ž…์ด ๋‹ฌ๋ผ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • ์ •๋ฐ€๋„ ์†์‹ค์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋‚ด์žฅ ์ˆซ์ž ํƒ€์ž…(int, float, double ๋“ฑ)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

 

์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด var๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 


์•„์ดํ…œ 2. const ๋ณด๋‹ค๋Š” readonly๊ฐ€ ์ข‹๋‹ค.

์ปดํŒŒ์ผ ํƒ€์ž„ ์ƒ์ˆ˜(const)๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ณ€์ˆ˜๊ฐ€ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋œ๋‹ค.

  • ๋‚ด์žฅ ์ž๋ฃŒํ˜•์ด์–ด์•ผ๋งŒ ์ปดํŒŒ์ผํƒ€์ž„์— ์ƒ์ˆ˜๋ฅผ ๋ฆฌํ„ฐ๋Ÿด๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด์žฅ๋œ ์ˆซ์žํ˜•, enum, ๋ฌธ์ž์—ด, null์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ช…๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜, ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜

 

๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜(readonly)๋Š” ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋กœ ์ปดํŒŒ์ผ๋˜์–ด ๋Ÿฐํƒ€์ž„์— ๊ฐ’์ด ํ‰๊ฐ€๋œ๋‹ค.

  • ์–ด๋–ค ํƒ€์ž…๊ณผ๋„ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์™œ ์ปดํŒŒ์ผ ํƒ€์ž„ ์ƒ์ˆ˜๋ณด๋‹ค ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

  • ์ปดํŒŒ์ผํƒ€์ž„ ์ƒ์ˆ˜๊ฐ€ ์•ฝ๊ฐ„ ๋” ๋น ๋ฅด์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜์— ๋น„ํ•ด ์œ ์—ฐ์„ฑ์ด ์ƒ๋‹นํžˆ ๋–จ์–ด์ง„๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜๋Š” ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ๋ฟ ์•„๋‹ˆ๋ผ ์ƒ์„ฑ์ž์—์„œ๋„ ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜๋Š” ๋™์ผ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ผ๋„ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผํƒ€์ž„ ์ƒ์ˆ˜๋Š” ๋ชจ๋‘ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

 

์ปดํŒŒ์ผํƒ€์ž„ ์ƒ์ˆ˜๋Š” ์„ฑ๋Šฅ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๊ณ  ์ƒ์ˆ˜์˜ ๊ฐ’์ด ์ ˆ๋Œ€๋กœ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ž.

 


์•„์ดํ…œ 3. ์บ์ŠคํŠธ๋ณด๋‹ค๋Š” is, as๊ฐ€ ์ข‹๋‹ค.

C#์€ ์ •์  ํƒ€์ดํ•‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์–ธ์–ด์ด๋ฏ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ์‹œ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ฐ„ํ˜น ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ Object ํƒ€์ž…์„ ์ธ์ž๋กœ ๊ฐ–๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ํ˜•๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ์ด๋•Œ, ํ˜•๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์บ์ŠคํŠธ ์—ฐ์‚ฐ์ž์™€ as ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ is ์—ฐ์‚ฐ์ž๋กœ ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•œ์ง€ ๊ฒ€์‚ฌํ•œ ํ›„ ์‹ค์ œ ํ˜•๋ณ€ํ™˜์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

object o = Factory.GetObject();

// ์บ์ŠคํŠธ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
try
{
	MyType t;
	t = (MyType)o;
}
catch (..) {}

// as ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
MyType t = o as MyType;
if (t != null) {}

 

์บ์ŠคํŠธ ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•œ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ํ˜•๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž๊ฐ€ ๊ฐœ์ž…๋  ์ˆ˜ ์žˆ๋‹ค.

  • ์ˆซ์ž ํƒ€์ž… ํ˜•๋ณ€ํ™˜
  • ์‚ฌ์šฉ์ž ์ •์˜ ํ˜•๋ณ€ํ™˜: ๊ฐ์ฒด์˜ ๋Ÿฐํƒ€์ž„ ํƒ€์ž…์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ํƒ€์ž„ ํƒ€์ž…์— ๋งž์ถฐ ์ˆ˜ํ–‰๋œ๋‹ค.

 

as ์—ฐ์‚ฐ์ž์™€ is ์—ฐ์‚ฐ์ž๋Š” ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ•์‹ฑ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • nullable ํƒ€์ž…, ์ง€์ •ํ•œ ํƒ€์ž…, ์ง€์ •ํ•œ ํƒ€์ž…์„ ์ƒ์†ํ•œ ํƒ€์ž…์ผ ๊ฒฝ์šฐ์—๋งŒ ํ˜•๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ํ˜•๋ณ€ํ™˜์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ํƒ€์ž…๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ˜•๋ณ€ํ™˜์ด ์„ฑ๊ณตํ•œ๋‹ค.

 

์™œ ์บ์Šค๋“œ ์—ฐ์‚ฐ์ž๋ณด๋‹ค as ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

  • ๋” ์•ˆ์ „ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์— ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • as๋Š” ํ˜•๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ null์„ ๋Œ€์ƒ์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ํ•˜๋Š” ๊ฒฝ์šฐ, null์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— null ๊ฒ€์‚ฌ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์บ์ŠคํŠธ๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ์™€ null ๊ฒ€์‚ฌ๋ฅผ ๋‹ค ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

 


์•„์ดํ…œ 4. string.Format()์„ ๋ณด๊ฐ„ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒดํ•˜๋ผ.

string.Format()์€ ํฌ๋งท ๋ฌธ์ž์—ด๊ณผ ์ธ์ž ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ „๋‹ฌํ•œ๋‹ค.

  • ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ํ‘œํ˜„์‹์ด ๋‹ค์–‘ํ•˜๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ ์‹œ ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฌธ์ž์—ด ๋ณด๊ฐ„์€ ๋ฌธ์ž์—ด ์•ž์— $๋ฅผ ๋ถ™์ด๊ณ  ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝํ•  ์ธ์ž๋Š” {} ๋‚ด์— ๋‘”๋‹ค.

// string.Format()
Console.WriteLine("Example1 : {0}, {1}", "BlockDMask", 1212);

// ๋ฌธ์ž์—ด ๋ณด๊ฐ„
Console.WriteLine($"string example1 : {a} + {b} = {a+b}");

 

๊ทธ๋Ÿฌ๋‚˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ ๋ณ€์ˆ˜์— ๋ฐ•์‹ฑ ๊ณผ์ • ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์— ์ข‹์ง€ ์•Š๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฌ์ „์— ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝ(ToString())ํ•ด ๊ฐ’์„ ์ „๋‹ฌํ•ด ๋ฐ•์‹ฑ ๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‚˜์ค‘์— ๊ฐ์ฒด๋‚˜ ๋ฐ์ดํ„ฐ๋กœ ์žฌํ•ด์„์ด ํ•„์š”ํ•œ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ฌธ์ž์—ด ๋ณด๊ฐ„์„ ์‚ฌ์šฉํ•˜์ž.

 


์•„์ดํ…œ 5. ๋ฌธํ™”๊ถŒ๋ณ„๋กœ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด FormattableString์„ ์‚ฌ์šฉํ•˜๋ผ.

์—ฌ๋Ÿฌ ๋ฌธํ™”๊ถŒ๊ณผ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ๋‹ค๋ค„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์„ธ๋ถ€์ ์ธ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋ฌธ์ž์—ด ๋ณด๊ฐ„ ๊ธฐ๋Šฅ($)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜ํ™˜ ๊ฐ’์€ ๋ฌธ์ž์—ด์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ FormattableString์„ ์ƒ์†ํ•œ ํƒ€์ž…์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

// String
string first = $"It's the {DateTime.Now.Day} of the {DateTime.Now.Month} month";
// FormattableString
FormattableString second = $"It's the {DateTime.Now.Day} of the {DateTime.Now.Month} month";
// String or FormattableString
var third = $"It's the {DateTime.Now.Day} of the {DateTime.Now.Month} month";

 

FormattableString ํƒ€์ž…์€ ํ˜„์žฌ ์ปดํ“จํ„ฐ์— ์ง€์ •๋œ ๋ฌธํ™”๊ถŒ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•œ๋‹ค. ์ž…๋ ฅ๋ฐ›์€ FormattableString ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์–ธ์–ด์™€ ๋ฌธํ™”๊ถŒ์— ๋”ฐ๋ผ ์ตœ์ข… ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

public static string ToGerman(FormattableString src) 
{ 
      return string.Format(null, System.Globalization.CultureInfo.CreateSpecificCulture("de-de"), src.Format, src.GetArguments()); 
} 

public static string ToFrenchCanada(FormattableString src) 
{ 
      return string.Format(null, System.Globalization.CultureInfo.CreateSpecificCulture("fr-CA"), src.Format, src.GetArguments());
}

 

๋ฌธํ™”๊ถŒ์„ ์ž„์˜๋กœ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ช…์‹œ์ ์œผ๋กœ FormattableString ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ด ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด์„ ์–ป์–ด ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ž.

 


์•„์ดํ…œ 6. nameof() ์—ฐ์‚ฐ์ž๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜๋ผ.

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์ด ์ ์ฐจ ๋Œ€์ค‘ํ™”๋จ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์ผ์ด ๋งŽ์•„์กŒ๋‹ค. ์ด๋Ÿฌํ•œ ์ฐจ์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฆ„์ด๋‚˜ ๋ฌธ์ž์—ด ์‹๋ณ„์ž์— ์˜์กดํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฐ™์€ ๋ฐฉ์‹์€ ์ถ”๊ฐ€ ๋น„์šฉ์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๋‹จ์ ์œผ๋กœ ํƒ€์ž… ์ •๋ณด๋ฅผ ์†์‹คํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

nameof() ์—ฐ์‚ฐ์ž๋Š” ์‹ฌ๋ณผ ๊ทธ ์ž์ฒด๋ฅผ ํ•ด๋‹น ์‹ฌ๋ณผ์„ ํฌํ•จํ•˜๋Š” ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์•ž์„  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

  • ํƒ€์ž…, ๋ณ€์ˆ˜, ์ธํ„ฐํŽ˜์ด์Šค, ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ •๊ทœํ™”๋œ ์ด๋ฆ„์ด๋ผ๋„ ํ•ญ์ƒ ๋กœ์ปฌ ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์˜ˆ์™ธ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ํŠน์„ฑ(attribute)์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฝ๋กœ ์ง€์ • ๋“ฑ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ nameof() ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜์ž.

 


์•„์ดํ…œ 7. ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝœ๋ฐฑ์„ ํ‘œํ˜„ํ•˜๋ผ.

์ฝœ๋ฐฑ์ด๋ž€ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ C#์—์„œ๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๊ธฐ์ˆ ์ด๋‚˜ ๋™๊ธฐ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ ํ™œ์šฉ๋œ๋‹ค.

  • ๋Ÿฐํƒ€์ž„์— ํ†ต์ง€ ๋Œ€์ƒ์„ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์–ด ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ(๋‹ค์ˆ˜์˜ ํด๋ผ์ด์–ธํŠธ)๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๊ฐ ๋ฉ”์„œ๋“œ๋Š” ์ •์  ๋ฉ”์„œ๋“œ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
    • ๋Œ€์ƒ ํ•จ์ˆ˜๋“ค์„ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋˜๋Š”๋ฐ, ์–ด๋–ค ์˜ˆ์™ธ๋„ ์žก์ง€ ์•Š์•„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ ๊ณผ์ •์ด ์ค‘๋‹จ๋œ๋‹ค.
    • ๋งˆ์ง€๋ง‰์œผ๋กœ ํ˜ธ์ถœ๋œ ๋Œ€์ƒ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.
  • ๋™์ผํ•œ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋”๋ผ๋„ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋กœ ๊ฐ„์ฃผ๋˜๋ฏ€๋กœ ๋‘˜ ์‚ฌ์ด์˜ ํ˜•๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๊ฐ€ ์ƒํ˜ธ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋•Œ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‹ถ๋‹ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋Š” .NET Framework ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค.
    • Predicate <T>: ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜์—ฌ bool ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ
    • Func <>: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ ๋‹จ์ผ์˜ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ
    • Action <>: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์ง€๋งŒ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด void์ธ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ

 


์•„์ดํ…œ 8. ์ด๋ฒคํŠธ ํ˜ธ์ถœ ์‹œ์—๋Š” null ์กฐ๊ฑด ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

์ด๋ฒคํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ด๋ฒคํŠธ์— ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

null ์กฐ๊ฑด ์—ฐ์‚ฐ์ž(?.)๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์—ฐ์‚ฐ์ž์˜ ์™ผ์ชฝ์„ ํ‰๊ฐ€ํ•˜์—ฌ ์ด ๊ฐ’์ด null์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์—ฐ์‚ฐ์ž ์˜ค๋ฅธ์ชฝ์˜ ํ‘œํ˜„์‹์„ ์‹คํ–‰ํ•œ๋‹ค.

public class EventSource
{
	private EventHandler<int> Updated;
    
	public void RaiseUpdates()
	{
		counter++;
		Updated?.Invoke(this, counter);
	}
}

 


์•„์ดํ…œ 9. ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์„ ์ตœ์†Œํ™”ํ•˜๋ผ.

๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ์“ฐ๋Š” ๊ฐ’ ํƒ€์ž…์€ ๋‹คํ˜•์ ์ด์ง€ ๋ชปํ•˜๋‹ค. ๋ฐ˜๋ฉด์—, .NET Framework๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ ์ตœ์ƒ์œ„ ํƒ€์ž…์„ ์ฐธ์กฐ ํƒ€์ž…์ธ System.Object๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ํƒ€์ž…์€ ์„œ๋กœ ๋‹ค๋ฅด์ง€๋งŒ ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์ด๋ผ๋Š” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์„œ๋กœ ์ด์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ System.Object ํƒ€์ž…์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์ด ํ•„์š”ํ•œ ๊ณณ์—์„œ ๊ฐ’ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

 

๋ฐ•์‹ฑ

  • ๊ฐ’ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํƒ€์ž…์ด ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š์€ ์ž„์˜์˜ ์ฐธ์กฐ ํƒ€์ž… ๋‚ด๋ถ€์— ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ์ฒด๋Š” ํž™์— ์ƒ์„ฑ๋˜๋ฉฐ ๊ฐ’ ํƒ€์ž…์˜ ๋ณต์‚ฌ๋ณธ์ด ๊ทธ ๋‚ด๋ถ€์— ์ €์žฅ๋œ๋‹ค.
  • ๋ฐ•์‹ฑ์„ ํ•˜๋ฉด ์ฐธ์กฐ ํƒ€์ž…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋„ ๊ฐ’ ํƒ€์ž…์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

์–ธ๋ฐ•์‹ฑ

  • ๋ฐ•์‹ฑ ๋˜์–ด ์žˆ๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๊ฐ’ ํƒ€์ž… ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ ์ž‘์—…์€ ์•”์‹œ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ ์‹ค์ œ๋กœ ์–ด๋–ค ๋ณ€ํ™˜ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์—์„œ ์ž„์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ ์ด๋กœ ์ธํ•ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ฐ’ ํƒ€์ž…์„ ๋‹คํ˜•์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์„ฑ๋Šฅ์„ ๋А๋ฆฌ๊ฒŒ ๋งŒ๋“ ๋‹ค.

 

์ œ๋„ค๋ฆญ์ด ์•„๋‹Œ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฐ’ ํƒ€์ž…์„ System.Object ํƒ€์ž…์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ž‘์„ฑํ•˜์ง€ ๋ง์ž.

 


์•„์ดํ…œ 10. ๋ฒ ์ด์Šค ํด๋ž˜์Šค๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œ๋œ ๊ฒฝ์šฐ์—๋งŒ new ํ•œ์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

๋ฒ ์ด์Šค ํด๋ž˜์Šค์—์„œ virtual๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๋ฉค๋ฒ„๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— new ํ•œ์ •์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ virtual๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋ฉด ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ชจํ˜ธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

public class MyClass
{
	public void MagicMethod() { ... }
}

public class MyOtherClass : MyClass
{
	public new void MagicMethod { ... }	// ์žฌ์ •์˜: ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐธ์กฐํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘
}

 

new ํ•œ์ •์ž๋Š” ๋น„๊ฐ€์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ƒ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํด๋ž˜์Šค์˜ ๋ช…๋ช… ๋ฒ”์œ„ ๋‚ด์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ๋น„๊ฐ€์ƒ ๋ฉ”์„œ๋“œ๋Š” ์ •์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋˜๋ฏ€๋กœ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ๊ฐ€์ƒ ๋ฉ”์„œ๋“œ๋Š” ๋™์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋˜๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด์˜ ํƒ€์ž…์ด ๋ฌด์—‡์ด๋ƒ์— ๋”ฐ๋ผ ๊ทธ์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

๋ฒ ์ด์Šค ํด๋ž˜์Šค์—์„œ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋กœ ์ด๋ฏธ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์–ด ์ด๋ฅผ ์ผ์ผ์ด ์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Book/โœ Effective' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Book] Effective C# - CHAPTER 3 ์ œ๋„ค๋ฆญ ํ™œ์šฉ
  • [Book] Effective C# - CHAPTER 2 .NET ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[Book] Effective C# - CHAPTER 1 C# ์–ธ์–ด์š”์†Œ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”