클래스

강성현
∙∙조회 4
클래스

클래스(Class)란?

데이터와 동작을 함께 담아 새로운 형식을 만드는 문법 입니다.

★ 클래스는 ==참조타입==입니다.

  • 인스턴스를 만들때는 반드시 new 가 필요합니다.

 

1. 클래스

csharp
class Program
{
    static void Main(string[] args)
    {
        Monster slime = new Monster(); // 인스턴스 생성 

        slime.Name = "슬라임";
        slime.Health = 100;

        Monster goblin = slime;
        goblin.Name = "고블린";
        goblin.Health = 200;

        slime.PrintInfo();
        goblin.PrintInfo();
    }
}

public struct Monster // 구조체 : 얕은 복사 (값 타입)
{
    public string Name;
    public int Health;

    public void PrintInfo()
    {
        Console.WriteLine($"{Name} 체력 : {Health}");
    }
}

public class Monster // 클래스 : 깊은 복사 (참조 타입)
{
    public string Name;
    public int Health;

    public void PrintInfo()
    {
        Console.WriteLine($"{Name} 체력 : {Health}");
    }
}

 

1-1) 클래스 다이어그램

클래스와 클래스 간의 관계, 그 안에서 사용되는 객체 타입을 정의하고, 그 관계들을 표현한 다이어그램입니다.

 


2. 접근 제한자

멤버를 어디까지 공개할지 정하는 키워드입니다.

접근 제한자접근할 수 있는 범위
public어디서든
private같은 클래스 안에서만
protected같은 클래스와 그 클래스를 물려받은 클래스에서
internal같은 프로젝트 안에서
  • 접근제한자를 적지 않는다면 기본은 private로 선언된다.

 


3. 생성자

구조체와 동일하게 인스턴스가 생성될때 호출되는 메서드(함수)입니다.

csharp
class Program
{
    static void Main(string[] args)
    {
        Monster goblin = new Monster("고블린", 100);
    }
}

public class Monster
{
    public string Name;
    public int Hp;
    
    public Monster(string name, int hp)
    {
        Name = name;
        Hp = hp;
    }
}

 


4. 소멸자

인스턴스가 메모리에서 사라질때 호출되는 메서드(함수)입니다.

  • 문법형태

~< 클래스 이름 > ( ) { }

 

  • C#의 경우는 인스턴스를 정리하는 일은 가비지 컬렉터(garbage Collector) 라는 기능이 맡고 있어
    인스턴스가 메모리에서 해제되는 타이밍을 정확하게 알 수 없기 때문에 사용할 일은 별로 없다.

 


5. 프로퍼티

public으로 열어 놓기에는 리스크가 있거나,

데이터를 언제 가져가고 수정하였는지 디버깅할때 유용하게 사용할 수 있다.

get은 값을 읽을 때, set은 값을 넣을때 실행됩니다.

밖에서 넘어온 값을 set 안의 value 라는 이름으로 받습니다. 따로 선언하지 않아도 사용 가능합니다.

csharp
class Program
{
    static void Main(string[] args)
    {
        Monster mon = new Monster();
        mon.MoveSpeed = 10f;
        
        mon.Level = 1;
    }
}

public class Monster
{
    private string Name;
    public int Health;
    private float _moveSpeed;

    public float MoveSpeed { get; set; } // 자동구현 프로퍼티

    private int _level;

    public int Level
    {
        get
        {
            return  _level;
        }
        set
        {
            _level = value;
        }
    }
}

 

  • 밖에서 데이터를 가져가는건 허락하지만 세팅은 못하도록 막을 때
csharp
public float MoveSpeed { get; private set; }

// or 

public int Level
    {
        get
        {
            return  _level;
        }
        private set
        {
            _level = value;
        }
    }

 


6. static 멤버

static 멤버는 클래스 전체에 하나만 존재하는 멤버입니다.

csharp
class Program
{
    static void Main(string[] args)
    {
        Monster mon1 = new Monster();
        Monster mon2 = new Monster();
        
        mon1.Spawn();
        mon2.Spawn();

        // Console.WriteLine(mon1.Count); // 에러
        // Console.WriteLine(mon2.Count); // 에러

        Console.WriteLine(Monster.Count); // 출력 : 2

        mon1.PrintInfo(); // 출력 : 2 
                          // static으로 선언된 Count는 Monster 클래스 전역변수로 
                          // Monster 변수들이 개인으로 가지고 있는 Count 값은 없다.
    }
}

public class Monster
{
    public static int Count = 0;

    public void PrintInfo()
    {
        Console.WriteLine(Count);
    }

    public void Spawn()
    {
        Count++;
    }

    public void DiSpawn()
    {
        Count--;
    }
}

 

static 생성자

static 생성자는 기존 생성자보다 빠르게 호출된다.

호출타이밍 : 인스턴스 생성, 해당 클래스 메소드 접근 시

csharp
public class Monster
{
    public static int Count = 4;

    public Monster()
    {
        Console.WriteLine("생성자");
    }

    static Monster()
    {
        Console.WriteLine("static 생성자");
    }

    public static void AddMonsterCount()
    {
        Count++;
    }
}

 

  • 경우 1
csharp
Monster mon1 = new Monster();
Monster mon2 = new Monster();
Console.WriteLine(Monster.Count);

출력 : 
static 생성자
생성자
생성자
4
  • 경우 2
csharp
Console.WriteLine(Monster.Count);
Monster mon1 = new Monster();
Monster mon2 = new Monster();  

출력 : 
static 생성자
4
생성자
생성자
  • 경우 3
csharp
Monster.AddMonsterCount();
Monster mon1 = new Monster();
Monster mon2 = new Monster();
Console.WriteLine(Monster.Count);

출력 : 
static 생성자
카운트 증가
생성자
생성자
5