์์ดํ 11. .NET ๋ฆฌ์์ค ๊ด๋ฆฌ์ ๋ํ ์ดํด
.NET ํ๊ฒฝ์์๋ ํน๋ณํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ฐ๋น์ง ์์ง๊ธฐ์ ๋์ ๋ฐฉ์์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค. ๊ฐ๋น์ง ์์ง๊ธฐ(Garbage Collector)๋ ๊ด๋ฆฌ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด์ฅํ๋ฉฐ ๋ค์ดํฐ๋ธ ํ๊ฒฝ๊ณผ๋ ๋ค๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ ๋์, ๋๊ธ๋ง ํฌ์ธํฐ, ์ด๊ธฐํ๋์ง ์์ ํฌ์ธํฐ, ์ฌํ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฌธ์ ๋ฅผ ๊ฐ๋ฐ์๋ค์ด ์ง์ ๋ค๋ฃจ์ง ์๋๋ก ์๋ํํด์ค๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ, COM ๊ฐ์ฒด, ์์คํ ๊ฐ์ฒด ๋ฑ๊ณผ ๊ฐ์ ๋น๊ด๋ฆฌ ๋ฆฌ์์ค๋ ์ฌ์ ํ ๊ฐ๋ฐ์๊ฐ ๊ด๋ฆฌํด์ผ ํ๋ค.
- ์ํ ์ฐธ์กฐ์ ๋ฌธ์ ๋ ๋ณต์กํ ์ฐ๊ด ๊ด๊ณ์ ๋ฌธ์ ๋ ๊ด๋ฆฌ ํ๊ฒฝ์์๋ ๋น๊ต์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
๊ฐ๋น์ง ์์ง๊ธฐ์ ๋์ ๋ฐฉ์
๋งํฌ/์ฝคํฉํธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๋ฌ ๊ฐ์ฒด ์ฌ์ด์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ ํ์ฌ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํ๋ค. ๊ฐ๋ณ ๊ฐ์ฒด๊ฐ ์ค์ค๋ก ์์ ์ ์ฐธ์กฐ ์ฌ๋ถ๋ ํ์ ๋ฑ์ ๊ด๋ฆฌํ์ง ์๋๋ก ํ๊ณ ์ต์์ ๊ฐ์ฒด๋ก๋ถํฐ ๊ฐ๋ณ ๊ฐ์ฒด๊น์ง์ ๋๋ฌ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
- ์์ฉ ํ๋ก๊ทธ๋จ ๋ด์ ์ต์์ ๊ฐ์ฒด๋ก๋ถํฐ ์ฐธ์กฐ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ค.
- ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์ด์ ์๋ ๊ฐ์ฒด๋ก ํ๋จํ๊ณ ๋๋ฌ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋น์ง๋ก ๊ฐ์ฃผํ์ฌ ์ ๊ฑฐํ๋ค.
- ๊ฐ๋น์ง ์์ง๊ธฐ๋ ๊ฐ๋น์ง ์์ง ๊ณผ์ ์ ์ต์ ํํ๊ธฐ ์ํด ์ธ๋๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๋ค. ๊ฐ๋น์ง ์์ง ํ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ 0์ธ๋ ๊ฐ์ฒด๋ผ ํ๊ณ ๋ ํ ๋ฒ์ ๊ฐ๋น์ง ์์ง ํ ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ 1์ธ๋ ๊ฐ์ฒด๋ผ ๋ถ๋ฅธ๋ค. ๋ง์ฝ ๋ ๋ฒ ์ด์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ์ด ๊ฐ์ฒด๋ 2์ธ๋ ๊ฐ์ฒด๋ผ ๋ถ๋ฅธ๋ค.
- ๊ฐ๋น์ง ์์ง์ด ์์๋๋ฉด 0์ธ๋ ๊ฐ์ฒด์ ๋ํด์๋ง ์ํ๋๊ณ 1์ธ๋๋ 10๋ฒ์ 1๋ฒ, 2์ธ๋๋ 100๋ฒ์ 1๋ฒ ๊ผด๋ก ์ํ๋๋ค.
- ์ฌ์ฉ ์ค์ธ ๊ฐ์ฒด๋ค์ ํ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ ์กฐ๊ฐ๋ ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋จ์ผ์ ํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก ๋ง๋๋ ์ฝคํฉํธ ์์ ์ ์ํํ๋ค.
์์ดํ 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๋ก ์ ์ธ๋ ์ฝ๊ธฐ ์ ์ฉ ์์๋ฅผ ์์ฑ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์์ ์ด๊ธฐํํ ์ ์๋ค.
ํน์ ํ์ ์ผ๋ก ์ฒซ ๋ฒ์งธ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์ํ๋๋ ๊ณผ์
- ์ ์ ๋ณ์์ ์ ์ฅ๊ณต๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ
- ์ ์ ๋ณ์์ ๋ํ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์ํ
- ๋ฒ ์ด์ค ํด๋์ค์ ์ ์ ์์ฑ์ ์ํ
- ์ ์ ์์ฑ์ ์ํ
- ์ธ์คํด์ค ๋ณ์์ ์ ์ฅ ๊ณต๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ: ๋์ผ ํ์ ์ผ๋ก ์ธ์คํด์ค ์ถ๊ฐ ์์ฑ ์ ์ด ๋จ๊ณ๋ถํฐ ์ํ
- ์ธ์คํด์ค ๋ณ์์ ๋ํ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์ํ
- ์ ์ ํ ๋ฒ ์ด์ค ํด๋์ค์ ์ธ์คํด์ค ์์ฑ์ ์ํ
- ์ธ์คํด์ค ์์ฑ์ ์ํ
์์ดํ 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"
// ์์ง ํ์ ํด๋์ค์ ์์ฑ์๊ฐ ํธ์ถ๋์ง ์์๋ค.
๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋์ ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ผ๊ด์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.