안녕하세요!
오늘도 게임개발자가 되기위해 공부하고 있는 구구입니다.
오늘도 C#의 클래스에 대해 알아보도록 하겠습니다.
- new 키워드
클래스명 객체명 = new 생성자
ex) AA aa new AA();
- 클래스의 객체 생성
- 생성자, 소멸자
- 생성자
- 객체 생성할 때 호출(new)
- 클래스 명 동일
- 리턴형 x
- 접근 한정자 public
- 멤버변수 초기화
- 객체 생성시 자동으로 처리하는 것들
- 소멸자
- 객체가 소멸될 때 호출(Garbage collector)
- 클래스명 동일
- 리턴형 x
- 접근 한정자 x
- '~'키워드로 구성


우선 class AA가 있는데 거기서 생성자가 현재 총 3개가 만들어졌습니다.
public AA()
public AA(int _a)
public AA(int _a, float _f)
파라미터가 없는 생성자의 경우는 기본적으로 아무 생성자도 만들지 않을 경우 자동으로 생성됩니다. 하지만 지금처럼 생성자를 여러개 만들 경우 파라미터가 없는 생성자(public AA())는 자동으로 생성되지 않기 때문에 만약 우리가 사용하고 싶다면 위의 코딩처럼 따로 설정을 해주어야 합니다.
new라는 키워드를 이용해서 class AA의 객체를 생성했습니다. 각각 AA클래스의 있는 생성자 3개를 만들었습니다.

여기서 Call Constuctor가 나오는 경우와 Call Dstructor가 나오는 경우를 보시면 좋을것 같습니다.
우선 Call Constuctor의 경우는
AA aa = new AA();
AA bb = new AA(10);
AA cc = new AA(10, 100);
에서 각각 1번씩 객체를 생성하면서 생성자 내에 있던 WriteLine 함수가 작성한 것입니다.
Call Dstructor의 경우는 따로 호출하지 않았지만 함수가 끝나면서 자동으로 소멸자가 자동으로 GC를 call해서 소멸시킵니다.
- this 키워드
- 객체 자신을 참조하는 키워드
- 사용처
- 함수의 파라미터 이름과 멤버변수 이름이 동일
- 클래스 내부에서 멤버변수를 접근

여기서 많은 a가 나오는데 a를 this를 이용해서 구분하는게 중요합니다. 우선
Class AA 후 바로 선언된 int a는 private 속성의 변수입니다. class AA내에서 사용되는 변수로 멤버변수 입니다.
그리고 생성자나 함수에서 이 멤버변수를 지목해야 될때 우리는 this라는 키워드를 사용해서 가리킵니다.
생성자는 public AA(int a)입니다. 그리고 여기서 this.a = a;라는 부분을 보면
this.a는 class AA에서 멤버변수로 선언된 a, = a 에서 a는 public AA(int a)에서 언급된 파라미터 int a를 뜻합니다.
public void Print() 함수에서 처음에 바로 this.a를 출력하는데 이 this.a는 아마 처음 클래스를 생성할때 생성자에 파라미터에 의해 결정될 것입니다.(this.a = a이기 때문)
하지만 그 이후 새로운 int a = 100; 이라고 새롭게 함수 내에서 a라는 변수를 선언하게 되면 아무언급이 없을 시 a는 함수 내에서 선언된 a를 지칭하게 됩니다.(즉, this.a 와는 다른 새로운 a가 됨)

※this()의 사용
같은 클래스의 다른 생성자를 호출할때 사용

위 처럼 this()는 AA()를 가리킵니다.(즉, name에 관한 내용을 다른 생성자에서 쓸 필요없이 위처럼 표기하면 됨)
만약 AA(int a) 생성자를 부를려면 this(a) 로 부를 수 있음.
- static 키워드
- 클래스의 필드와 메소드를 객체 생성없이 사용가능(new 없이 사용가능)
- 클래스 static 필드(변수)
- 클래스 static 메소드(함수)
- static 메소드 내부에 사용하는 변수는 반드시 static
※ readonly int a = 100; = 읽기전용 변수 a = 100이다.(a=100이란 값을 변경할 수 없다)


static을 이용한 변수 및 함수는 객체 생성 없이 바로 접근가능합니다.
하지만 그렇지 않은 경우는 기존의 new를 이용한 객체생성을 해야지만 접근 가능합니다.

- 클래스의 메소드 활용
- 클래스가 메소드의 파라미터로 사용가능
- 클래스가 메소드의 리턴형
※ class를 파라미터로 쓰게 되면 call by reference


CopyRefClass(AA aa)의 경우 refAA라는 객체에 aa라는 객체를 넣어서 call by reference가 됩니다.
그래서 값을 변경하게 될 경우 refAA값을 바꾸면 aa의 값도 바뀌게 됩니다.
CopyDeepClass(AA aa)의 경우 tempAA라는 새로운 객체를 만들고 그 객체의 변수들에 값을 집어넣었기 때문에
Call by Value가 됩니다.

오늘은 여기까지 하도록 하겠습니다.
'게임 개발 공부 > C#' 카테고리의 다른 글
C# 클래스 4 (0) | 2021.12.11 |
---|---|
C# 클래스 3 (0) | 2021.12.10 |
C# 클래스 1 (0) | 2021.12.08 |
C# 함수& 배열 문제 풀이 2 (0) | 2021.12.07 |
C# 함수& 배열 문제 풀이 1 (0) | 2021.12.06 |
댓글