C# 공부정리 - 클래스 2 (this, static)
this
객체 자신을 참조하기 위한 키워드다.
class AA{
int a;
public AA (int a){
this.a = a;
}
}
위 예시에서, this.a = a 에서 this.a는 어디의 a를 나타내는 것이고
오른쪽의 a는 어디의 a를 나타내는 것일까?
this 키워드가 붙은 쪽은 클래스에 선언된 a를 뜻하고 그렇지 않은 쪽은 생성자의 파라미터를 말한다.
static
지금까지 줄창나게 나왔지만 정작 설명은 안해줬던 그 키워드다.
static이란 클래스의 멤버를 객체 생성없이 사용 가능하게 해준다.
여기서 멤버란 필드와 메소드로 구성된 것을 말한다.
class AA
{
public static int a;
public static int b;
public int c;
//정적 함수는 반드시 정적 변수만 참조 가능
public static void Print() {
Console.WriteLine("a: {0}", a);
Console.WriteLine("b: {0}", b);
//Console.WriteLine("c: {0}", c); //불가능
}
}
class BB
{
public int a;
public int b;
public void Print() {
Console.WriteLine("a: {0}", a);
Console.WriteLine("b: {0}", b);
}
}
위 코드에서 클래스 AA와 BB가 있는데
AA는 static이 있고 BB는 없다.
여기서, AA 클래스의 c에는 static이 없는데, 이 때문에 아래 Print함수에서 사용하지 못하는 것을 볼 수 있다.
즉, static 함수는 static 변수만 참조할 수 있다.
이제 이 두 클래스를 써보자
class Program
{
static void Main(string[] args) {
AA.a = 10;
AA.b = 100;
AA.Print();
//BB.a //new를 통해 객체생성을 하지 않았기에 사용불가
//BB.b
//BB.Print();
BB bb = new BB();
bb.a = 100;
bb.b = 200;
bb.Print();
}
}
static으로 만들어진 클래스는 new를 사용한 객체생성 없이 사용할 수 있다.
이 때문에 AA.a를 바로 접근할 수 있는 반면
BB.a는 new를 사용해 객체생성을 하기 전까지는 사용할 수 없다.
클래스 활용
클래스는 파라미터나 리턴으로 사용할 수 있다.
class AA
{
public int a;
public int b;
public AA() {
a = 0;
b = 0;
}
public void Print() {
Console.WriteLine(a);
Console.WriteLine(b);
}
}
class Program
{
static void Main(string[] args) {
AA aa = new AA();
aa.Print();
CopyRefClass(aa);
aa.Print();
AA aaa = CopyDeepClass(aa);
aaa.Print();
aa.Print();
}
static void CopyRefClass(AA aa) {
AA refAA = aa;
refAA.a = 100;
refAA.b = 10000;
}
static AA CopyDeepClass(AA aa) {
AA tempAA = new AA();
tempAA.a = aa.a;
tempAA.b = aa.b;
tempAA.a = 0;
return tempAA;
}
}
코드가 뭔가 길다.
그러나 천천히 살펴보자
AA 클래스는 a값과 b값을 출력하는 역할을 한다.
메인 함수에서는 AA 클래스를 객체생서을 하고 Print 함수를 실행해 a값과 b값을 출력한다.
이후 CopyRefClass함수로 aa를 복제하는데 CopyRefClass는 여기서 값을 바꾸면
원본 값도 바뀌도록 주소를 가져와 값을 부여하고 있다.
이번엔 CopyDeepClass함수로 aa를 복제하는데 생성자를 통해 복제를 하는 것을 볼 수 있다.
생성자로 복제한 이후 복제된 a값과 b값에 각각 aa.a의 값과 aa.b의 값을 넣어주고 있는데
이 값들은 이미 바로 위에서 100과 10000으로 바뀌었기 때문에 여기서도
a엔 100, b에는 10000이 들어간다.
그러나 마지막에 a값을 0으로 해주었으니 결과적으로 0, 10000이 된다.
자, 마지막으로 Main함수에서 다시 Print 함수를 실행한다.
그러자 이번엔 100, 10000이 찍히는 것을 알 수 있다.
위 코드를 실행하면 그 결과는 다음과 같다.
맨 처음에는 a와 b가 둘 다 0이었으니 0과 0이 찍힌다.
그러나 다음에서 a값과 b값의 원본을 100과 10000으로 바꾸어주었다,
그 다음에는 AA의 사본을 만들어서 편집을 했고
때문에 원본 값은 바뀌지 않고 사본값만 노출된다.(0, 10000)
마지막으로 원본 값을 다시 확인해보니
바뀌지 않은 것을 알 수 있다.