본문 바로가기

C# 개인 공부 기록용/어소트락 게임아카데미 - C# 무료강의[2019] 총48강

[C# 강의 13화, 14화] !중요! 맴버함수의 기본개념 , static 함수 & static class

[C# 강의 13화] !중요! 맴버함수의 기본개념

출처 : https://www.youtube.com/watch?v=VmWXZCu1z6k&list=PL4SIC1d_ab-Y-bBKojxhtFWwNpawMM1h5&index=13

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// static

//몬스터가 100마리 죽으면 뭔가를 하기로 했다.
class Monster
{
    static int MonsterDeathCount; 

    public void Death()
    {
        MonsterDeathCount += 1;
    }
}

class Player
{
    // 일반적인 멤버변수와 다른점
    // static을 붙이게 되면
    // 이런 경우 정적 멤버변수라고 합니다.
    // 정적 멤버변수는 일반적인 멤버변수와 다르게
    // 객체화를 하지 않고도 사용할 수 있다
    // 그 사용법이 클래스의 이름만으로 사용할 수가 있다.
    public static int PlayerCount = 0;

    public int AT = 10;
    public int HP = 100;

    // 정적 멤버변수는 클래스 내부 안에서는 사용이 가능하다.
    public void Setting(int _AT, int _HP)
    {
        // 왜냐하면 이건 공통
        PlayerCount = 100;

        AT = _AT;
        HP = _HP;
    }
}

namespace Static
{
    class Program
    {
        static void Main(string[] args)
        {
            // 플레이어를 3번 new 하게 되면
            // 플레이어가 3개 생긴것이고
            // 그 3개의 플레이어는 각각의 HP를 가지고 있다.
            Player NewPlayer1 = new Player();
            Player.PlayerCount += 1;
            Player NewPlayer2 = new Player();
            Player.PlayerCount += 2;
            Player NewPlayer3 = new Player();
            Player.PlayerCount += 3;

            // 객체들을 토오해서 정적 멤버변수를 사용할 수는 없다.
            // NewPlayer3.PlayerCount
            // NewPlayer3.PlayerCount를 가져올 수도 있지도 않다.

            // 이런식으로 객체화를 전혀 하지 않고 사용할 수 있는 녀석.
            // 정적 멤버변수라고 부르고 이런 정적 멤버변수는
            // 데이터 영역에 들어가게 된다

            // 이 멤버변수라고 하는 녀석은 각각 존재한다.

            // 정적 멤버변수는
            // 어떤 크랠스가 공유하고 싶은 값
            // 몬스터 클래스라면
            // 현재 존재하는 모든 몬스터의 수
            // 객체를 아무리 만들어도
            // 정적 멤버는 그 객체와의 관련성은
            // 객체 내부에서 사용할 수 있다 뿐이지
            // 객체의 개수만큼 만들어지는 것은 아니다.
            // 즉 모든 객체가 공유하는 하나의 변수가 되어준다
            NewPlayer1.HP = 1010000;

            NewPlayer1.Setting(10, 100);
            NewPlayer1.Setting(20, 50);
            NewPlayer1.Setting(100, 500);

            Monster NewMonster1 = new Monster();
            Monster NewMonster2 = new Monster();
            Monster NewMonster3 = new Monster();

            // 모든 객체가 값을 공유할 필요가 있는 데이터를 정의하는데 사용한다.
            NewMonster1.Death();
            NewMonster2.Death();
            NewMonster3.Death();

        }
    }
}

 

static

- static이 붙지 않은 멤버 변수들은 멤버 변수라고 불리며 이녀석들은 객체 하나하나가 자신의 것을 가진다.
- 정적 멤버 변수는 객체에 귀속된 것이 아니라 클래스 그 자체에 귀속이 되고 데이터 영역에 메모리가 올라간다.
- ex) 게임내에서 하나만 존재하며 일반적으로 클래스 내부에서 모든 객체가 공유하고 싶은 변수를 만들때 사용한다.


[C# 강의 14화] static 함수 & static class

출처 : https://www.youtube.com/watch?v=OP0Io2YpyWQ&list=PL4SIC1d_ab-Y-bBKojxhtFWwNpawMM1h5&index=14

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

public class Player
{
    // 객체화를 하지 않아도 플레이어의 내부는 내부이므로
    // 접근제한 지정자에 영향을 받지 않는다.
    public static void PVP(Player _Left, Player _Right)
    {
        _Left.HP -= _Right.AT;
        _Right.HP -= _Left.AT;
    }

    // public static void PVE(Player _Left, Monster _Right)
    // {
    //     _Left.HP -= _Right.AT;
    //     _Right.HP -= _Left.AT;
    // }

    private int HP = 100;
    private int AT = 100;

    public void Damage(int _Damage)
    {
        HP -= 100;
    }

    public void Damage(Player _Other)
    {
       // 자기 자신의 레퍼런스는 자신의 내부에서 모두 public인 상태다
        HP -= 100;
    }
}

public class Monster
{
    // 사용 할 수 없다!
    // public static void PVP(Player _Left, Player _Right)
    // {
    //     _Left.HP -= _Right.AT;
    //     _Right.HP -= _Left.AT;
    // }
}

namespace StaticFunc
{
    class Program
    {
        // 이녀석도 클래스에 속한 정적 함수이다.
        // 어떤 클래스에 존재하는 Main의 이름을 가진
        // 정적멤버함수에서부터 C# 프로그램은 시작한다.
        static void Main(string[] args)
        {
            // F12를 누르면 그 클래스로 타고 들어가볼 수 있다.
            // 타고 들어간다는 것은 그 클래스의 세부 내용을 기록된 곳으로 간다.
            Console.WriteLine("static 함수 배우고 있어요");

            // Player NewPlayer1 = new Player();
            // Player NewPlayer2 = new Player();

            // 마찬가지로 그 클래스에 속하지만
            // 객체를 굳이 만들지 않고도 사용할 수 있는
            // 함수를 정적 멤버 함수라고 한다.
            // Player.PVP(NewPlayer1, NewPlayer2);
            // NewPlayer1.Damage(100);

            // public인 멤버변수라고 이렇게 사용해야 한다.
            // NewPlayer.
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// 정적 클래스란
// 정적 멤버변수와 정적 멤버함수만을 가질수 있는 클래스이다.
static class StClass
{
   // 일반 멤버변수는 선언만해도 오류가 나게 된다.
   // int TEST = 100;
}

class Player
{
    static int number = 100; 

    // 함수의 위치는 문법적으로 어디에 있건 상관 없다.
    static void Main(string[] args)
    {
        Console.WriteLine("Console.WriteLine은 정적 멤버 함수입니다.");
    }
}
namespace StaticClass
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}