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
키워드 사용
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(인수)
를 붙여 생성자를 호출할 수 있음.
예를 들어, 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
*/