Search
moon
sun
๐Ÿ

STL.NET Primer (2/4)

Category
as S/W ์—”์ง€๋‹ˆ์–ด
Tags
C++
C++/CLI
STL
STL.NET
.NET
Stanley Lippman
STL/CLR
Created time
2005/03/22
๐ŸSTL.NET Primer (1/4)์—์„œ ์ด์–ด์ง€๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค.
๐Ÿ’ก
์ด ์ปฌ๋Ÿผ์€ STL.NET Primer๋ž€ ์ œ๋ชฉ์œผ๋กœ MSDN์— ํฌ์ŠคํŒ…๋œ ๊ธ€์„ ๋ฒˆ์—ญํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ–‰๋ณตํ•œ ๊ณ ๋ฏผ : ๋ฌด์—‡์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

CLI ํƒ€์ž…์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ปฌ๋ ‰์…˜์„ ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์žˆ์–ด Visual C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์„ ํƒ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋“ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„ธ ๊ฐ€์ง€์˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”(type parameterization) ๋ชจ๋ธ์— ๊ฐ๊ฐ ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ๋ชจ๋ธ์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ ์ƒ˜ํ”Œ๊ณผ ํ•จ๊ป˜ ์ด๋“ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์š”์•ฝํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์˜ค๋ฆฌ์ง€๋„ย System::Collectionsย ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š”, ๋ชจ๋“  CLI ํƒ€์ž…์˜ ๊ธฐ์ดˆ ํด๋ž˜์Šค(base class)์ธย Object๋ฅผ ํ†ตํ•ด ์š”์†Œ ํƒ€์ž…์„ ์ €์žฅํ•˜๋Š” ๋ฐ์— ๊ธฐ๋ฐ˜์„ ๋‘ก๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ๋กœ, ์•„๋ž˜์—๋Š”ย IListย ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”ย ArrayList๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํƒ€์ž…์€ย Objectย ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด ์˜ˆ์ œ์—์„œ๋Š”ย Stringย ํƒ€์ž…์˜ ์š”์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
void objectCollection() { using namespace System::Collections; ArrayList ^as = gcnew ArrrayList; as->Add( "Pooh" ); as->Add( "Piglet" ); as->Add( "Eeyore" ); as->Add( "Rabbit" ); as->Sort(); Console::WriteLine( "ArrayList holds {0} elements: ", as->Count ); for ( int i = 0; i < as->Count; i++ ) Console::WriteLine( as[ i ] ); int index = as->IndexOf( "Pooh" ); if ( index != -1 ) { // ๋ช…์‹œ์ ์ธ ๋‹ค์šด์บ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. String^ item = safe_cast( as[ index ]); as->RemoveAt( index ); } as->Remove( "Rabbit" ); Console::WriteLine( " ArrayList holds {0} elements: ", as->Count ); IEnumerator^ is = as->GetEnumerator(); While ( is->MoveNext() ) Console::WriteLine( is->Current ); }
C++
๋ณต์‚ฌ
์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” CLI Generic ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ธฐ๋ฐ˜์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š”ย System::Collections::Genericย ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์ฃ . ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Visual Studio 2005 ๋ฒ ํƒ€ 1์—์„œ ์„ ๋ณด์˜€๋Š”๋ฐ, ์ตœ์ข…ํŒ์ด ๋ฐฐํฌ๋˜๊ธฐ์— ์•ž์„œ ๋ณ€๊ฒฝ์ด ๊ฐ€ํ•ด์ง€๋ฆฌ๋ผ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.ย Collection<T>๋Š” ๊ตฌ์ฒดํ™”๋  ์ง€๋„ค๋ฆญ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค(concrete generic base class)๋กœ์„œ, ์‚ฌ์šฉ์ž๋“ค์€ ์ด ํด๋ž˜์Šค๋ฅผ ๊ธฐ์ดˆ ํด๋ž˜์Šค๋กœ ํ•˜์—ฌ ๊ทธ๋“ค๋งŒ์˜ ํŠนํ™”๋œ ์ปจํ…Œ์ด๋„ˆ ํด๋ž˜์Šค๋ฅผ ํŒŒ์ƒ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์œ„์˜ ์˜ˆ์™€ ๋™์ผํ•œ ๋‚ด์šฉ์ด ๋‹ด๊ธด ์ง€๋„ค๋ฆญ ๋ฒ„์ „์˜ ์˜ˆ์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
void genericCollection() { using namespace System::Collections::Generic; Collection<String^> ^cols = gcnew Collection<String^>; cols->Add( "Pooh" ); cols->Add( "Piglet" ); cols->Add( "Eeyore" ); cols->Add( "Rabbit" ); // ์ฝœ๋ ‰์…˜์— ๊ด€๊ณ„๋œ ์ •๋ ฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Console::WriteLine( "Collection holds {0} elements: ", cols->Count ); for ( int i = 0; i < cols->Count; i++ ) Console::WriteLine( cols[ i ] ); int index = cols->IndexOf( "Pooh" ); if ( index != -1 ) { // ๋‹ค์šด์บ์ŠคํŠธ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค ... String ^item = cols[ index ]; cols->RemoveAt( index ); } cols->Remove( "Rabbit" ); Console::WriteLine( " Collection holds {0} elements:", cols->Count ); IEnumerator<String^> ^is = cols->GetEnumerator(); while ( is->MoveNext() ) Console::WriteLine( is->Current ); }
C++
๋ณต์‚ฌ
STL.NET์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”(type parameterization) ๋ชจ๋ธ์€ ๋งค์šฐ ๋‹ค๋ฅธ๋ฐ, ๋ฐ”๋กœ ์ด ๋ชจ๋ธ์ด ๋‹ค์Œ ์ ˆ์˜ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ๊ตฌํ˜„ ์ฝ”๋“œ๋Š”ย Stringย ์ปจํ…Œ์ด๋„ˆ๋กœ์„œ, ์•„๋ž˜์—์„œ ์ข€๋” ๊นŠ๊ฒŒ ํŒŒ๊ณ ๋“ค ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
#include <cli/vector> #include <algorithm> void stlCollection() { vector<String^> ^svec = gcnew vector<String^>; svec->push_back("Pooh"); svec->push_back("Piglet"); svec->push_back("Eeyore"); svec->push_back("Rabbit"); // ์ง€๋„ค๋ฆญ ์•Œ๊ณ ๋ฆฌ์ฆ˜: sort sort( svec->begin(), svec->end() ); Console::WriteLine( "Collection holds {0} elements: ", svec->size() ); for ( int i = 0; i < svec->size(); i++ ) Console::WriteLine( svec[ i ] ); // ์ง€๋„ค๋ฆญ ์•Œ๊ณ ๋ฆฌ์ฆ˜: find vector::iterator iter = find( svec->begin(), svec->end(), "Pooh" ); if ( iter != svec->end() ) { // ๋‹ค์šด์บ์ŠคํŠธ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค ... String ^item = *iter; svec->erase( iter ); } // ์ง€๋„ค๋ฆญ ์•Œ๊ณ ๋ฆฌ์ฆ˜: remove ... remove(svec->begin(),svec->begin(),svec->end(),"Rabbit"); Console::WriteLine( " Collection holds {0} elements: ", svec->size() ); IEnumerator ^is = svec->GetEnumerator(); while ( is->MoveNext() ) Console::WriteLine( is->Current ); }
C++
๋ณต์‚ฌ

์™œ STL.NET์ธ๊ฐ€?

STL.NET์— ๋Œ€ํ•˜์—ฌ ํŒŒ๊ณ ๋“ค๊ธฐ์— ์•ž์„œ, ๋ถ„๋ช…ํžˆ ํ•ด๋‘์–ด์•ผ ํ•  ์‚ฌํ•ญ์„ ์งš๊ณ  ๊ฐ€๋„๋ก ํ•˜์ฃ . ๋ฐ”๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค : ์™œ Visual C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์–ธ์–ด ์ค‘๋ฆฝ์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธย System::Collections๋‚˜ย System::Collections::Generic๋ณด๋‹ค, STL.NET ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?
๋ณดํ†ต,ย System::Collectionsย ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”ผํ•˜๊ฒŒ ๋˜๋Š” ์ด์œ ๋Š” Visual Studio 2005์—์„œย Genericย ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ด์œ ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”์— ๋Œ€ํ•œย Objectย ๋ชจ๋ธ์€ ํƒ€์ž… ์ •๋ณด๋ฅผ ์†์‹คํ•จ์œผ๋กœ ์ธํ•˜์—ฌ ๋ณต์žกํ•˜๊ณ ๋„ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด์ฃ . 16๊ฐœ ํ˜น์€ ๊ทธ ์ดํ•˜์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ง„ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋Š” ๋ฒ„๋ธ” ์†ŒํŠธ(bubble sort)๊ฐ€ ๋ฌธ์ œ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์ด ๋ชจ๋ธ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹ค์„ธ๊ณ„์˜ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ๋Š” ์ข€๋” ์ •๊ตํ•œ ํ•ด๊ฒฐ์ฑ…์ด ํ•„์š”ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ, Visual C++ ๊ฐ™์€ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์œ„ํ•œ ๋Œ€์•ˆ์€ STL.NET๊ณผย System::Collections::Genericย ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ขํ˜€์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ์™œ Visual C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ด ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ STL.NET์„ ์„ ํ˜ธํ•ด์•ผ ํ• ๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ๋‚˜๋จธ์ง€ ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค๋ฅธ .NET ์–ธ์–ด๋กœ๋ถ€ํ„ฐ ๊ฒฉ๋ฆฌ์‹œํ‚ค๋Š” ๊ผด์€ ์•„๋‹๊นŒ์š”? ์ด๋Š” ์œ ํšจํ•œ ์งˆ๋ฌธ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋‹ต๋ณ€๋ฐ›์„ ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ๋‹ต๋ณ€์€ ํ™•์žฅ์„ฑ(extensibility)์ž…๋‹ˆ๋‹ค. Alex Stepanov๊ฐ€ ๋ฐœ๋ช…ํ•œ STL์˜ ์› ๋””์ž์ธ ํŒจํ„ด์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋‘ ์˜์—ญ(domain space)๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ๋ถ„์€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉ๋  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜, ๊ทธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋  ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒย Genericย ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ข€๋” ์ œํ•œ์ ์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋ธ์ด๋ฉฐ, ์ด ์‚ฌ์‹ค์€ ์šฐ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ์งธ ๋‹ต๋ณ€์œผ๋กœ ์ด๋•๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ ๋‹ต๋ณ€์€ ํ†ต์ผ์„ฑ(unification)์ž…๋‹ˆ๋‹ค. ์‹ค์ „์˜ C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ๊ธฐ์กด์˜ ์ฝ”๋“œ ๋ชธ์ฒด๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ, ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํ•จ๊ป˜ํ•จ์œผ๋กœ์จ ์ „๋ฌธ์  ๊ธฐ์ˆ ์„ ์ตํ˜€์™”์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ”๋Š” (.NET์œผ๋กœ์˜) ์ด์ฃผ๋กœ(migration path)๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์žˆ์–ด ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ชธ์— ์ต์ˆ™ํ•ด์ง„ ๊ธฐ์กด์˜ ๊ธฐ์ˆ ๋„ ํ•จ๊ป˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด C++๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ์— STL์— ์˜์กดํ•ด์™”์„ ๊ฒฝ์šฐ .NET ํ•˜์—์„œ STL์„ ์‚ฌ์šฉ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฅผ ํฌ๋‚˜ํฐ ์†์‹ค๋กœ ์—ฌ๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ ์–ด๋„ ์ €์˜ ๊ฒฝํ—˜์œผ๋กœ๋Š” ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค). ์ด๋Ÿฌํ•œ ๊ฒฌํ•ด๋Š” ์ €์™€ ์˜๊ฒฌ์„ ๋‚˜๋ˆ ์˜จ ๋งŽ์€ ๊ณ ๊ธ‰ C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์—๊ฒŒ์„œ ์ด๋ฏธ ์ œ๊ธฐ๋˜์—ˆ๋˜ ์‚ฌํ•ญ์ด๋ฉฐ, ์ด๋กœ ์ธํ•ด ๊ทธ๋“ค์€ .NET์œผ๋กœ ์ด์ฃผํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋ฅ˜ํ–ˆ๋‹ค๊ณ  ๋งํ•ด์™”์Šต๋‹ˆ๋‹ค.
์„ธ ๋ฒˆ์งธ ๋‹ต๋ณ€์€ ์„ฑ๋Šฅ(performance)์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์„ฑ๋Šฅ์— ๊ด€ํ•œ ์ฃผ์ œ์— ๋Œ€ํ•ด์„ ... ํ , ๋งํ•˜์ž๋ฉด, ์งœ์ฆ๋‚  ์ •๋„๋กœ ์˜ˆ๋ฏผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด ์—ฐ์žฌ๋ฌผ ์ค‘ ์ ์ ˆํ•œ ์‹œ์ ์—์„œ ๋‹ค์‹œ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ, ๋‚จ์€ ์งˆ๋ฌธ, "์ข‹์•„์š”, Stan. ์ง€๊ธˆ๊นŒ์ง€ ๋ชจ๋‘ ์ข‹์•˜๋‹ค๊ณ ์š”. ํ•˜์ง€๋งŒ ์ด๋Š” C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ C++/CLI ํ”„๋กœ๊ทธ๋žจ์„ ๋‚˜๋จธ์ง€ ๋‹ค๋ฅธ .NET ์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ๋ถ€ํ„ฐ ๊ณ ๋ฆฝ์‹œํ‚ค๊ฒŒ ๋˜๋Š” ์ผ์ด ์•„๋‹Œ๊ฐ€์š”?" ์ด์— ๋Œ€ํ•œ ๋‹ต๋ณ€์€, ์ œ๊ฐ€ ๋ฏฟ๊ธฐ๋กœ๋Š”, '์•„๋‹ˆ์˜ค'์ž…๋‹ˆ๋‹ค. Anson Tsao, Martyn Lovel, P.J. Plauger๋ฅผ ๋น„๋กฏํ•œ STL.NET ์•„ํ‚คํ…ํŠธ๋“ค์€ ์ด ์‚ฌ์•ˆ์— ๋Œ€ํ•ด ์‹ฌ์‚ฌ์ˆ™๊ณ ๋ฅผ ํ•ด์™”์œผ๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ์˜ ๋Šฅ๋ ฅ, ์ฆ‰ย IEnumerator,ย IList,ย ๊ทธ๋ฆฌ๊ณ ย ICollection์— ๋Œ€ํ•œ ์ง€์›์„ ํ†ตํ•ด ๋‹ค๋ฅธ .NET ์–ธ์–ด์™€ ์ƒํ˜ธ์šด์šฉ์„ ์ด๋ค„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ์— ํ™•์‹ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด์–ด์งˆ ์ €์˜ ์ปฌ๋Ÿผ ์ค‘ ํ•˜๋‚˜์—์„œ๋Š” ์ด ์‚ฌํ•ญ์— ๋Œ€ํ•˜์—ฌ ๊นŠ๊ฒŒ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๐ŸSTL.NET Primer (3/4)์œผ๋กœ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.