C#프로그래밍 05 : 클래스

LeeWonjin·2022년 3월 30일
0

[학부]C#프로그래밍

목록 보기
5/21

선언, 생성, 사용

Person은 클래스
Name, Age는 필드
printInfo는 메소드

	class Person
	{
		public string Name;
		public int Age;

		public void printInfo()
		{
			Console.WriteLine($"{Name} {Age}");
		}
	}

	class Program {
		static void Main(string[] args) {
			Person wonjin = new Person();
			wonjin.Name = "wonjin";
			wonjin.Age = 25;
			wonjin.printInfo(); // wonjin 25

			Console.WriteLine(wonjin.Name); // wonjin
			Console.WriteLine(wonjin.Age); // 25
		}
	}

생성자

	class Person
	{
		// 생성자 1
		public Person() {
			Name = "no name";
			Age = 0;
        }

		// 생성자 2
		public Person(string name, int age)
		{
			Name = name;
			Age = age;
		}

		public string Name;
		public int Age;

		public void printInfo()
		{
			Console.WriteLine($"{Name} {Age}");
		}
	}

	class Program {
		static void Main(string[] args) {
			Person wonjin = new Person();
			wonjin.printInfo(); // no name 0

			Person lee = new Person("lee", 123);
			lee.printInfo(); // lee 123
		}
	}

종료자

언제 실행될 지 장담할 수 없다. GC에 의해 호출된다.

	class Person
	{
		// 종료자
		~Person()
        {
			Console.WriteLine("종료자");
        }

		public string Name;
		public int Age;

		public void printInfo()
		{
			Console.WriteLine($"{Name} {Age}");
		}
	}

	class Program {
		public void createObject()
        {
			Person wonjin = new Person();
			Console.WriteLine("created");
		}
		static void Main(string[] args) {

			Program objobj = new Program();
			objobj.createObject();
			GC.Collect();
			GC.WaitForPendingFinalizers(); 
		}
	}
    
  /*
  created
  종료자
  */
  

객체 복사

얕은 복사

객체 사이 얕은 복사는 스택에 있는 (힙을 가리키는) 참조를 복사

class Something
{
    public int x;
    public int y;

    public Something(int _x, int _y)
    {
        x = _x;
        y = _y;
    }
}
class Program {
    static void Main(string[] args) {
        Something a = new Something(5, 3);
        Something b = a;

        Console.WriteLine($"a.x : {a.x}, a.y : {a.y}"); // a.x : 5, a.y : 3

        a.x = 55555;
        Console.WriteLine($"a.x : {a.x}, a.y : {a.y}"); // a.x : 55555, a.y : 3
        Console.WriteLine($"b.x : {b.x}, b.y : {b.y}"); // b.x : 55555, b.y : 3
    }
}

깊은 복사

멤버를 하나하나 복사. 힙영역을 공유하지 않음.

class Something
{
    public int x;
    public int y;

    public Something(int _x, int _y)
    {
        x = _x;
        y = _y;
    }

    public Something deepcopy()
    {
        return new Something(this.x, this.y);
    }
}
class Program {
    static void Main(string[] args) {
        Something a = new Something(5, 3);
        Something b = a.deepcopy();

        Console.WriteLine($"a.x : {a.x}, a.y : {a.y}"); // a.x : 5, a.y : 3

        a.x = 55555;
        Console.WriteLine($"a.x : {a.x}, a.y : {a.y}"); // a.x : 55555, a.y : 3
        Console.WriteLine($"b.x : {b.x}, b.y : {b.y}"); // b.x : 5, b.y : 3
    }
}

this

this 키워드

객체 내에서 자기 자신의 멤버에 접근할 때 this키워드 사용

    class Something
    {
        public int x;
        public int y;

        public Something(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public Something deepcopy()
        {
            return new Something(this.x, this.y);
        }
    }

this() 생성자

생성자 뒤에 : this(인수)를 붙여 생성자를 호출할 수 있음.

예를 들어, public A(int y, int z) : this(y) {...}라는 생성자를 호출할 경우

  • A(int y){}생성자를 먼저 실행하고,
  • 그 다음에 A(int y, int z){}생성자를 호출함.
class A
{
    int x, y, z;
    public A()
    {
        this.x = 5425; 
        Console.WriteLine("A()");
    }

    public A(int y) : this()
    {
        this.y = y;
        Console.WriteLine("A(int y)");
    }
    public A(int y, int z) : this(y)
    {
        this.z = z;
        Console.WriteLine("A(int y, int z)");
    }
    public void print()
    {
        Console.WriteLine($"x:{x} y:{y} z:{z}\n\n");
    }

}
class Program {
    static void Main(string[] args) {
        A a = new A();
        a.print();
        A b = new A(5);
        b.print();
        A c = new A(5, 3);
        c.print();
    }
}
/*
A()
x:5425 y:0 z:0


A()
A(int y)
x:5425 y:5 z:0


A()
A(int y)
A(int y, int z)
x:5425 y:5 z:3
*/
profile
노는게 제일 좋습니다.

0개의 댓글