class - 2

이진호·2023년 12월 1일

C#... 그리고 Unity

목록 보기
7/15

return class... :<

  • 외부 클래스에 접근시에는 '인스턴스'를 생성하고
    '멤버 접근 연산자'(new 연산자)를 사용하여 접근 한다.
<멤버 접근의 예시>
Animal animal = new Animal();
// Animal = 클래스
// animal = 인스턴스
// new Animal(); = 멤버 접근 연산자(new 연산자)

멤버

  • 메소드
    • 오버로딩
      메소드는 동일한 이름으로 여러개를 만들 수도 있다. 단, 이름이 같을 경우 매게변수, 공개수준등으로 각각의 시그니처를 설정하여서 메소드 호출시 구분하여 사용할 수 있다.
  • 프로퍼티
    클래스를 사용하는 이유는 사용자가 매번 같은 기능을 동작할때마다 데이터를 직접 건들지 않고, 구현해둔 메소드를 사용하기 위함이지만, 상황에 따라서는 사용자가 데이터를 변경해야되는 경우가 있다. 이럴때 사용하는것이 프로퍼티이다.
    • getter (접근자)
      • 값을 반환
    • setter (설정자)
      • 값을 저장

<프로퍼티 사용예시>
public int age { get; set;}
//public = 공개수준
//int = 타입, 다른 타입도 가능하다
//age = 객체명
// { get; set;} = 접근자와 설정자, 접근자와 설정자 앞에 private을 선언하여 접근을 제한할 수 있다.
  • readonly (읽기전용)
    const와 readonly는 상수라는 동일한 개념은 같지만.
    const는 컴파일 시점에 상수값으로 정해져있어야 하기 때문에, 선언과 동시에 초기화를 해야하고, readonly는 런타임 시점에 결정하기 때문에 선언시 또는 생성자가 초기화하여 사용할 수 있다.
<readonly 사용예시>

private readonly int _age;
public 생성자(int s)
{
	_age = s;
}
//위와 같이 생성자가 초기화할 수 있다.

얕은 복사와 깊은 복사

<사용예시_1-1>
class Damage
{
    public int _water;
    public int _fire;
}

class Player
{
    static void Main()
    {
        Damage gun = new Damage();
        gun._water = 10;
        gun._fire = 20;

        Damage pick = gun;
        pick._water = 20;
        pick._fire = 30;

        Console.WriteLine($"{gun._water}, {gun._fire}");
        Console.WriteLine($"{pick._water}, {pick._fire}");
    }
}
//output: 20,30과 20,30으로 출력된다.
-인스턴스로 생성한 pick은 Damage 클래스에 gun의 참조주소를 가져오기 때문에 pick은 gun으로 생성한 인스턴스와 같은 참조를 가르킨다. 
결국 pick._water = gun._water으로 같은 객체로 인지하면된다.
※추가로 gun은 bob을 참조하고 있기때문에 gun에 대한 참조가 없어지므로 가비지 컬렉터가 수거한다.

변경된 값으로 고정되어야 하는 것이 아닌 매번 새로운 계산을 위하는것이라면, 메소드를 추가하여야 한다.

<사용예시_1-2>
Damage pick = Damage();
//위와 같이 메소드를 수정하는 경우 *output: 10,20과 20,30으로 출력된다.

<사용예시_1-1>에서 인스턴트를 수정한 내용이다.
위와 같이 메소드를 추가하는 경우 *output: 10,20과 20,30으로 출력된다.

this 포인터

하나의 클래스에서 같은 멤버를 호출하여 인스턴스의 값이 변경되는 경우 동일한 멤버를 호출한 정보가 다같이 변경이 된다면..? 클래스를 사용하는 이유가 급격하게 줄어들 것이다. 하.지.만 이를 방지 하는것이 this포인터 이다. 각 인스턴스를 독립시켜준다.

  • this 포인터는 static(적정멤버)에서는 사용이 불가하다.
    static 한정자는 class자체에 속하게 되기 때문에 해당 멤버는 인스턴스없이 직접 호출하여 사용한다.
profile
콜라 없는 내 인생은 김빠진 콜라

0개의 댓글