22.08.04(๋ชฉ)
[1~2์ฐจ์ - ์์ฑ์(Constructor)์ ์ข ๋ฃ์]
* ์์ฑ์(Constructor)
: ์ค๊ณ๋ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฉ์๋์ ๊ฐ์ ๊ฒ.
* ์์ฑ์ ํ์
ํ์ ์ ํด๋์ค๋ช
(๋งค๊ฐ๋ณ์๋ช
) { } |
* ์์ฑ์ ํน์ง
- ํด๋์ค๋ฅผ ์ ์ธํ ๋ ์์ฑ์๋ฅผ ๊ตฌํํ์ง ์์์ ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ์์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ค์ด ์ค๋ค.
- ์์ฑ์์ ์ด๋ฆ์ ํด๋์ค์ ์ด๋ฆ๊ณผ ๊ฐ๋ค.
* ์ข ๋ฃ์
: ๊ฐ์ฒด์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ๊ฒ.
* ์ข ๋ฃ์ ํ์
~ํด๋์ค๋ช
() { } |
* ์ข ๋ฃ์ ํน์ง
- ํด๋์ค๋ช ์ ~๋ฅผ ๋ถ์ฌ ์ฌ์ฉํ๋ค.
- ์์ฑ์์ ๋ฌ๋ฆฌ ํ์ ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
- ๋งค๊ฐ๋ณ์๋ ์๋ค. ์ค๋ฒ๋ก๋ฉ๋ ์๋จ.
- ์ง์ ํธ์ถ์ด ๋ถ๊ฐํ๊ณ CLR(Common Language Runtime)์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๊ฐ์ฒด ์๋ฉธ ์์ ์ ํ๋จํด์ ์ข ๋ฃ์๋ฅผ ํธ์ถํด์ค๋ค.
- CLR ๋๋ถ์ ์ข ๋ฃ์ ๊ตฌ์ง ์์ ์ด๋ ๋จ.
* CLR(Common Language Runtime) ? โญ๏ธโญ๏ธโญ๏ธ
: ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํด ์คํํ๊ฒฝ์ ์ ๊ณตํด์ฃผ๋ ๊ฒ.
: CLR์ด C# ์ฝ๋๋ฅผ ์ฝ์ด์ ์ปดํจํฐ(OS)๊ฐ ์ดํดํ ์ ์๋ Native Code ๋ก ๋ณ์ญํด์ฃผ๋ ์ญํ . ( JIT ์ปดํ์ผ )
cf) C# 6.0์์๋ ํฌ๋งทํ ์ ํ ๋ $ ๊ธฐํธ๋ฅผ ์ด์ฉํด์ ํํํ ์ ์๋๋ก ํ๊ณ ์๋ค.
22.08.05(๊ธ)
[3์ฐจ์ - static ํ๋์ static ๋ฉ์๋]
* static: ์ ์ ์ ์๋ฏธ. ex) ์ ์ ๋ฉ์๋, ์ ์ ํ๋(๋ณ์) ๋ฑ
ํ ํ๋ก๊ทธ๋จ ์์ ํด๋์ค๋ ํ๋๋ง ์กด์ฌํ์ง๋ง ์ธ์คํด์ค๋ ์ฌ๋ฌ๊ฐ๊ฐ ์กด์ฌํ ์ ์๋ค.
ํ ํ๋ก๊ทธ๋จ ์์ ๋๊ฐ์ ํด๋์ค๋ ๋ ๊ฐ๊ฐ ์กด์ฌํ ์ ์๋ค.
์ด์ฒ๋ผ static ํ๋๋ ๋ฉ์๋๋ ํด๋์ค์ ์์๋ ๊ฒ์ด๋ฏ๋ก ํ๋ก๊ทธ๋จ ์์ ์ ์ผํ๊ฒ ์กด์ฌํ๋ค. => Class ๋ช ์ผ๋ก ์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅ
namespace StaticEx{
class Program{
static void Main(string[] args){
DemoClass demoClass = new DemoClass();
demoCalss.a = 100;
demoClass.b = 200;
DemoClass demoClass2 = new DemoClass();
demoClass2.a = 1;
demoClass2.b = 2;
SdemoClass.a = 11; // static ํ๋์ด๊ธฐ ๋๋ฌธ์(์ ์ผํ) ํด๋์ค ๋ช
์ผ๋ก ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค.
SdemoClass.b = 22;
}
}
class DemoClass{
public int a;
public int b;
}
class SdemoClass{
public static int a;
public static int b;
}
}
* ์ธ์คํด์ค ๋ฉ์๋, ํ๋์ static ๋ฉ์๋, ํ๋์ ์ฐจ์ด์
namespace StaticEx2{
class MyClass{
public static int Global_Count = 0;
}
class DemoCalss1{
public DemoClass2(){
MyClass.Galobal_Count++;
}
}
class DemoCalss2{
public DemoClass2(){
MyClass.Galobal_Count++;
}
}
class Program{
static void Main(string[] args){
Console.WriteLine($"Global_Count: {MyClass.Global_Count}");
new DemoClass1();
new DemoClass1();
new DemoClass2();
Console.WriteLine($"Global_Count: {MyClass.Global_Count}");
}
}
}
[4์ฐจ์ - ๊น์๋ณต์ฌ์ ์ดํด]
ex) ์์ ๋ณต์ฌ, ๊น์ ๋ณต์ฌ ์์ ์ฝ๋
namespace ObjCopyEx{
class Program{
class Demo1{
public int aa;
public int bb;
//๊น์ ๋ณต์ฌ๋ฅผ ์ํ ๋ฉ์๋
public Demo1 DeepCopy(){
Demo1 newDemo1 = new Demo1();
newDemo1.aa = this.aa;
newDemo1.bb = this.bb;
return newDemo1;
}
}
static void Main(string[] args){
//์์ ๋ณต์ฌ
Demo1 demo1 = new Demo1();
demo1.aa = 100;
demo1.bb = 100;
Demo1 demo11 = demo1;
demo11.bb = 1111;
Console.WriteLine("----------์์ ๋ณต์ฌ----------")
Console.WriteLine($"{demo1.aa} {demo1.bb}");//100 1111
Console.WriteLine($"{demo11.aa} {demo11.bb}");//100 1111
//๊น์ ๋ณต์ฌ
Demo1 demo1 = new Demo1();
demo1.aa = 100;
demo.bb = 1000;
Demo1 demo11 = demo1.DeepCopy();
demo11.bb = 1111;
Console.WriteLine("----------๊น์ ๋ณต์ฌ----------")
Console.WriteLine($"{demo1.aa} {demo1.bb}");//100 1000
Console.WriteLine($"{demo1.aa} {demo1.bb}");//100 1111
}
}
}
์์ ๋ณต์ฌ, ๊น์ ๋ณต์ฌ์ ์๋ฆฌ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ์์๋ณด์.
์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ์ ์ฐจ์ด๋ ์์์ ๋ฐฐ์ ๋ ๊ฐ๋ ์ธ ์ฐธ์กฐํ์๊ณผ ๊ฐํ์์ผ๋ก ์ดํดํ๋ฉด ์ฝ๋ค.
* ์์ ๋ณต์ฌ: ์ฐธ์กฐ ํํ
* ๊น์ ๋ณต์ฌ: ๊ฐ ํํ
: ์์ ๋ณต์ฌ๋ฅผ ํ๋ฉด Heap ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๊ฐ์ ๊ฐ์ ๊ฐ๋ฆฌํค์ง๋ง, ๊น์ ๋ณต์ฌ๋ฅผ ํ๋ฉด Heap ๋ฉ๋ชจ๋ฆฌ์ ์๋ก์ด ์ฃผ์์ ๋ณ์ ๊ณต๊ฐ์ ๋ง๋๋ฏ๋ก ๊ฐ์ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ ์ ์๋ค.
22.08.08(์), 22.08.11(๋ชฉ)
[5์ฐจ์ - this, this() ์์ฑ์]
* this: ๊ฐ์ฒด๊ฐ ํด๋์ค ๋ด๋ถ์์ ์์ ์ ์ง์นญํ ๋ ์ฌ์ฉํ๋ ํค์๋. ๋ ์์ ~!
namespace ThisEx{
class Student{
private string name;
public void SetName(string name){
this.name = name;
}
}
class Program{
static void Main(string[] args){
}
}
}
: SetName() ํจ์์์ name = name; ์ด๋ ๊ฒ ์ ์ผ๋ฉด ์์ name ๋ณ์๊ฐ SetName ํจ์ ์ธ์์ ์๋ name ์ธ์ง, Student ํด๋์ค์ name ์ธ์ง ์ ์๊ฐ ์๋ค. ์ด๋ด ๋ this ํค์๋๋ฅผ ์ด์ฉํด์ = ์ผ์ชฝ์ Student ํด๋์ค์ name, = ์ค๋ฅธ์ชฝ์ ๋งค๊ฐ๋ณ์์ name ์ด๋ผ๊ณ ๋ช ์ํด์ฃผ๋ ๊ฒ์ด๋ค.
* this(): ์์ฑ์. ๋ฉ์๋์ ๋น์ทํ ๊ฒ์ผ๋ก ์ค๋ฒ๋ก๋ฉ์ด ๊ฐ๋ฅํจ.
namespace ThisEx2{
class Demo{
public int a, b, c;
//a, b, c ๋ฑ ๋ณ์๋ฅผ ์ค๋ณต์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ์์ฑ์ ์ค๋ฒ๋ก๋ฉ ์ฝ๋. ๋ณด๊ธฐ ์์ฃผ ๋ถํธ...
public Demo(){
this.a = 100;
}
public Demo(int b){
this.a = 100;
this.b = b;
}
public Demo(int b, int c){
this.a = 100;
this.b = b;
this.c = c;
}
}
class Program{
static void Main(string[] args){
Demo demo = new Demo(200, 300);
Console.WriteLine(demo.b); //200
Console.WriteLine(demo.c); //300
}
}
}
์์์ ๋ณ์๋ฅผ ์ค๋ณต์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๋ถํธํ๋ ์ฝ๋๋ฅผ this() ์์ฑ์๋ฅผ ์ด์ฉํด์ ์์๋ฐ๊ณ ์ค๋ณต์ ์ ๊ฑฐํ ์ฝ๋
namespace ThisEx2{
class Demo{
public int a, b, c;
//a, b, c ๋ฑ ๋ณ์๋ฅผ ์ค๋ณต์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ์์ฑ์ ์ค๋ฒ๋ก๋ฉ ์ฝ๋. ๋ณด๊ธฐ ์์ฃผ ๋ถํธ...
public Demo(){
this.a = 100;
Console.WriteLine("Demo()"); //Demo()
}
public Demo(int b): this(){
//this.a = 100; ์ฃผ์!! ๋งค๊ฐ๋ณ์์ ์ ์ ๋ณ์๋ง ์ฒ๋ฆฌํด์ผ ํจ.
this.b = b;
Console.WriteLine($"{Demo({b})"); //Demo(200)
}
public Demo(int b, int c): this(b){
//this.a = 100;
//tihs.b = b;
this.c = c;
Console.WriteLine($"{Demo({b} {c})"); //Demo(200 300)
}
}
class Program{
static void Main(string[] args){
Demo demo = new Demo(200, 300);
Console.WriteLine(demo.a); //100
Console.WriteLine(demo.b); //200
Console.WriteLine(demo.c); //300
}
}
}
22.08.23(ํ)
[6~7์ฐจ์ - ์ ๊ทผ ์ ํ์(Access Modifier)]
* ์ ๊ทผ ์ ํ์/ํ์ ์ ์ข ๋ฅ
public, private, protected, internal, protected internal, private protected
1) public: ํด๋์ค์ ๋ด๋ถ ๋๋ ์ธ๋ถ ๋ชจ๋ ๊ณณ์์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ์ง์ ์
2) private: ํด๋์ค ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ์ง์ ์. ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ๋ ์ง์ ์.
์์ ๋ฐ์ ์์(ํ์) ํด๋์ค์์๋ ์ ๊ทผ ํ์ฉ ์๋จ.
3) protected: ํด๋์ค ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ์ง์ ์. ํ์ง๋ง ํ์ ํด๋์ค์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ๋ ์ง์ ์.
4) internal: ๋์ผ ์ด์ ๋ธ๋ฆฌ์ ์๋ ์ฝ๋์์๋ง public์ผ๋ก ์ ๊ทผํ ์ ์๋ ์ง์ ์.
๋ค๋ฅธ ์ด์ ๋ธ๋ฆฌ์ ์๋ ์ฝ๋์์๋ private๊ณผ ๊ฐ์ ์์ค์ ์ ๊ทผ ์์ค์ ๊ฐ๋๋ค. ์ฆ ์ ๊ทผ ๋ถ๊ฐ.
* ์ด์ ๋ธ๋ฆฌ: ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(.dll), ์คํํ์ผ(.exe) ๋ฑ์ ํ์ผ๋ค
5) protected internal: ๋์ผ ์ด์ ๋ธ๋ฆฌ์ ์๋ ์ฝ๋์์๋ง protected๋ก ์ ๊ทผํ ์ ์๋ ์ง์ ์.
๋ค๋ฅธ ์ด์ ๋ธ๋ฆฌ์ ์๋ ์ฝ๋์์๋ private๊ณผ ๊ฐ์ ์ ๊ทผ ์์ค์ ๊ฐ๋๋ค. ์ฆ ์ ๊ทผ ์๋จ.
6) private protected: ๋์ผ ์ด์ ๋ธ๋ฆฌ์ ์๋ ํด๋์ค์์ ์์๋ฐ์ ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅ
* ํ์ ์๊ฐ ์ค์ ๋์ด ์์ง ์์ ๋ ๊ธฐ๋ณธ ์ ํ ๊ฐ์ private์ด๋ค.
์์)
namespace AccessModifierEx{
class Demo{
public Demo(){
Demo.public_method();
Demo.private_method();
Demo.protected_method();
Demo.internal_method();
Demo.protected_internal();
}
//public ์ ๊ทผ ์ ํ์
public static void public_method(){ }
//private ์ ๊ทผ ์ ํ์
private static void private_method(){ }
//protected ์ ๊ทผ ์ ํ์
protected static void protected_method(){ }
//internal ์ ๊ทผ ์ ํ์
internal static void internal_method(){ }
//protected internal ์ ๊ทผ ์ ํ์
protected internal static void protected_internal(){}
//private protected ์ ๊ทผ ์ ํ์
private protected static void private_protected(){
//7.2๋ฒ์ ์ผ๋ก ์
๊ทธ๋ ์ด๋ํด์ผ private protected ์ฌ์ฉ ๊ฐ๋ฅ.
}
}
class Demo2 : Demo{
public Demo2(){
Demo.public_method();
Demo.protected_method();
Demo.protected_internal();
Demo.private_protected();
Demo.internal_method();
}
}
class Program{
static void Main(string[] args){
Demo.public_method();
Demo.internal_method();
Demo.protected_internal();
}
}
}
22.08.23(ํ)
[8์ฐจ์ - ์์, 9์ฐจ์ - base ํค์๋์ sealed ํ์ ์]
* ์์: ๋ถ๋ชจ ํด๋์ค๊ฐ ๊ฐ๊ณ ์๋ ๋ณ์, ํจ์ ๋ฑ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ.
* ์ฉ์ด: ์์ or ๊ธฐ๋ฐ(๋ถ๋ชจ) ํด๋์ค, ํ์(์์) ํด๋์ค
namespace InheritEx{
class Parent{
public Parent(){
Console.WriteLine("Parent() ์์ฑ์ ํธ์ถ");
}
~Parent(){
Console.WriteLine("~Parent() ์ข
๋ฃ์ ํธ์ถ");
}
}
class Child : Parent{
public Child(){
Console.WriteLine("Child() ์์ฑ์ ํธ์ถ");
}
~Child(){
Console.WriteLine("~Child() ์ข
๋ฃ์ ํธ์ถ");
}
}
class Program{
static void Main(string[] args){
Child child = new Child();
}
}
}
์ ์ฝ๋ ๊ฒฐ๊ณผ
Parent() ์์ฑ์ ํธ์ถ
Child() ์์ฑ์ ํธ์ถ
~Child() ์ข ๋ฃ์ ํธ์ถ
~Parent() ์ข ๋ฃ์ ํธ์ถ
=> ๋ถ๋ชจ๋จผ์ ์์ฑํ๊ณ ์์์ ์์ฑํ๋ค. ๋ํ, ์์์ ๋จผ์ ์ข ๋ฃํ๊ณ ๋ถ๋ชจ๋ฅผ ์ข ๋ฃํ๋ค.
* ๊ธฐ๋ฐ(๋ถ๋ชจ) ํด๋์ค์ ์ธ์ ์์ฑ์์๊ฒ ํ์(์์) ํด๋์ค๊ฐ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
-> base ํค์๋๋ก ์์๋ฐ์ ์ ์๊ณ ๊ธฐ๋ฐ(๋ถ๋ชจ) ํด๋์ค์ ์ ๊ทผํ ์ ์๋ค.
-> sealed ํค์๋๋ฅผ ์ด์ฉํ๋ฉด ์์์ ๋ด์ธํ๊ฒ ๋์ด ์์์ด ๋ถ๊ฐ๋ฅํ๋๋ก ํด๋์ค๋ฅผ ์ ์ธํ ์ ์๋ค.
namespace InheritEx2{
class Parent{
protected string name;
public Parent(string name){
this.name = name;
Console.WriteLine($"{this.name}.Parnet() ์์ฑ์ ํธ์ถ");
}
~Parent(){
Console.WriteLine($"{this.name}.~Parnet() ์ข
๋ฃ์ ํธ์ถ");
}
public void ParentMethod(){
Console.WriteLine($"{name}.ParentMethod()");
}
}
class Child : Parent{
public Child(string name) : base(name){
Console.WriteLine($"{this.name}.Child() ์์ฑ์ ํธ์ถ");
}
~Child(){
Console.WriteLine($"{this.name}.~Child() ์ข
๋ฃ์ ํธ์ถ");
}
public void ChildMethod(){
Console.WriteLine($"{name}.ChildMethod()");
}
}
class Program{
static void Main(string[] args){
Parent parentA = new Parent("parentA");
parentA.ParentMethod();
Child childA = new Child("childA");
childA.ChildMethod();
}
}
}
์ ์ฝ๋ ๊ฒฐ๊ณผ
parentA.Parent() ์์ฑ์ ํธ์ถ
parentA.ParentMethod()
childA.Parent() ์์ฑ์ ํธ์ถ
childA.Child() ์์ฑ์ ํธ์ถ
childA.ChildMethod()
childA.~Child() ์ข ๋ฃ์ ํธ์ถ
childA.~Parent() ์ข ๋ฃ์ ํธ์ถ
parentA.~Parent() ์ข ๋ฃ์ ํธ์ถ
22.09.15(๋ชฉ)
[10์ฐจ์ - ์์๊ด๊ณ์ ํด๋์ค ํ๋ณํ]
: Casting ์ฐ์ฐ์ -> () ๊ดํธ ์ด์ฉ.
//์์๊ด๊ณ์ ํด๋์ค ์ฌ์ด์์์ ํ๋ณํ
namespace ClassCoversionEx{
class Human{
public void showInfo(){
Console.WriteLine("Human");
}
}
class Programmer : Human{
public void programming(){
Console.WriteLine("ํ๋ก๊ทธ๋๋ฐ ํ๋ ๊ฐ๋ฐ์");
}
}
class Designer : Human{
public void design(){
Console.WriteLine("๋์์ธํ๋ ๋์์ด๋");
}
}
class Program{
static void Main(string[] args){
Human human = new Human();
human.showInfo();
Programmer programmer = new Programmer();
programmer.programming();
programmer.showInfo(); //Human ํด๋์ค๋ฅผ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ ํธ์ถ ๊ฐ๋ฅ
Designer designer = new Designer();
designer.design();
designer.showInfo(); //Human ํด๋์ค๋ฅผ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ ํธ์ถ ๊ฐ๋ฅ
}
}
}
namespace ClassCoversionEx{
class Human{
public void showInfo(){
Console.WriteLine("Human");
}
}
class Programmer : Human{
public void programming(){
Console.WriteLine("ํ๋ก๊ทธ๋๋ฐ ํ๋ ๊ฐ๋ฐ์");
}
}
class Designer : Human{
public void design(){
Console.WriteLine("๋์์ธํ๋ ๋์์ด๋");
}
}
class Program{
static void Main(string[] args){
Human human = new Human();
human.showInfo();
human = new Programmer();// Programmer๋ฅผ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ Human๊ฐ์ฒด๊ฐ Programmer๊ฐ ๋ ์ ์๋ค.
human.showInfo();
Programmer programmer = (Programmer)human;
programmer.showInfo();
programmer.programming();
human = new Designer();
human.showInfo();
Designer designer = (Designer)human;
designer.showInfo();
designer.design();
}
}
}
22.12.02(๊ธ)
[11์ฐจ์ - is ์ฐ์ฐ์์ as ์ฐ์ฐ์]
ํ๋ณํ๊ณผ ๊ด๋ จ๋ ์ฐ์ฐ์: is, as
* as: ํ๋ณํ(์บ์คํฐ)๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ ์ฐ์ฐ์. ํ๋ณํ์ ์คํจํ์ ๊ฒฝ์ฐ null ๊ฐ์ ๋ฆฌํดํ๋ค.
* is: ํด๋น ๊ฐ์ฒด์ Type(ํ)์ด ์ผ์นํ๋์ง ์ฌ๋ถ๋ฅผ bool ๊ฐ์ผ๋ก ๋ณํํ๋ ์ฐ์ฐ์.
namespace AsIsEx{
class Human{
public void ShowInfo(){
Console.WriteLine("Human");
}
}
classs Programmer : Human {
public void Programming(){
Console.WriteLine("์ฝ๋ฉํ๋ ํ๋ก๊ทธ๋๋จธ");
}
}
class Designer(){
public void Design(){
Console.WriteLine("๋์์ธํ๋ ๋์์ด๋");
}
}
class Program{
static void Main(string[] args){
Human human = new Programmer();
Programmer programmer;
if(human is Programmer){
programmer = (Programmer)human;
programmer.Programming();
}
Human human2 = new Designer();
Designer designer = human2 as Designer;
if(designer != nulll) designer.design();
Designer designer2 = human as Designer;
if(designer2 != null) desiginer2.design();
else Console.WriteLine("designer2๋ Designer ํ์ด ์๋๋ค!");
}
}
}
์ถ๋ ฅ๊ฐ:
์ฝ๋ฉํ๋ ํ๋ก๊ทธ๋๋จธ
๋์์ธํ๋ ๋์์ด๋
designer2๋ Designerํ์ด ์๋๋ค!
[12์ฐจ์ - ์ค๋ฒ๋ผ์ด๋ฉ(virtual, override, new)]
* ์ค๋ฒ๋ผ์ด๋: ๋ฉ์๋ ์ฌ์ ์
1) virtual: ๋ถ๋ชจ(๋ฒ ์ด์ค) ํด๋์ค ๋ฉ์๋ ์์ ๋ถ์ด๋ ์ฐ์ฐ์. ์์(ํ์. derived) ํด๋์ค์์ ์ฌ์ ์ ๋ ์ ์๋ค.(์ํด๋ ์๊ด ์์)
2) override: ์์(ํ์) ํด๋์ค ๋ฉ์๋ ์์ ๋ถ๋ ์ฐ์ฐ์. ๋ถ๋ชจ๋ก๋ถํฐ ๋ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ๋ค๋ผ๋ ์๋ฏธ.
์ฌ์ ์ ํ ๋๋ ๋ถ๋ชจ์ ๋ฉ์๋ ์ด๋ฆ๊ณผ ๊ฐ์์ผ ํ๋ค. ํ๋กํ ํ์ ๋ ์ผ์นํด์ผ ํจ!
namespace OverrideEx{
class BaseClass {
public virtual void echo(){
Console.WriteLine("๊ธฐ๋ฐ ํด๋์ค");
}
}
class DerivedClass : BaseClass {
public override void echo(){
Console.WriteLine("ํ์ ํด๋์ค");
}
}
class Program {
static void Main(string[] args){
DerivedClass derivedClass = new DerivedClass();
derivedClass.echo(); // "ํ์ ํด๋์ค" ์ถ๋ ฅ!
}
}
}
* ์ฐธ๊ณ ) virtual, override ํค์๋ ์์ด ์ฌ์ ์ํด์ ์ฌ์ฉ๋ ์ ์์ง๋ง. ๊ฒฝ๊ณ ์ฐฝ์ด ๋จ๊ธฐ๋ ํ๊ณ . ์์น์ ์ง์ผ์ฃผ๋๊ฒ ์ข๋ค.
namespace OverrideEx{
class BaseClass {
public virtual void echo(){
Console.WriteLine("๊ธฐ๋ฐ ํด๋์ค");
}
}
class DerivedClass : BaseClass {
public new void echo(){
Console.WriteLine("ํ์ ํด๋์ค");
}
}
class Program {
static void Main(string[] args){
DerivedClass derivedClass = new DerivedClass();
derivedClass.echo(); // "๊ธฐ๋ฐ ํด๋์ค" ์ถ๋ ฅ!
}
}
}
* ์ฐธ๊ณ ) ํ์ ํด๋์ค์์ new ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ์์ ์ ๋ฉ์๋๋ฅผ ๊ฐ์ถ๊ณ ๋ถ๋ชจ ํด๋์ค์ ์๋ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค. ์ค๋ฒ๋ผ์ด๋ฉ๊ณผ ๋ค๋ฅธ ๊ฐ๋ .
[13์ฐจ์ - ๊ตฌ์กฐ์ฒด(struct), ํํ]
C#์์๋ struct๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด Value Type์ ๋ง๋ค๊ณ class๋ฅผ ์ฌ์ฉํ๋ฉด Reference Type์ ๋ง๋ ๋ค.
int, double, float, bool ํ์ ์ ๊ธฐ๋ณธ(Primitive Type)์ด๋ผ๊ณ ํ๋๋ฐ, struct๋ก ์ ์๋ Value Type์ด๋ค.
Value Type์ ์์๋ ์ ์์ผ๋ฉฐ, ์ฃผ๋ก ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ฐ์ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ค.
Reference Type์ class๋ฅผ ์ ์ํด์ ๋ง๋ค๊ณ , ์์์ด ๊ฐ๋ฅํ๊ณ ์ข ๋ ๋ณต์กํ ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ๋ค์ ์ ์ํ๋ ๊ณณ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
* ๊ตฌ์กฐ์ฒด: struct๋ผ๋ ํค์๋๋ฅผ ์ด์ฉํด์ ์ ์ํ๋ค. ํด๋์ค์ ๊ฐ์ด ๋ฉ์๋, ์์ฑ(ํ๋กํผํฐ) ๋ฑ ๊ฑฐ์ ๋น์ทํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ์์์ ํ ์ ์๋ค. ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธํฐํ์ด์ค(interface) ๊ตฌํ์ ํ ์ ์๋ค.
namespace StructEx{
//๊ตฌ์กฐ์ฒด ์ ์
struct MyPoint{
public int X;
public int Y;
//๊ตฌ์กฐ์ฒด๋ ์์ฑ์๋ฅผ ์ ์ธํ ์ ์๋ค. but ๊ธฐ๋ณธ ์์ฑ์(๋งค๊ฐ๋ณ์๊ฐ ์๋ ์์ฑ์)๋ ์์ฑ ์๋จ!
public MyPoint(int x, int y){
this.X = x;
this.Y = y;
}
//๋ชจ๋ ๊ตฌ์กฐ์ฒด๋ System.Object ํ์์ ์์ํ๋ System.ValueType์ผ๋ก๋ถํฐ ์ง์ ์์๋ฐ์
public string ToString(){
return string.Format($"{X}, {Y}");
}
}
class Program{
static void Main(string[] args){
MyPoint myPoint;
myPoint.X = 100;
myPoint.Y = 100;
Console.WriteLine(myPoint.ToString());//100, 100
MyPoint myPoint2 = new MyPoint(100,1000);
MyPoint myPoint3 = myPoint2;//myPoint2 ๋ณต์ฌ
myPoint3.Y = 1001;
Console.WriteLine(myPoint2.ToString());//1000, 1000
Console.WriteLine(myPoint3.ToString());//1000, 1001
}
}
}
๊ตฌ์กฐ์ฒด๋ ํด๋์ค์ ๋ฌ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋ ๊น์ ๋ณต์ฌ๊ฐ ์ด๋ค์ง๋ค!
* ํํ: ์ฌ๋ฌ ๊ฐ์ ๊ฐ(Field)์ ๋ด์ ์ ์๋ ๊ตฌ์กฐ์ฒด์ ๊ฐ์ ๊ฒ. () ์์ ์ฌ๋ฌ ๊ฐ์ ํ๋๋ฅผ ์ง์ ํ์ฌ ๋ง๋ค ์ ์๋ค.
C# 7.0 ์ด์ ๋ฒ์ ์์๋ ๋ฉ์๋์์ ํ๋์ ๊ฐ๋ง ๋ฆฌํดํ ์ ์์๋ค. C# 7.0 ์ดํ ๋ฒ์ ๋ถํฐ๋ ํํ์ ์ฌ์ฉํด์ ๋ณต์๊ฐ์ ๊ฐ์ ๋ฆฌํดํ ์ ์๊ฒ ๋์๋ค.
namespace TupleEx {
//unnamed tuple ์ ์ธ
var t = (100, 200);
//named tuple ์ ์ธ
var t = (Name: "ํ๊ธธ๋", Id: "120")
class Program{
static void Main(string[] args){
var aa = ("ํ๊ธธ๋", 40);
Console.WriteLine($"{aa.Item1}, {aa.Item2}");//ํ๊ธธ๋, 40
var bb = (Name:"ํ๊ธธ๋ณต", Age:55);
Console.WriteLine($"{bb.Name}, {bb.Age}");//ํ๊ธธ๋ณต, 55
var (name, age) = bb;
Console.WriteLine($"{name}, {age}");//ํ๊ธธ๋ณต, 55
bb = aa; //๊น์๋ณต์ฌ
Console.WriteLine($"{bb.Name}, {bb.Age}");//ํ๊ธธ๋, 40
}
}
}
ํจํค์ง ๊ด๋ฆฌ์ ์ฝ์์์ ํํ ํด๋น ํจํค์ง๋ฅผ ์ค์นํด์ค์ผ ํ๋ค.
PM> Install -Package "System.ValueTuple"
[14์ฐจ์ - ํํ ๋ฆฌํด ํ์ ์ ์ด์ฉํ ๋ฉ์๋ ์ฌ์ฉํ๊ธฐ]
22.12.29(๋ชฉ)
[15์ฐจ์ - ์ธํฐํ์ด์ค ์ดํด]
* ์ธํฐํ์ด์ค
- ๋ฌผ๋ฆฌ์ ์ธ ์ธํฐํ์ด์ค์ ๊ฐ๋ : ๋ค๋ฅธ ๋ ์์คํ ์ฅ์น๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ค๊ฐ ์ ์ ์ฅ์น. ex) ํค๋ณด๋, ๋ง์ฐ์ค, ๋ชจ๋ํฐ ๋ฑ์ด ์ปดํจํฐ์ ์ฐ๊ฒฐ๋์ด ์ฌ์ฉ์์ ์ปดํจํฐ๊ฐ์ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ค.
- ์ฝ๋ ์์์์ ์ธํฐํ์ด์ค ๊ฐ๋ : interface ํค์๋ ์ฌ์ฉํด์ ๋ง๋ ์ผ์ข ์ ๋ช ์ธ์. ๋ ์ํํธ์จ์ด ๊ฐ์ ์ฐ๊ฒฐ์ฅ์น.
* ์ธํฐํ์ด์ค์ ํน์ง
- ์ธํฐํ์ด์ค๋ ํ๋๋ฅผ ํฌํจํ์ง ์๋๋ค. ๋ฉ์๋, ์ด๋ฒคํธ, ํ๋กํผํฐ๋ง์ ๋ฉค๋ฒ๋ก ๊ฐ๋๋ค.
- ์ธํฐํ์ด์ค๋ ๋ชจ๋ ๋ฉค๋ฒ ์ ๊ทผ์ง์ ์๋ public ์ด๋ค. ๋ฐ๋ผ์, ์ ๊ทผ์ ํ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
wyh? ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์์ ๊ตฌํํด์ผ ํ๋๋ฐ ์ ๊ทผ ์ง์ ์๊ฐ ์ค์ ๋์ด ์๋ค๋ฉด ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ธํฐํ์ด์ค๋ ๊ตฌํ๋ถ(๋ชธํต)๊ฐ ์๋ ์ถ์๋ฉค๋ฒ๋ฅผ ๊ฐ๋๋ค.
- ์ธํฐํ์ด์ค๋ ๋ค์ค ์์์ด ๊ฐ๋ฅํ๋ค.
=> ์ธํฐํ์ด์ค๊ฐ ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ์ ์ ์๋ค. ํด๋์ค, ๊ตฌ์กฐ์ฒด์์๋ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ ์๋ค.
=> ์์ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ํด๋์ค๋ ์์, ๋ถ๋ชจ ํจ์๋ฅผ ๋ชจ๋ ๊ตฌํํด์ฃผ์ด์ผ ํ๋ค.
์ธํฐํ์ด์ค ์ ์ธ ๋ฐฉ๋ฒ)
interface ์ธํฐํ์ด์ค๋ช
{
๋ฐํํ์ ๋ฉ์๋๋ช
(๋งค๊ฐ๋ณ์, ..);
...
}
์ฝ๋ ์์)
namespace InterfaceEx{
interface IMyInterfaceA
{
void output();
}
interface IMyInterfaceB
{
void output();
}
class Program : IMyInterfaceA, IMyInterfaceB
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
IMyInterfaceA iA = myClass;
iA.output();
iMyInterfaceB iB = myClass;
iB.output();
}
//์ธํฐํ์ด์ค ์์ ํ ์ ์ธ๋ถ ํ์
void iMyInterfaceA.output(){
Console.WriteLine("A ์ธํฐํ์ด์ค output() ํธ์ถ");
}
//์ธํฐํ์ด์ค ์์ ํ ์ ์ธ๋ถ ํ์
void iMyInterfaceB.output(){
Console.WriteLine("B ์ธํฐํ์ด์ค output() ํธ์ถ");
}
}
}
๊ฒฐ๊ณผ:
A ์ธํฐํ์ด์ค output() ํธ์ถ
B ์ธํฐํ์ด์ค output() ํธ์ถ
[16์ฐจ์ - ์ถ์ํด๋์ค ์ดํด]
* ์ถ์ ํด๋์ค: ์ธํฐํ์ด์ค์ ๋น์ทํ๋ค ํ์ง๋ง, ์ถ์ํด๋์ค๋ ๊ตฌํ(๋ชธํต)๋ถ๋ฅผ ๊ฐ์ง ์ ์๊ณ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง ์๋ ์๋ค.
์ฌ์ฉํ๋ ํ์ ์๋ abstract์ class ๋ฅผ ์ฌ์ฉํ๋ค.
์ถ์ ํด๋์ค๋ ํด๋์ค์ ๋ฌ๋ฆฌ ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ๊ณ ์๋ค.
์ถ์ ํด๋์ค๋ ๋ชจ๋ ๋ฉค๋ฒ์ ์ ๊ทผ ์ ํ์๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ private ์ค์ ๋๋ค.
* ์ถ์ ํด๋์ค ์ ์ธํ์
abstract class ํด๋์ค ๋ช
{
//ํด๋์ค์ ๋์ผ
}
* ์ถ์ ๋ฉ์๋: ์ถ์ ๋ฉ์๋๋ฅผ ์ง์ ํ ๋ abstract ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
์ถ์ ๋ฉ์๋๋ private ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ public, protected, internal, protected internal ์ค์ ํ๋๋ก
์์๋๋๋ก ํ๊ณ ์๋ค.
* ์ถ์ ๋ฉ์๋ ์ ์ธํ์
public abstract void A();
*์์
using System;
namespace Abstract
{
abstract class MyAbstractClass
{
protected void ProtectedMethod()
{
Console.WriteLine("์ถ์ ํด๋์ค์ PotectedMethod ํธ์ถ");
}
public void PublicMethod()
{
Console.WriteLine("์ถ์ ํด๋์ค์ PubicMethod ํธ์ถ");
}
public abstract void AbstractMethod();
}
class Child : MyAbstractClass
{
public override void AbstractMethod()
{
Console.WriteLine("์ถ์ ํด๋์ค์ AbstractMethod ํธ์ถ");
ProtectedMetod();
}
}
class Program
{
static void Main(string[] args)
{
MyAbstractClass myAbstractClass = new MyAbstractClass();
myAbstractClass.AbstractMethod();
myAbstractClass.PublicMethod();
}
}
}
๊ตฌํํด์ผํ ๋ถ๋ถ(abstract method)๊ณผ ๊ตฌํํ์ง ์์๋๋ ๋ถ๋ถ(abstract๊ฐ ์๋ method)์ ์๋ ค์ค ๋ ์ฌ์ฉํ๋ ๊ตฌ์กฐ
[17์ฐจ์ - ํ๋กํผํฐ์ ์ดํด]
* ํ๋กํผํฐ: get, set ์ ๊ทผ์๋ก ๊ฐ์ ์ค์ ํ๊ณ ์ฝ์ด์ค๋ ์์ฑ.
class EmployeeInfo
{
public string Name
{
get
{
return Name;
}
set
{
Name = value;
}
}
}
- C# 7.0 ๋ถํฐ ์๋ ํ๋กํผํฐ ์ง์
class EmployeeInfo
{
public string Name { get; set; }
}
class EmployeeInfo
{
public string Name { get; set; } = "unknown"
}
์ด๊ธฐ๊ฐ ์ง์ ๋ ๊ฐ๋ฅํ๋ค.
class EmployeeInfo
{
public string Name { get; private set; }
}
private set ์ ๋ด๋ถ์์๋ง ๊ฐ์ ์ง์ ํ ์ ์๊ณ ์ธ๋ถ์์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ ๊ฐ์ด๋ผ๋ ๋ป.
- ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๊ฐ์ฒด์ ํ๋๋ฅผ ์ด๊ธฐํํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ(์์ฑ์์ ํ๋กํผํฐ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ)
namespace CshapTest
{
class EmployeeInfo
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
EmployeeInfo employee = new EmployeeInfo() {
Name = "ํ๊ธธ๋"
};
}
}
}
[21์ฐจ์ - ArrayList ์ฌ์ฉํ๊ธฐ]
* Collection(์ปฌ๋ ์ ): ๋ฐ์ดํฐ ๋ชจ์์ ๋ด๋ ์๋ฃ๊ตฌ์กฐ.
ex) ArrayList, Queue, Stack, Hashtable
class Program
{
static void Main(string[] args)
{
int[] array = new int[] { 1, 2, 3, 4 };
Console.WriteLine(array.GetType());
ArrayList arrayList = new ArrayList();
arrayList.Add(1);
arrayList.Add(2);
arrayList.RemoveAt(1); // ํด๋น ์ธ๋ฑ์ค๋ฅผ ์ฐพ์์ ์ ๊ฑฐ
arrayList.Insert(1, 1.2f); // Insert(index, data) // index ์์น์ data ๋ฅผ ์ฝ์
foreach(object obj in arrayList)
{
Console.Write($"{obj} ");
}
}
}
Add ๋ ๋งจ ๋ค๋ก ์ถ๊ฐํ๋ ๊ฒ, Insert ๋ ์์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ.
Collection ์ ๋ชจ๋ ์์๋ค์ object ํ์ ์ด๊ธฐ ๋๋ฌธ์ foreach ๋ฌธ์์ object obj ๊ฐ ๊ฐ๋ฅํ๋ค.
[22์ฐจ์ - Queue, Stack, Hashtable ์ฌ์ฉ]
* Queue: ์ ์ ์ ์ถ(FIFO) ์๋ฃ ๊ตฌ์กฐ.
Enqueue(๋ฐ์ดํฐ ์ ๋ ฅ), Dequeue(๋ฐ์ดํฐ ์ถ๋ ฅ)
class Program
{
static void Main(string[] args)
{
Queue q = new Queue();
q.Enqueue(1);
q.Enqueue(100);
q.Enqueue(200);
q.Dequeue();
q.Enqueue("๊ฐ๋๋ค");
foreach(object obj in q)
{
Console.WriteLine(obj);
}
}
}
100
200
๊ฐ๋๋ค
* Stack: ํ์ ์ ์ถ(LIFO) ์๋ฃ๊ตฌ์กฐ
Push(๋ฐ์ดํฐ ์ ๋ ฅ), Pop(๋ฐ์ดํฐ ์ถ๋ ฅ)
class Program
{
static void Main(string[] args)
{
Stack stack = new Stack();
stack.Push(1);
stack.Push(100);
stack.Push(200);
stack.Pop();
stack.Push("๊ฐ๋๋ค");
foreach(object obj in stack)
{
Console.WriteLine(obj);
}
}
}
๊ฐ๋๋ค
100
1
* Hashtable: Hashing ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ๋ฐ์ดํฐ ๊ฒ์์ด ์ด๋ค์ง๋ ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ.
ํค๋ฅผ ์ด์ฉํด์ ํ๋ฒ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ ์ปฌ๋ ์ ๋ด์ ์ฃผ์๋ฅผ ๊ณ์ฐํด ๋ธ๋ค.
class Program
{
static void Main(string[] args)
{
Hashtable hashtable = new Hashtable();
hashtable["Apple"] = "์ฌ๊ณผ";
hashtable["Banana"] = "๋ฐ๋๋";
foreach(DictionaryEntry obj in hashtable)
{
Console.WriteLine($"{obj.Key} {obj.Value}");
}
}
}
Banana ๋ฐ๋๋
Apple ์ฌ๊ณผ
[23์ฐจ์ - ์ปฌ๋ ์ ์ด๊ธฐํ, ์ธ๋ฑ์]
class Program
{
static void Main(string[] args)
{
//์ปฌ๋ ์
์ด๊ธฐ์๋ฅผ ์ด์ฉํ ์ด๊ธฐํ ๋ฐฉ๋ฒ - stack, queue๋ ์ด์ฉํ ์ ์์
ArrayList arrayList1 = new ArrayList() { 10, 20, 30 };
//๋ฐฐ์ด์ ์ด์ฉํ ์ด๊ธฐํ ๋ฐฉ๋ฒ
int[] array = { 11, 22, 33, 44 };
ArrayList arrayList2 = new ArrayList(array);
Stack stack = new Stack(array);
Queue queue = new Queue(array);
//Hashtable ์ Dictionary Initialiser๋ฅผ ์ด์ฉํ๋ค.
Hashtable hashtable = new Hashtable() {
["Seoule"] = "์์ธ", //{"Seoule", "์์ธ"} ์ด๋ฐ ํํ๋ ๊ฐ๋ฅ
["Busan"] = "๋ถ์ฐ", //{"Busan", "๋ถ์ฐ"} ์ด๋ฐ ํํ๋ ๊ฐ๋ฅ
};
}
}
//์ธ๋ฑ์
[24์ฐจ์ - yield ํค์๋]
* Enumerator(Iterator): ์งํฉ์ ์ธ ๋ฐ์ดํฐ์ ์ผ๋ก ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํธ์ถ์์๊ฒ ๋ณด๋ด์ฃผ๋ ๊ธฐ๋ฅ. ๋ฐ๋ณต์.
IEnumerator ๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
* yield ํค์๋: ํธ์ถ์์๊ฒ ์ปฌ๋ ์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ๋ฆฌํดํ ๋ ์ฌ์ฉํ๋ ํค์๋
- yield return: ์ปฌ๋ ์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ๋ฆฌํดํ๋๋ฐ ์ฌ์ฉ
- yield break: ๋ฆฌํด์ ์ค์งํ๊ณ Iteration ๋ฃจํ๋ฅผ ๋น ์ ธ ๋์ฌ ๋ ์ฌ์ฉ
์ปฌ๋ ์ ํด๋์ค๋ Enumeration ์ด ๊ฐ๋ฅํ ํด๋์ค ์ธ๋ฐ, ์ด๋ฌํ ํด๋์ค๋ค์ Enumerable ํด๋์ค๋ผ๊ณ ํ๋ค.
์ด Enumerable ํด๋์ค๋ IEnumerable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
IEnumerable ์ธํฐํ์ด์ค๋ GetEnumerator() ๋ฉ์๋ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ปฌ๋ ์ ํ์ ์ด๋ Enumerable ํด๋์ค์์ GetEnumerator() ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ผ๋ก yield ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
GetEnumerator() ๋ฉ์๋์์ yield return ์ฌ์ฉํ๋ฉด ์ปฌ๋ ์ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ํ๋์ฉ ๋๊ฒจ์ฃผ๋ ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์๊ณ ๋ฆฌํดํ์ ์ IEnumerator ์ธํฐํ์ด์ค๋ฅผ ๋ฆฌํดํ ์ ์๋ค.
class MyList
{
private int[] data = { 1, 2, 3, 4, 5 };
public IEnumerator GetEnumerator()
{
int i = 0;
while (i < data.Length)
{
yield return data[i];
i++;
}
}
}
'๐ฎ Unity Study > C#' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C#] Action ๊ณผ Func (feat. Delegate, callback) (0) | 2023.08.16 |
---|---|
[C#] List ๊ฐ์ Enumerable ํด๋์ค์์ ์ฌ์ฉํ ์ ์๋ ํจ์๋ค (0) | 2023.04.26 |
C# Code Convention (0) | 2022.10.13 |
[KLA ๋ฉํฐ์บ ํผ์ค] C#7.0 ์ ๋๋ก ๋ฐฐ์ฐ๊ธฐ Part.1(์ ๋ฌธ1) (0) | 2022.07.14 |
[C#] string.Format() ์ฌ์ฉ๋ฒ (feat. ์ซ์ ์์ 0์ฑ์ฐ๊ธฐ, ์์์ ์๋ *์๋ฆฌ๊น์ง ํ๊ธฐํ๊ธฐ) (0) | 2022.05.10 |