[Book] Effective C# - CHAPTER 2 .NET ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

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

์•„์ดํ…œ 11. .NET ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์ดํ•ด

.NET ํ™˜๊ฒฝ์—์„œ๋Š” ํŠน๋ณ„ํžˆ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ(Garbage Collector)๋Š” ๊ด€๋ฆฌ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€์žฅํ•˜๋ฉฐ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ, ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํฌ์ธํ„ฐ, ์—ฌํƒ€์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฌธ์ œ๋ฅผ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๋„๋ก ์ž๋™ํ™”ํ•ด์ค€๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, COM ๊ฐ์ฒด, ์‹œ์Šคํ…œ ๊ฐ์ฒด ๋“ฑ๊ณผ ๊ฐ™์€ ๋น„๊ด€๋ฆฌ ๋ฆฌ์†Œ์Šค๋Š” ์—ฌ์ „ํžˆ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์ˆœํ™˜ ์ฐธ์กฐ์˜ ๋ฌธ์ œ๋‚˜ ๋ณต์žกํ•œ ์—ฐ๊ด€ ๊ด€๊ณ„์˜ ๋ฌธ์ œ๋„ ๊ด€๋ฆฌ ํ™˜๊ฒฝ์—์„œ๋Š” ๋น„๊ต์  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ์˜ ๋™์ž‘ ๋ฐฉ์‹

 

๋งˆํฌ/์ฝคํŒฉํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

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

  1. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์— ์ตœ์ƒ์œ„ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์ฐธ์กฐ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  2. ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋กœ ํŒ๋‹จํ•˜๊ณ  ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋น„์ง€๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ์ œ๊ฑฐํ•œ๋‹ค.
    • ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋Š” ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ๊ณผ์ •์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ๋Œ€๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ํ›„ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ 0์„ธ๋Œ€ ๊ฐ์ฒด๋ผ ํ•˜๊ณ  ๋˜ ํ•œ ๋ฒˆ์˜ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ํ›„ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ 1์„ธ๋Œ€ ๊ฐ์ฒด๋ผ ๋ถ€๋ฅธ๋‹ค. ๋งŒ์•ฝ ๋‘ ๋ฒˆ ์ด์ƒ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด ๊ฐ์ฒด๋Š” 2์„ธ๋Œ€ ๊ฐ์ฒด๋ผ ๋ถ€๋ฅธ๋‹ค.
    • ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์ด ์‹œ์ž‘๋˜๋ฉด 0์„ธ๋Œ€ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋งŒ ์ˆ˜ํ–‰๋˜๊ณ  1์„ธ๋Œ€๋Š” 10๋ฒˆ์— 1๋ฒˆ, 2์„ธ๋Œ€๋Š” 100๋ฒˆ์— 1๋ฒˆ ๊ผด๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.
  3. ์‚ฌ์šฉ ์ค‘์ธ ๊ฐ์ฒด๋“ค์„ ํ•œ์ชฝ์œผ๋กœ ์˜ฎ๊ฒจ์„œ ์กฐ๊ฐ๋‚œ ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹จ์ผ์˜ ํฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ๋งŒ๋“œ๋Š” ์ฝคํŒฉํŠธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 


์•„์ดํ…œ 12. ํ• ๋‹น ๊ตฌ๋ฌธ๋ณด๋‹ค ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ด ์ข‹๋‹ค.

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

  • ์ƒˆ๋กœ์šด ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ํ•ญ์ƒ ํฌํ•จ๋œ๋‹ค.
  • ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์ „์— ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.
public class MyClass
{
	private List<string> labels = new List<string>();	// ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”
}

 

๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ๋„ ํ•ญ์ƒ ์จ๋„ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด๋ฅผ 0์ด๋‚˜ null๋กœ ์ดˆ๊ธฐํ™”: ๊ธฐ๋ณธ ์‹œ์Šคํ…œ ์ดˆ๊ธฐํ™” ๋ฃจํ‹ด์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ด๋ฏธ ๋ชจ๋“  ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
  • ์ƒ์„ฑ์ž๋งˆ๋‹ค ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

 


์•„์ดํ…œ 13. ์ •์  ํด๋ž˜์Šค ๋ฉค๋ฒ„๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดˆ๊ธฐํ™”ํ•˜๋ผ.

์ •์  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ํƒ€์ž…์ด ์žˆ๋‹ค๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค. C#์—์„œ๋Š” ์ •์  ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™”์™€ ์ •์  ์ƒ์„ฑ์ž๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ž๋‚˜ ์ „์šฉ์˜ private ๋ฉ”์„œ๋“œ ํ˜น์€ ๋‹ค๋ฅธ ๊ด€์šฉ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

 

public class MySingleton
{
	private static readonly MySingleton theOneAndOnly = new MySingleton();	// ์ •์  ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™”
	public static MySingleton TheOnly { get { return theOneAndOnly; }}
	private MySingleton() {}	// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ž
}

public class MySingleton2
{
	private static readonly MySingleton2 theOneAndOnly;
	static MySingleton2() { theOneAndOnly = new MySingleton2(); }	// ์ •์  ์ƒ์„ฑ์ž
	public static MySingleton2 TheOnly { get { return theOneAndOnly; }}
	private MySingleton2() {}	// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ž
}

 

์ •์  ์ƒ์„ฑ์ž๋Š” ํƒ€์ž… ๋‚ด์— ์ •์˜๋œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ, ๋ณ€์ˆ˜, ์†์„ฑ์— ์ตœ์ดˆ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์ „์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

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

 


์•„์ดํ…œ 14. ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์„ ์ตœ์†Œํ™”ํ•˜๋ผ

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž๋ฅผ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ทจํ•˜๋Š” ์ƒ์„ฑ์ž ํ•˜๋‚˜๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

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

 

public class MyClass
{
    private List<Data> coll;    // ๋ฐ์ดํ„ฐ ์ปฌ๋ ‰์…˜
    private string name;    // ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜

    public MyClass() : this(0, string.Empty) { }; // new() ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ƒ์„ฑ์ž

    public MyClass(int initCount = 0, string name = "") { ... }; // ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•œ ์ƒ์„ฑ์ž
    // ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ํ•˜๋‚˜ ํ˜น์€ ๋‘˜ ๋ชจ๋‘์— ์ž„์˜์˜ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    // ๋งŒ์•ฝ ์ด ๊ธฐ๋Šฅ์ด ์—†๋‹ค๋ฉด 4๊ฐœ์˜ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
}

 

์ƒ์„ฑ์ž ์ฒด์ธ ๊ธฐ๋ฒ•์ด๋ž€ ์ž„์˜์˜ ์ƒ์„ฑ์ž๊ฐ€ ๋™์ผ ํด๋ž˜์Šค ๋‚ด์— ์ •์˜๋œ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

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

 

ํŠน์ • ํƒ€์ž…์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ˆ˜ํ–‰๋˜๋Š” ๊ณผ์ •

  1. ์ •์  ๋ณ€์ˆ˜์˜ ์ €์žฅ๊ณต๊ฐ„์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  2. ์ •์  ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์ˆ˜ํ–‰
  3. ๋ฒ ์ด์Šค ํด๋ž˜์Šค์˜ ์ •์  ์ƒ์„ฑ์ž ์ˆ˜ํ–‰
  4. ์ •์  ์ƒ์„ฑ์ž ์ˆ˜ํ–‰
  5. ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ์ €์žฅ ๊ณต๊ฐ„์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”: ๋™์ผ ํƒ€์ž…์œผ๋กœ ์ธ์Šคํ„ด์Šค ์ถ”๊ฐ€ ์ƒ์„ฑ ์‹œ ์ด ๋‹จ๊ณ„๋ถ€ํ„ฐ ์ˆ˜ํ–‰
  6. ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์ˆ˜ํ–‰
  7. ์ ์ ˆํ•œ ๋ฒ ์ด์Šค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ž ์ˆ˜ํ–‰
  8. ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ž ์ˆ˜ํ–‰

 


์•„์ดํ…œ 15. ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ๋ง๋ผ

๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ›Œ๋ฅญํžˆ ๊ด€๋ฆฌํ•˜๊ธด ํ•˜์ง€๋งŒ ๊ณผ๋„ํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

  • ๋ชจ๋“  ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ์ฒด๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋ผ ํ•˜๋”๋ผ๋„ ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
  • ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ ๋‚ด ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ์ฒด๋Š” ๋งค๋ฒˆ ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
  • ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ •์  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๊ณ  ์ข…์†์„ฑ ์‚ฝ์ž…์„ ํ™œ์šฉํ•˜์—ฌ ์ƒ์„ฑํ–ˆ๋‹ค๊ฐ€ ์žฌํ™œ์šฉํ•œ๋‹ค.
private static Brush blackBrush;

public static Brush Black
{
    get
    {
        if (blackBrush == null) // ์ข…์†์„ฑ ์‚ฝ์ž…
            blackBrush = new SolidBrush(Color.Black);
        return blackBrush;
    }
}
  • ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ด์— ๋Œ€์‘ํ•˜๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋นŒ๋” ํด๋ž˜์Šค๋ฅผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค. ex) StringBuilder

 


์•„์ดํ…œ 16. ์ƒ์„ฑ์ž ๋‚ด์—์„œ๋Š” ์ ˆ๋Œ€๋กœ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋ง๋ผ

๊ฐ์ฒด๊ฐ€ ์™„์ „ํžˆ ์ƒ์„ฑ๋˜๊ธฐ ์ด์ „์— ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ด์ƒ ๋™์ž‘์„ ์ผ์œผํ‚จ๋‹ค. ์–ด๋–ค ํƒ€์ž…์ด๋“  ์ƒ์„ฑ์ž๊ฐ€ ์ˆ˜ํ–‰์„ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€๋Š” ๊ฐ์ฒด๊ฐ€ ์™„์ „ํžˆ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์—†๋‹ค.

 

class B
{
    protected B() { VFun(); }

    protected virtual void VFun() { Console.WriteLine("B"); }   // ๊ฐ€์ƒ ํ•จ์ˆ˜
}

class A : B
{
    private readonly string msg = "init";

    public A(string msg) { this.msg = msg; }

    protected override void VFun() { Console.WriteLine(msg); }

    public static void Main()
    {
        // ๋ฒ ์ด์Šค ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๊ณ  ์ด ๊ฐ€์ƒ ํ•จ์ˆ˜๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ ํ•˜๊ณ  ์žˆ๋‹ค.
        // ๋Ÿฐํƒ€์ž„์—๋Š” ๊ฐ์ฒด ํƒ€์ž…์ด A์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
        var a = new A("main");
    }
}

// ๊ฐ€์žฅ ๋จผ์ € ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์€ "init"
// ์•„์ง ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•˜๋‹ค.

 

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋™์•ˆ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ผ๊ด€์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Book/โœ Effective' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Book] Effective C# - CHAPTER 3 ์ œ๋„ค๋ฆญ ํ™œ์šฉ
  • [Book] Effective C# - CHAPTER 1 C# ์–ธ์–ด์š”์†Œ
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 2 .NET ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ
์ƒ๋‹จ์œผ๋กœ

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