JDK, JRE, JVM์ ๊ตฌ์กฐ๋ฅผ ์๊ณ ์๋ค๋ฉด .NET์ ๊ฑฐ์ ์ด๋ฆ๋ง ๋ฐ๊ฟ ์ฝ์ผ๋ฉด ๋ ์ ๋๋ก ๋ฎ์๊ฒ ๋ง์ต๋๋ค. Java ์ Spring ์ผ๋ก ๋ฐฑ์๋๋ฅผ ๊ณต๋ถํ๋ ์ ์๊ฒ ํ๊ฐ์ง ๊ฐ๋ ์ ์ ๋๋ก ์ดํดํ๋ฉด ๋ค๋ฅธ ์ธ์ด์ ํ๋ ์์ํฌ๋ ์ถฉ๋ถํ ์ดํดํ ์ ์๋ค๋ ๋ฏฟ์์ด ์์๋๋ฐ์. ์ด๋ฒ์ ์๋ฐ์์ ์๋ ๊ฐ๋ ์ด .NET์ ์ด๋์ ํด๋นํ๋์ง๋ฅผ ๋์ํ์ ๊ทธ๋ฆผ์ผ๋ก ์ ๋ฆฌํ๊ณ , ๊ตฌ์กฐ๋ ๋ฎ์์ง๋ง ์ค๊ณ๊ฐ ๊ฐ๋ฆฐ ์ง์ ์ ๋ฐ๋ก ์ง์ด ๋ณด์์ต๋๋ค.
1๏ธโฃ ํ ๋์ ๋ณด๋ ๋์ํ
๋ ์ธ์ด๋ฅผ ๊ณต๋ถํ๋ค ๋๋ ๊ฑด๋ฐ ๋ ์ธ์ด์ ํ๋ซํผ์ ๊ฐ์ ๋ผ๋๋ฅผ ์ด๋ค๋ ๊ฒ์ ๋๋ค. ์์ค๋ฅผ ์ค๊ฐ ์ฝ๋๋ก ์ปดํ์ผํ๊ณ , ๊ฐ์ ๋จธ์ ์ด ๊ทธ๊ฒ์ JIT๋ก ๊ธฐ๊ณ์ด๋ก ๋ฐ๊ฟ ์คํํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ GC๊ฐ ๊ด๋ฆฌํฉ๋๋ค. ๊ตฌ์ฑ ์์๊ฐ ๊ฑฐ์ ์ผ๋์ผ๋ก ๋งค์นญ์ด ๋์ต๋๋ค.
| Java | .NET | ์ญํ |
| JDK | .NET SDK | ๊ฐ๋ฐ ๋๊ตฌ ํคํธ(์๋ ๋ฐํ์·์ปดํ์ผ๋ฌ ํฌํจ) |
| JRE | .NET Runtime | ์คํ ์์ง + ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ๋ง๋ค์ด์ง ์ฑ์ ๋๋ฆด ๋ |
| JVM | CLR (CoreCLR) | GC, JIT, ํ์ ๋ก๋ฉ. ์คํ ์์ง ๊ทธ ์์ฒด |
| ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ (java.*) | BCL (System.*) | ๊ธฐ๋ณธ ํด๋์ค(์ปฌ๋ ์ , ๋ฌธ์์ด, ํ์ผ, ๋คํธ์ํฌ) |
| javac | Roslyn (csc) | ์ปดํ์ผ๋ฌ(์์ค → ์ค๊ฐ ์ฝ๋) |
| ๋ฐ์ดํธ์ฝ๋ (.class, .jar) | IL (.dll) | ์ค๊ฐ ์ฝ๋(์คํ ๋ JIT๊ฐ ๊ธฐ๊ณ์ด๋ก ๋ณํ) |
| java ๋ช ๋ น | dotnet ๋ช ๋ น | ์ฑ ์คํ(.net์ SDK๊ฐ ์์ผ๋ฉด ๋น๋๋ ๊ฒธํจ) |
| Maven, Gradle | MSBuild + NuGet | ๋น๋์ ํจํค์ง ๊ด๋ฆฌ(.NET์ SDK์ ํฌํจ, ์๋ฐ๋ ๋น๋ ๋๊ตฌ๋ฅผ ๋ฐ๋ก ์ค์น.) |
| Spring MVC, Spring Boot | ASP.NET Core | ์น ํ๋ ์์ํฌ |
| Java, Kotlin, Scala | C#, F# | ๊ฐ์ ๊ฐ์ ๋จธ์ ์์ ์ธ์ด๋ค |
2๏ธโฃ์ด๋ค ์ธ์ด๊ฐ ๋จผ์ ๊ฐ๋ฐ ๋์๊น?
C#์ ์ด๋ฆ์ C๊ฐ ๋ค์ด๊ฐ C, C++์ ๋ฐ๋ก ๋ค์ ์ธ๋์ฒ๋ผ ๋ณด์ด์ง๋ง Java๋ณด๋ค 7๋ ๋ฆ๊ฒ ๋์์ต๋๋ค. ์ด๋ฆ์ #์ ์์ ์ ์ฌ๋ฆผํ(์พ)์ด๊ณ , C ๊ณ์ด ๋ฌธ๋ฒ์ ์ด์ด๋ฐ์๋ค๋ ๋ป์ ๋๋ค.
๋ฌธ๋ฒ์ ์ค์ ๋ก C ๊ณ์ด์ ๋๋ค. ์ค๊ดํธ, ์ธ๋ฏธ์ฝ๋ก , for, if ๊ฐ์ ๊ฒ๋ค์ ๋๋ค. ๊ทธ๋ฐ๋ฐ ๊ทธ๊ฒ์ Java๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. Java ์ญ์ C++ ๊ฐ๋ฐ์๊ฐ ์ฝ๊ฒ ๋์ด์ค๋๋ก C++ ๋ฌธ๋ฒ์ ๋น๋ ค ๋ง๋ค์์ต๋๋ค.

๋ ์ธ์ด์ ๋ํด ์์๋ณด๋ค๊ฐ ๋ฐ๊ฒฌํ๊ฑด๋ฐ ๋ ์ธ์ด๋ ์์ก์ ์ ํ๋ ์ ์ด ์์ต๋๋ค.
Microsoft๋ ์ฒ์์ Java๋ฅผ ์๊ธฐ ๋ฐฉ์์ผ๋ก ํ์ฅํด ์ฐ๋ ค ํ๊ณ (J++), ๊ทธ๊ฒ์ด ๋งํ์ ์์ฒด ํ๋ซํผ์ ๋ง๋ค์์ต๋๋ค.
1995๋ Java 1.0 (Sun Microsystems)์ด ์ธ์์ ๋์๊ณ , 1996๋ Microsoft๊ฐ Java ๋ผ์ด์ ์ค๋ฅผ ๋ฐ์ Visual J++ ์ถ์ํ์ต๋๋ค. ๊ทธ๋ค์ํด์ธ 1997๋ Sun Microsystems์ด Microsoft๋ฅผ ์ ์ํ์ต๋๋ค.(J++์ Windows ์ ์ฉ ํ์ฅ์ ๋ฃ์ด Java ํธํ์ฑ์ ๊นผ๋ค๋ ์ด์ )
2000๋ ์๋ Microsoft๊ฐ .NET๊ณผ C# ๋ฐํํ๊ณ ๋ค์ํด์ธ 2001๋ ์ ์์ก ํฉ์ํ์ฌ Microsoft๋ Java ์ฌ์ ์์ ์์ ๋ผ๊ฒ ๋์ต๋๋ค.
๋ฌธ๋ฒ์ ๊ฒ๋ชจ์ต์ ๋ ๋ค C++์์ ๊ฐ์ ธ์์ต๋๋ค. ๋ค๋ง, C#์ ๋ฌธ๋ฒ์ C++์์, ์คํ ๋ชจ๋ธ์ Java์์ ๊ฐ์ ธ์จ ์ธ์ด์ ๊ฐ๊น์ต๋๋ค.
C#์ ์ค๊ณ ์ฑ ์์ Anders Hejlsberg๋ ๊ทธ ์ ์ Turbo Pascal๊ณผ Delphi(๋ธํ์ด)๋ฅผ ๋ง๋ ์ฌ๋์ด์ด์ ์์ฑ, ์ด๋ฒคํธ ๊ฐ์ Delphi์ ์ํฅ๋ ๋ค์ด ์์ ๊ฑฐ๋ผ๊ณ ํฉ๋๋ค. ์ค๊ณ์๋ค์ ์๋๋ฅผ ๋จ์ ํ ์๋ ์์ง๋ง, ๊ฐ์ ๋จธ์ ·์ค๊ฐ ์ฝ๋·GC·๋จ์ผ ์์๊ณผ ์ธํฐํ์ด์ค ๊ฐ์ ํฐ ๊ตฌ์กฐ๊ฐ ๋จผ์ ๋์จ Java์ ๊ฐ๋ค๋ ๊ฒ์ ์ฌ์ค์ ๋๋ค.
| C, C++ | Java, C# | |
| ์ปดํ์ผ ๊ฒฐ๊ณผ | ๊ธฐ๊ณ์ด | ์ค๊ฐ ์ฝ๋ (๋ฐ์ดํธ์ฝ๋ / IL) |
| ์คํ | CPU๊ฐ ์ง์ | ๊ฐ์ ๋จธ์ ์ด JIT๋ก |
| ๋ฉ๋ชจ๋ฆฌ | ์ง์ ํด์ (free, delete) | GC |
| ํฌ์ธํฐ | ์์ ๋กญ๊ฒ ์ฌ์ฉ | ๊ธฐ๋ณธ์ ์ผ๋ก ์จ๊น |
3๏ธโฃํท๊ฐ๋ฆฌ๋ .NET ์ ์ด๋ฆ ์ ๋ฆฌ
.NET ์ชฝ์ ์ด๋ฆ์ด ์ฌ๋ฌ ๋ฒ ๋ฐ๋์ด ํท๊ฐ๋ฆฝ๋๋ค. ๋ค ๊ฐ๋ง ๊ตฌ๋ถํ๋ฉด ๋ฉ๋๋ค.
| ์ด๋ฆ | ์ ์ฒด | Java๋ก ์น๋ฉด |
| .NET | ๋ฐํ์ + ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ + ๋๊ตฌ๋ฅผ ํฉ์น ํ๋ซํผ. ์ง๊ธ์ ์ ์ ์ด๋ฆ | Java(์ธ์ด ์ด๋ฆ์ด์ ์ํ๊ณ) |
| .NET Core | 2016๋ ์ ์๋ก ๋ง๋ ํฌ๋ก์ค ํ๋ซํผ .NET. 5๋ถํฐ ์ด๋ฆ์์ Core๋ฅผ ๋ | ์ด๋ฆ๋ง ๋ฐ๋ ๊ฐ์ ๊ฒ |
| .NET Framework | 2002๋ ๋ถํฐ ์๋ Windows ์ ์ฉ ์์กฐ. 4.8์์ ๋ฉ์ถค | ๊ตฌ์ธ๋ ํ๋ซํผ |
| ASP.NET (Core) | .NET ์์์ ์น ์๋ฒ์ API๋ฅผ ๋ง๋๋ ํ๋ ์์ํฌ | Spring MVC / Boot |
๋ค๋ง ASP.NET๊ณผ ASP.NET Core๋ ๋ค๋ฅธ ๋ฌผ๊ฑด์ ๋๋ค. ์ ์๋ .NET Framework์ฉ ๊ตฌ๋ฒ์ ์ด๊ณ , ํ์๋ ์ง๊ธ์ .NET ์์์ ๋๋ ์ ํ๋ ์์ํฌ์ ๋๋ค.
ASP.NET Core ๋ผ๊ณ ๋ถ๋ฅด๋ ์ด์ ๋, .NET Framework ์์์๋ง ๋๋ ์ ASP.NET๊ณผ ๊ตฌ๋ถํด์ผ ํ๊ธฐ ์ํจ์ ๋๋ค.

4๋ฅผ ๊ฑด๋๋ด ์ด์ ๋ ๊ตฌ ํ๋ซํผ์ธ .NET Framework 4.x์ ํท๊ฐ๋ฆฌ์ง ์๊ฒ ํ๋ ค๋ ๊ฒ์ ๋๋ค.
.NET5๋ถํฐ๋ "Core" ๋ฅผ ๋ผ๊ธด ํ์ง๋ง Core๋ผ๋ ๋ง์ ์์ง ํ์ ์ผ๋ก ๋ง์ด ๋จ์ ์์ต๋๋ค. ๋ฐํ์์ ์ด๋ฆ์ด CoreCLR์ด๊ณ , ๋คํ์์ ๋ณธ coreclr.dll, System.Private.CoreLib์ผ๋ก ํ์๋ฉ๋๋ค.
4๏ธโฃSDK์ ๊ตฌ์กฐ
์คํ ๋ชจ๋ธ์ Java์์ ๊ฐ์ ธ์จ ์ธ์ด๋ต๊ฒ JDK ⊃ JRE ⊃ JVM์ ํฌํจ ๊ด๊ณ๊ฐ .NET SDK ⊃ .NET Runtime ⊃ CLR๋ก ๊ทธ๋๋ก ์ฎ๊ฒจ์ง๋๋ค.


์ ๊ทธ๋ฆผ์์ ์๋ ๋ ๋ฐํ์์ .NET Runtime๊ณผ ๋๋ํ ๊ทธ๋ ธ์ง๋ง ๋ ๋ฆฝ์ ์ด์ง ์์ต๋๋ค. ๋ ๋ค .NET Runtime์ด ์์ด์ผ ๋์๊ฐ๋๋ค. dotnet ํ๋๊ฐ ๋ ์ญํ ์ ํ๋ ๊ฒ์ java๊ฐ JRE์ JDK ์์ชฝ์ ์๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ๋ฐํ์๋ง ์ค์นํ๋ฉด ์ฑ์ ์คํํ๋ ํธ์คํธ๋ก๋ง ๋์ํ๊ณ , SDK๋ฅผ ์ค์นํ๋ฉด build, run ๊ฐ์ ๋ช ๋ น์ด ์ถ๊ฐ๋ฉ๋๋ค.
| ๋ฐํ์ | ๋ด์ฉ | ํ์ํ ์ฑ |
| .NET Runtime | CLR + BCL | ์ฝ์ ์ฑ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค |
| ASP.NET Core Runtime | ์น ์๋ฒ์ ์น ํ๋ ์์ํฌ | HTTP ์์ฒญ์ ๋ฐ๋ ์ฑ |
| Windows Desktop Runtime | WPF, Windows Forms. ์ค์น ํ์ผ์ .NET Runtime์ด ํจ๊ป ๋ค์ด ์์. | ์ฐฝ์ด ์๋ Windows ํ๋ก๊ทธ๋จ |
JDK ์ .NET SDK ์์ ๋ค๋ฅธ ๊ณณ
| ํญ๋ชฉ | JDK | .NET SDK |
| ๋ฐํ์ ๋ฌถ์ | ํ๋ | ์ธ ๊ฐ. ๊ธฐ๋ณธ ๋ฐํ์ ์์ ASP.NET Core์ Windows Desktop์ด ๋ฐ๋ก ์์. |
| UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ (Swing, AWT) | ๋ณ๋ ๋ฐํ์ (WPF, Windows Forms) |
| ์น ํ๋ ์์ํฌ | ํฌํจ๋์ง ์์ (Spring ๋ฑ์ ๋ฐ๋ก ๋ฐ์) | ๋ฐํ์์ ํ ์ข ๋ฅ๋ก ํฌํจ (ASP.NET Core) |
| ๋น๋·ํจํค์ง ๋๊ตฌ | ํฌํจ๋์ง ์์ (Maven, Gradle) | ํฌํจ (MSBuild, NuGet) |
| ์ง๋จ ๋๊ตฌ | ํฌํจ (jmap, jstack) | ํฌํจ๋์ง ์์ (dotnet-dump ๋ฑ์ ๋ฐ๋ก ์ค์น) |
| ์คํ ์์ง์ ์ธํฐํ๋ฆฌํฐ | ์์ | ์์. ์ฒ์๋ถํฐ JIT |
5๏ธโฃ๋ฉ๋ชจ๋ฆฌ ์์ญ์ฐจ์ด
JVM ๋ช ์ธ๋ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ๋ค์ฏ ๊ฐ๋ก ์ ์ํฉ๋๋ค. ํ, JVM ์คํ, ๋ฉ์๋ ์์ญ, ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ, PC ๋ ์ง์คํฐ์ ๋๋ค. .NET์ ๋ช ์ธ(ECMA-335)์๋ ์ด๋ฐ ๋ชฉ๋ก์ด ์์ด์, .NET ์ชฝ ์ฉ์ด๋ CoreCLR ๊ตฌํ๊ณผ ์ง๋จ ๋๊ตฌ์์ ์จ ๊ฒ๋ค์ ๋๋ค.
| JVM | .NET์์ ํด๋นํ๋ ๊ฒ | ๋น๊ณ |
| ํ | ๊ด๋ฆฌ ํ (GC heap). 0·1·2์ธ๋, LOH, POH | ๊ฐ์ฅ ์ ๋์๋๋ค |
| JVM ์คํ | ์ค๋ ๋ ์คํ | ์ค๋ ๋๋ง๋ค ํ๋ |
| ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ | ๋ฐ๋ก ์์. ๊ฐ์ ์ค๋ ๋ ์คํ์ ์ด๋ค | ์ค์ HotSpot๋ ํ ์คํ์ ์์ด ์๋๋ค. ๋ช ์ธ์์ ๊ตฌ๋ถ |
| ๋ฉ์๋ ์์ญ | ๋ก๋ ํ + JIT ์ฝ๋ ํ | ํ์ ์ ๋ณด์ ์ปดํ์ผ๋ ์ฝ๋๊ฐ ๋ฐ๋ก ์๋ค |
| PC ๋ ์ง์คํฐ | ๋ฐ๋ก ์์. CPU์ ๋ช ๋ น ํฌ์ธํฐ๋ฅผ ๊ทธ๋๋ก ์ด๋ค | ์ธํฐํ๋ฆฌํฐ๊ฐ ์์ด์ ํ์ํ์ง ์๋ค |
JVM์ PC ๋ ์ง์คํฐ๋ ์ง๊ธ ์คํ ์ค์ธ ๋ฐ์ดํธ์ฝ๋์ ์์น์ ๋๋ค. .NET์ IL์ ์ธํฐํ๋ฆฌํฐ๋ก ๋๋ฆฌ์ง ์๊ณ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผํด ์คํํ๋ฏ๋ก CPU์ ๋ช ๋ น ํฌ์ธํฐ ํ๋๋ก ์ถฉ๋ถํฉ๋๋ค.
.NET์์ ์ฐธ์กฐ ํ์ ์ static ํ๋๋ ๊ด๋ฆฌ ํ์ Object[] ๋ฐฐ์ด์ ์ ์ฅ๋ฉ๋๋ค. gcroot ์ถ๋ ฅ์ "strong handle → Object[]"๊ฐ ๊ทธ ๋ฐฐ์ด์ ๋๋ค. HotSpot๋ Java 7๋ถํฐ static ๋ณ์๋ฅผ ํ์ ๋ก๋๋ค.
.NET์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ์ฉ์ด์ SOS ๋ช ๋ น์ด
SOS๋ ๋๋ฒ๊ฑฐ์ “.NET ๋ฐํ์์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ฝ๋ ๋ฒ”์ ๊ฐ๋ฅด์ณ ์ฃผ๋ ํ์ฅ ๋ชจ๋์ ๋๋ค. Son of Strike์ ์ฝ์์ ๋๋ค.
.NET ์ด๊ธฐ ๊ฐ๋ฐ ๋ ๋ฐํ์์ ์ฝ๋๋ช ์ด Lightning์ด์๊ณ , ๊ทธ๊ฒ์ ๋๋ฒ๊น ํ๋ ์ฌ๋ด ๋๊ตฌ ์ด๋ฆ์ด Strike์์ต๋๋ค. ๋ฒ๊ฐ(lightning)๊ฐ ์น๋ ๊ฒ(strike)์์ ๋ด ์ด๋ฆ์ ๋๋ค. ๋์ค์ ์ธ๋ถ ๊ณต๊ฐ์ฉ์ผ๋ก ์ค์ฌ์ ๋ง๋ ๊ฒ์ด “Strike์ ์๋ค”, SOS์ ๋๋ค.
dumpheap, dumpobj, gcroot, eeheap, clrstack์ด ์ ๋ถ SOS๊ฐ ์ ๊ณตํ๋ ๋ช ๋ น์ ๋๋ค.
| ์ฉ์ด | ์ค๋ช | ๋ณด๋ ๋ฐฉ๋ฒ |
| ๊ด๋ฆฌ ํ / GC ํ | GC๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด ์์ญ | eeheap -gc |
| SOH, LOH, POH | ๊ด๋ฆฌ ํ์ ์ธ๋ถ ๊ตฌ์ญ (์์ ๊ฐ์ฒด, ํฐ ๊ฐ์ฒด, ๊ณ ์ ๊ฐ์ฒด) | eeheap -gc |
| ๋ก๋ ํ | ํ์ ๋ฉํ๋ฐ์ดํฐ | eeheap -loader |
| ์ฝ๋ ํ | JIT๋ ์ฝ๋ | eeheap -loader |
| ์คํ | ์ค๋ ๋๋ณ ํธ์ถ ์คํ | clrstack |
| ํธ๋ค ํ ์ด๋ธ | GC ํธ๋ค. GC ๋ฃจํธ์ ํ ์ข ๋ฅ | gchandles |
| ๋ค์ดํฐ๋ธ / ๋น๊ด๋ฆฌ ๋ฉ๋ชจ๋ฆฌ | ๊ทธ ๋ฐ์ ๋ฐํ์๊ณผ ๋ค์ดํฐ๋ธ ์ฝ๋๊ฐ ์ง์ ์ก์ ๊ฒ | WinDbg ๋๊ตฌ ์ฌ์ฉํด์ !address -summary ๋ช ๋ น์ด |
์ค๋ฌด์์๋ "๊ด๋ฆฌ(managed)๋ ๋น๊ด๋ฆฌ(unmanaged)๋"์ ๋ ๊ฐ๋๋ก ๋จผ์ ๋๋๋๋ค. ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋์์ ๋ GC ํ์ด ๊ฐ์ด ๋์์ผ๋ฉด ๊ด๋ฆฌ ์ชฝ, ์๋๋ฉด ๋น๊ด๋ฆฌ ์ชฝ์ ๋ด ๋๋ค.
WinDbg๋ Windows ๋คํ ๋ถ์์ ํ์ค ๋๊ตฌ์ ๋๋ค. ๋ค๋ง Windows์ ๋ค์ด ์๋ ์ฑ์ ์๋๊ณ ๋ฐ๋ก ์ค์นํด์ผ ํฉ๋๋ค. ๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ, ํฌ๋์, ๊ต์ฐฉ ๋ฑ์ ์ง์ ํ์ํ ์ ์์ต๋๋ค.
6๏ธโฃGC ๋น๊ต
์๋ฐ, .NET ๋ ๋ค ์ธ๋๋ณ GC์ด๊ณ ๋๋ฌ ๊ฐ๋ฅ์ฑ์ผ๋ก ์์ฌ๋ฅผ ํ๋จํฉ๋๋ค. ๋ค๋ฅธ ์ ์ "๋ฌด์์ ๊ณ ๋ฅด๊ฒ ํ๋๊ฐ"์ ๋๋ค. JVM์ ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ฅผ ๊ณ ๋ฅด๊ณ , .NET์ ์๊ณ ๋ฆฌ์ฆ์ ํ๋์ด๊ณ ์ด์ฉ ๋ฐฉ์์ ๊ณ ๋ฆ ๋๋ค.
.NET์ ๋ ๋ชจ๋
.NET์ ๊ธฐ๋ณธ GC๋ Workstation GC์ด๊ณ Server GC ๋ ์ค์ ์ ํตํด ์ฌ์ฉํ ์ ์์ต๋๋ค.
| Workstation GC | Server GC | |
| ์ฐ์ ์ ํ๋ ๊ฒ | ์ ์ ๋ฉ๋ชจ๋ฆฌ, ์งง์ ๋ฉ์ถค | ์ฒ๋ฆฌ๋ (์ด๋น ์์ฒญ ์) |
| ๊ด๋ฆฌ ํ ๊ฐ์ | 1๊ฐ | ๋ ผ๋ฆฌ ์ฝ์ด๋น 1๊ฐ (4์ฝ์ด๋ฉด 4๊ฐ) |
| GC๋ฅผ ์ํํ๋ ์ค๋ ๋ | ํ ๋นํ๋ค GC๋ฅผ ์ผ์ผํจ ๊ทธ ์ค๋ ๋ 1๊ฐ | ์ฝ์ด๋ง๋ค ์ ์ฉ GC ์ค๋ ๋. ๋ณ๋ ฌ๋ก ์์ง |
| 0์ธ๋ ์์ฐ | ์๋ค. ์์ฃผ, ์งง๊ฒ ์์ง | ํฌ๋ค. ๋๋ฌผ๊ฒ, ํ๊บผ๋ฒ์ ์์ง |
| ๋ฉ๋ชจ๋ฆฌ ์ ์ | ๋ฎ๋ค | ๋๋ค. ํ๋ง๋ค ์ฌ์ ๋ถ์ ๋ฐ๋ก ์ ์ง |
| ์ ์ ํ ๊ณณ | ๋ฐ์คํฌํฑ ์ฑ, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋น ๋ฏํ ์๋ฒ, ํ ์๋ฒ์ ํ๋ก์ธ์ค๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ | ์๋ฒ ํ ๋๋ฅผ ํ๋ก์ธ์ค ํ๋๊ฐ ๋ ์ฐจ์งํ๋ ์น ์๋ฒ |
“0์ธ๋ ์์ฐ”์ 0์ธ๋์ ์ด๋งํผ ํ ๋น๋๋ฉด GC๋ฅผ ๋๋ฆฐ๋ค๋ ๊ธฐ์ค๋์ ๋๋ค.
Server GC๋ ์ด ๊ฐ์ด ํจ์ฌ ํฌ๊ณ ํ์ด ์ฝ์ด ์๋งํผ ์์ด์, ๊ฐ์ ์ผ์ ํด๋ ํ๋ก์ธ์ค๊ฐ ์ก๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ํฝ๋๋ค.
GC๊ฐ ๊ฐ์ฒด๋ฅผ ์ง์ฐ๋ ๊ฒ๊ณผ ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ OS์ ๋ฐ๋ฉ(๋์ปค๋ฐ)ํ๋ ๊ฒ์ ๋ณ๊ฐ์ ๋จ๊ณ์ ๋๋ค. GC๋ ๋น๊ฒ ๋ ๊ณต๊ฐ์ ๊ณง ๋ค์ ์ธ ๊ฒ์ผ๋ก ๋ณด๊ณ ์ด๋ ์ ๋ ์ฅ๊ณ ์์ต๋๋ค. OS์ ๋๋ ค์คฌ๋ค๊ฐ ๋ค์ ๋ฐ๋ ๋น์ฉ์ด ํฌ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋์ Server GC ํ๋ก์ธ์ค๋ ํฐ ์์
์ ํ ๋ฒ ์น๋ฅธ ๋ค Private Bytes๊ฐ ํ์ฐธ ๋๊ฒ ์ ์ง๋๋ ์ผ์ด ํํ๊ณ , ์ด๊ฒ์ ๋์๊ฐ ์๋๋ผ ์ ์ ๋์์
๋๋ค.
์ด "์ฅ๊ณ ์๋" ์ฑํฅ์ด Server GC์์ ํจ์ฌ ๊ฐํฉ๋๋ค.
Workstation์ ๊ทธ๋ ๊ฒ ์ค๋ ์ฅ์ง ์์ต๋๋ค. ํ์ด ํ๋์ด๊ณ ์์ฐ์ด ์์์, ์ ์ฒด GC ๋ค์ ๋น๊ฒ ๋ ์์ญ์ ๋น๊ต์ ๋นจ๋ฆฌ ๋ฐ๋ฉํฉ๋๋ค.
์ธ๋๋ณ GC ์ค์ 2์ธ๋ GC์๋ ๋ ๋ฐฉ์์ด ์์ต๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋ GC์ ๋ธ๋กํน GC์ ๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋ GC ๋ ์ ์ฉ ์ค๋ ๋๊ฐ 2์ธ๋๋ฅผ ๋งํฌํ๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ ์คํ. ์งง๊ฒ ๋ ๋ฒ๋ง ๋ฉ์ถฅ๋๋ค.
๋ธ๋กํน GC ๋ ์ฒ์๋ถํฐ ๋๊น์ง ๋ชจ๋ ์ค๋ ๋๋ฅผ ์ธ์๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋ GC(2์ธ๋ ์์ง์ ์ฑ๊ณผ ๋์์ ์งํ)๋ฅผ ์ผค์ง๊ฐ ๋ณ๋ ์ค์ ์ผ๋ก ์๊ณ ๊ธฐ๋ณธ๊ฐ์ ์ผ์ง์ ๋๋ค.
| ๊ตฌ๋ถ | ๋ฐฑ๊ทธ๋ผ์ด๋ GC | ๋ธ๋กํน GC |
| ๋์ | ์ ์ฉ ์ค๋ ๋๊ฐ 2์ธ๋๋ฅผ ๋งํฌํ๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ ์คํ. ์งง๊ฒ ๋ ๋ฒ๋ง ๋ฉ์ถค | ์ฒ์๋ถํฐ ๋๊น์ง ๋ชจ๋ ์ค๋ ๋๋ฅผ ์ธ์ |
| ์ ๋ฆฌ ๋ฐฉ์ | ์ค์๋ง ํจ. ์์ถํ์ง ์์ | ์์ถ ๊ฐ๋ฅ. ๋น ์์ญ์ ๋ชจ์ OS์ ๋ฐ๋ฉํ ์ ์์ |
| ์ธ์ | ํ์์์ 2์ธ๋ GC | ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋, ์์ถ์ด ํ์ํ๋ค๊ณ ํ๋จ๋ ๋, ์์ง ์ค ํ ๋น์ด ๋๋ฌด ๋น ๋ฅผ ๋ |
JVM์ GC์ ๋๊ณ ๋ณด๋ฉด
| JVM | ๋น์ท .NET ์ค์ | ๊ณตํต์ |
| Serial | Workstation, ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ | ์ค๋ ๋ ํ๋๋ก ์์ง. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ ์ |
| Parallel | Server, ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ | ๋ณ๋ ฌ ์์ง. ์ฒ๋ฆฌ๋ ์ฐ์ |
| G1 (JDK 9๋ถํฐ ๊ธฐ๋ณธ) | Server, ๋ฐฑ๊ทธ๋ผ์ด๋ ์ผฌ | ๋ณ๋ ฌ ์์ง + ๋งํฌ์ ์ผ๋ถ๋ฅผ ์ฑ๊ณผ ๋์์ |
| ZGC, Shenandoah | ๋์ํ๋ ๊ฒ ์์ | ์์ถ๊น์ง ์ฑ๊ณผ ๋์์. ๋ฉ์ถค์ด ๋งค์ฐ ์งง์ |
JVM์ CPU๊ฐ 2๊ฐ ์ด์์ด๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฝ 2GB ์ด์์ธ ํ๊ฒฝ์์ G1์, ๊ทธ๋ณด๋ค ์์ผ๋ฉด Serial์ ๊ณ ๋ฆ ๋๋ค. .NET์ด ํ๋ก์ ํธ ์ข ๋ฅ๋ก ๊ธฐ๋ณธ๊ฐ์ ์ ํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ํ๋์จ์ด๋ฅผ ๋ณด๊ณ ์ ํฉ๋๋ค. ์ ํํ ์ผ์นํ๋ ์ง์ ์๊ณ ์ฑ๊ฒฉ์ด ๊ฐ๊น์ด ๊ฒ๋ผ๋ฆฌ ๋์ ํ์ ๋๋ค.
๊ฐ์ฅ ํฐ ์ฐจ์ด - ํ ์ํ
GC๋ฅผ ๋น๊ตํ๋ฉด์ ์ ๊ฐ ๊ฐ์ฅ ๋๋๋ ๋ถ๋ถ์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋ผ ํ์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ ํด ๋๋๋์์ต๋๋ค. Java๋ฅผ ํ๋ ์ต๊ด๋๋ก "ํ์ ์ด๋๊ฐ์์ ๋งํ๊ฒ ์ง"๋ผ๊ณ ์๊ฐํ๋๋ฐ, .NET์ ๊ธฐ๋ณธ์ผ๋ก ๋ง๋ ๊ณณ์ด ์์์ต๋๋ค.
| JVM | .NET | |
| ํ ์ต๋ ํฌ๊ธฐ์ ๊ธฐ๋ณธ๊ฐ | ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ 1/4 (-Xmx๋ก ๋ณ๊ฒฝ) | ์ํ ์์ (GCHeapHardLimit์ ๋ฐ๋ก ์ค์ผ ํจ) |
| ํ์ด ๊ณ์ ์ปค์ง๋ฉด | ์ํ์ ๋ฟ์ผ๋ฉด OutOfMemoryError. ๊ทธ ํ๋ก์ธ์ค๋ง ์ฃฝ๋๋ค | OS๊ฐ ๋ด์ค ์ ์๋ ๋งํผ ์ปค์ง๋ค. ์๋ฒ ์ ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ ์๋ฐ์ ๋ฐ๋๋ค |
| ๋ฉ์ถค ์๊ฐ ๋ชฉํ | G1์ ๊ธฐ๋ณธ 200ms ๋ชฉํ๋ฅผ ๋๊ณ ์์ง๋์ ์กฐ์ | ๋ฐ๋ฆฌ์ด ๋จ์ ๋ชฉํ๋ฅผ ์ฃผ๋ ์ค์ ์ ์์ |
JVM์ ๋ฐ๋ก ์ต์ ์ ์ฃผ์ง ์์๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ 1/4์์ ํ์ ๋ฉ์ถฅ๋๋ค. 8GB ์๋ฒ๋ผ๋ฉด ์ฝ 2GB์ ๋๋ค. ๊ฑฐ๊ธฐ์ ๋ ํ์ํ๋ฉด ์ ์ฒด GC๋ฅผ ๋ฐ๋ณตํ๋ค๊ฐ OutOfMemoryError๋ฅผ ๋์ง๊ณ , ๋ฌธ์ ๊ฐ ๊ทธ ํ๋ก์ธ์ค ์์์ ๋ถ๋ช ํ ์ค๋ฅ๋ก ๋๋ฌ๋ฉ๋๋ค.
.NET์ ๋ฐ๋์ ๋๋ค. GCHeapHardLimit์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ด๋ฆฌ ํ์ ์ ํด์ง ์ํ์ด ์์ต๋๋ค. ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ์ด 90%์ ๊ฐ๊น์์ง๋ฉด GC๊ฐ ์์ถ GC๋ฅผ ๋ ์ ๊ทน์ ์ผ๋ก ๋๋ฆฌ๊ธด ํ์ง๋ง, ๊ทธ๋๋ ๊ณ์ ์ด์ ์๋ ๊ฐ์ฒด๊ฐ ๋์ด๋๋ฉด ํ๋ ๊ฐ์ด ์ปค์ง๋๋ค. ๊ทธ๋์ ๋ฌธ์ ๋ "์ด ํ๋ก์ธ์ค๊ฐ ์ฃฝ์๋ค"๊ฐ ์๋๋ผ "์๋ฒ ์ ์ฒด๊ฐ ๋๋ฆฌ๋ค"๋ ๋ชจ์ต์ผ๋ก ๋ํ๋๊ธฐ ์ฝ์ต๋๋ค.
ํ ๊ฐ์ง ์์ธ๋ ์ปจํ ์ด๋์ ๋๋ค. ์ปจํ ์ด๋์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ ํ๋๊ฐ ๊ฑธ๋ฆฐ ํ๊ฒฝ์์๋ .NET๋ ๊ทธ ํ๋์ 75%(๋๋ 20MB ์ค ํฐ ๊ฐ)๋ฅผ ๊ธฐ๋ณธ ์ํ์ผ๋ก ์ก์ต๋๋ค. ๋ฐ๋๋ก Windows ์๋ฒ์ ๊ทธ๋ฅ ๋์ด ํ๋ก์ธ์ค๋ผ๋ฉด ์ํ์ด ์๋ ์ ์ ๋๋ค.
์ํ์ ์ง์ ์ฃผ๊ณ ์ถ๋ค๋ฉด runtimeconfig.json์ ๋ค์์ฒ๋ผ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค. ๋ฐ์ดํธ ๋จ์์ด๊ณ , ์๋ ๊ฐ์ 2GiB์ ๋๋ค.
{
"runtimeOptions": {
"configProperties": {
"System.GC.HeapHardLimit": 2147483648
}
}
}
๋น์จ๋ก ์ฃผ๊ณ ์ถ์ผ๋ฉด System.GC.HeapHardLimitPercent๋ฅผ ์ฐ๊ณ , ํ๊ฒฝ ๋ณ์๋ก๋ DOTNET_GCHeapHardLimit(16์ง์ ๊ฐ)์ผ๋ก๋ ์ค ์ ์์ต๋๋ค.
7๏ธโฃ์ค๊ณ๊ฐ ๊ฐ๋ฆฐ ๊ณณ
์ง๊ธ๊น์ง๋ ๋ฎ์ ์ ์์ฃผ๋ก ๋ดค๋ค๋ฉด, ์ด๋ฒ์ ๊ฐ์ ๋ผ๋ ์์์ ์๋ก ๋ค๋ฅธ ์ ํ์ ํ ์ง์ ๋ค์ ๋๋ค. ์์์ ๋ฐ๋ก ๋ค๋ฃฌ ๊ฒ๋ค๋ ํ ํ์ ๋ชจ์ ๋ณด์์ต๋๋ค.
| Java | .NET | |
| ๊ฐ ํ์ | ๊ธฐ๋ณธํ 8๊ฐ๋ฟ. ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ ์ ์์ | struct๋ก ์ง์ ์ ์. ํ ํ ๋น ์์ด ์คํ์ด๋ ๋ฐฐ์ด ์์ ํต์งธ๋ก ๋ค์ด๊ฐ |
| ์ ๋ค๋ฆญ | ์ปดํ์ผ ๋ ํ์ ์ ๋ณด๊ฐ ์ง์์ง. List<Integer>๋ ํญ์ ๋ฐ์ฑ | ๋ฐํ์๊น์ง ํ์ ์ ์ง. List<int>๋ ๋ฐ์ฑ ์์ด ์ ์๋ฅผ ๊ทธ๋๋ก ์ ์ฅ |
| ์คํ ๋ฐฉ์ | ์ธํฐํ๋ฆฌํฐ๋ก ์์ํด ์์ฃผ ๋๋ ์ฝ๋๋ง JIT | ์ฒ์๋ถํฐ JIT (๋จ๊ณ๋ณ ์ฌ์ปดํ์ผ์ ์์) |
| ํ ์ํ | ๊ธฐ๋ณธ์ผ๋ก ์์ | ๊ธฐ๋ณธ์ผ๋ก ์์ (์ปจํ ์ด๋ ์ ์ธ) |
| GC ์ ํ | ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ฅผ ๊ณ ๋ฆ | ์ด์ฉ ๋ฐฉ์๋ง ๊ณ ๋ฆ |
| ๋ฐํ์ ๋ฌถ์ | ํ๋ | ์ฉ๋๋ณ๋ก ์ธ ๊ฐ |
| ์ง๋จ ๋๊ตฌ | JDK์ ํฌํจ | ๋ฐ๋ก ์ค์น |
| ๊ตฌํ์ฒด | ์ฌ๋ฌ ๋ฒค๋ (OpenJDK ๊ธฐ๋ฐ ๋ฐฐํฌํ๋ค) | ์ฌ์ค์ Microsoft๊ฐ ์ฃผ๋ํ๋ ๊ฒ ํ๋ |
์ด ์ค์์ Java ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฅ ๋ฏ์ค๊ฒ ๋๋ ๋ถ๋ถ์ ๊ฐ ํ์ ๊ณผ ์ ๋ค๋ฆญ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋์ ๋ฐ๋ก ๋ ธ๋ ์ด์ผ๊ธฐ๊ฐ ์๋๋ผ ๊ฐ์ด ๋ฌถ์ฌ ์์ต๋๋ค.
Java์ ์ ๋ค๋ฆญ์ ์ปดํ์ผ์ด ๋๋๋ฉด ํ์ ์ ๋ณด๊ฐ ์ง์์ง๋๋ค(ํ์ ์๊ฑฐ, Type Erasure). ๋ฐํ์์๋ List<Integer>๋ List<String>์ด๋ ๋๊ฐ์ด Object๋ฅผ ๋ด๋ ๋ฆฌ์คํธ์ผ ๋ฟ์ด๋ผ, int๋ฅผ ๋ฃ์ผ๋ ค๋ฉด Integer ๊ฐ์ฒด๋ก ๊ฐ์ธ์ผ(๋ฐ์ฑ) ํฉ๋๋ค.
List<Integer> list = new ArrayList<>();
list.add(1); // int → Integer ๊ฐ์ฒด๋ก ๋ฐ์ฑ๋์ด ํ์ ์ฌ๋ผ๊ฐ๋ค
.NET์ ์ ๋ค๋ฆญ ํ์ ์ ๋ณด๋ฅผ ๋ฐํ์๊น์ง ๋ค๊ณ ๊ฐ๋๋ค. ๊ทธ๋์ List<int>๋ ๋ด๋ถ ๋ฐฐ์ด์ด int[]์ด๊ณ , ์ ์๋ฅผ ๊ฐ์ฒด๋ก ๊ฐ์ธ์ง ์๊ณ ๊ทธ๋๋ก ์ ์ฅํฉ๋๋ค.
List<int> list = new List<int>();
list.Add(1); // ๋ฐ์ฑ ์์. ๋ด๋ถ int[] ๋ฐฐ์ด์ 4๋ฐ์ดํธ ์ ์๋ก ๋ค์ด๊ฐ๋ค
์ฆ, ์์๊ฐ ์๋ฐฑ๋ง ๊ฐ์ฏค ๋๋ฉด Java ์ชฝ์ ๊ทธ๋งํผ์ Integer ๊ฐ์ฒด๊ฐ ํ์ ์๊ธฐ๊ณ , .NET ์ชฝ์ ์ ์ ๋ฐฐ์ด ํ๋๋ก ๋๋ฉ๋๋ค. ๋์ .NET์์๋ ๊ฐ ํ์ ์ object๋ ์ธํฐํ์ด์ค ์๋ฆฌ์ ๋๊ธฐ๋ฉด ๋ฐ์ฑ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ "๋ฐ์ฑ์ด ์๋ค"๊ฐ ์๋๋ผ "ํผํ ์ ์๋ ๊ธธ์ด ์๋ค"๋ก ์ดํดํ์๋ฉด ๋ฉ๋๋ค.
โจ๋ง๋ฌด๋ฆฌ
์ฒ์ .NET ์ ๊ณต๋ถํ์ ๋๋ coreclr.dll, ๋ก๋ ํ, Workstation GC ๊ฐ์ ๋ฏ์ ์ด๋ฆ๋ค ๋๋ฌธ์ ์์ ํ ๋ค๋ฅธ ์ธ๊ณ์ฒ๋ผ ๋๊ปด์ก์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ํ๋์ฉ Java์ ๋์์์ผ ๋ณด๋ ๋๋ถ๋ถ์ ์ด๋ฆ๋ง ๋ค๋ฅผ ๋ฟ ์ด๋ฏธ ์๊ณ ์๋ ๊ฐ๋ ์ด์์ต๋๋ค.
์ฒ์์ ๋ง์๋๋ฆฐ "ํ ๊ฐ์ง ๊ฐ๋ ์ ์ ๋๋ก ์ดํดํ๋ฉด ๋ค๋ฅธ ๊ฒ๋ ์ดํดํ ์ ์๋ค"๋ ๋ฏฟ์์ด ์ด๋ฒ์๋ ์ด๋ ์ ๋ ๋ง์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- JDK ⊃ JRE ⊃ JVM ๊ตฌ์กฐ๋ .NET SDK ⊃ .NET Runtime ⊃ CLR๋ก ๊ฑฐ์ ๊ทธ๋๋ก ์ฎ๊ฒจ์ง๋๋ค. ์ด๋ฆ๋ง ๋ฐ๊ฟ ์ฝ์ด๋ ํฐ ๊ทธ๋ฆผ์ ์กํ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์์ญ์ JVM ๋ช ์ธ์ฒ๋ผ ์ ํด์ง ๋ชฉ๋ก์ด ์์ด์, ๊ด๋ฆฌ ํ·๋ก๋ ํ·์ฝ๋ ํ ๊ฐ์ CoreCLR ์ชฝ ์ด๋ฆ์ ๋ฐ๋ก ์ตํ์ผ ํฉ๋๋ค.
- GC๋ JVM์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ณ ๋ฅด๊ณ , .NET์ Workstation/Server์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฌ๋ถ๋ผ๋ ์ด์ฉ ๋ฐฉ์์ ๊ณ ๋ฆ ๋๋ค.
- ๊ฐ์ฅ ์กฐ์ฌํด์ผ ํ ์ฐจ์ด๋ ํ ์ํ์ ๋๋ค. Java์ฒ๋ผ "์ด๋๊ฐ์์ ๋งํ๊ฒ ์ง"๋ผ๊ณ ์๊ฐํ๋ฉด .NET์์๋ ์๋ฒ ์ ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ด์ฃผ๊ฒ ๋ ์ ์์ต๋๋ค.
- ๊ฐ ํ์ ๊ณผ ์ ๋ค๋ฆญ์ ๋ฎ์ ๊ตฌ์กฐ ์์์ ์ค๊ณ๊ฐ ๊ฐ์ฅ ํฌ๊ฒ ๊ฐ๋ฆฐ ๊ณณ์ด๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ง์ ์ํฅ์ ์ค๋๋ค.
๋๊ธ