프로그래밍 C#언어

C#의 시작, class와 DataTypes

게임첫걸음 2024. 8. 28. 16:29

 C언어는 컴퓨터와 친한 언어로 운영체제, 임베디드 시스템 개발에 주로 사용되고 C#은 객체 지향의 특성과 동적인 웹사이트와 데스크톱 애플리케이션 개발에 주로 사용됩니다. 

 

<객체 지향>(Object Oriented Programming)(OOP)

 객체 지향은 명령형 프로그래밍으로 프로그램을 수많은 객체(Object)라는 기본 단위로 나누고 이들의 상호작용을 서술하는 방식입니다. 객체란 메소드, 변수를 가지고 특정 역할을 수행하도록 인간이 정의한, 추상적인 개념입니다. C#언어는 객체 지향으로 class, public 같은 용어를 다루게됩니다.

class Program
{
    static void Main()
    {
        Console.WriteLine("Hello, World!");	//C언어 printf("Hello, World!")
    }
}

 프로그래밍의 시작인 "Hello, World!" 출력문입니다. class와 static문을 다루는 첫 문장입니다. 이제 예시 코드입니다.

class Program
{
    static void Test()
    {
        Character mob = new Character();
    }
    
	static void Main()
    {
        // 객체(Object)
        // 인스턴스화(Instance, Instantiate)
        Character player = new Character();
        player.hp = 100;
        player.Damage(10);
        Console.WriteLine(
            "Player.hp: " + player.GetHP());
        player.MP = 10;

        Character npc = null;

        Test();
        GC.Collect();
        Console.ReadLine();
    }
}

class Character
{
    // 정보 + 기능
    // Member Variables(멤버변수)
    // Fields
    // 멤버 접근 지정자
    // Access Specifiers
    // Access Modifiers
    // 정보은닉(Information Hiding)
    // 캡슐화(Encapsulation)

    // Member Initialization
    // Field Initialization
    public int hp = 10;
    private int mp = 0;

    protected int exp;
    internal int lv;

    // Properties
    public int MP
    {
        set 
        {
            mp = value;
            if (mp > 99) mp = 99;
        }
        get { return mp; }
    }

    // 생성자(Constructor)
    public Character()
    {
        Console.WriteLine("Character Constructor Call!");

        hp = 100;
        mp = 20;
        exp = 0;
        lv = 1;
    }

    // 소멸자(Destructor)
    ~Character()
    {
        Console.WriteLine("Character Destructor Call!");
    }

    // Member Functions(멤버함수)
    // Methods
    public void Damage(int _dmg)
    {
        if (_dmg > 100) return;

        hp -= _dmg;

        if (hp < 0) hp = 0;
    }

    // Getter / Setter
    public void SetHP(int _hp)
    {
        hp = _hp;
    }

    public int GetHP()
    {
        return hp;
    }
}

 

 

<객체>(Object)

class Character
{
    // 정보 + 기능
    // Member Variables(멤버변수)
    // Fields
    // 멤버 접근 지정자
    // Access Specifiers
    // Access Modifiers
    // 정보은닉(Information Hiding)
    // 캡슐화(Encapsulation)

    // Member Initialization
    // Field Initialization
    public int hp = 10;
    private int mp = 0;

    protected int exp;
    internal int lv;
}

 위의 코드에서 객체와 관련된 코드들을 따로 뽑았습니다. 주석에서 다루는 C# 용어에 대해 알아보겠습니다.

  • 멤버 변수(Member Variable): class, 구조체의 속성을 저장하는 변수, 필드와 같은 의미로 사용
  • 필드(Field): class, 구조체 내에서 선언된 변수, 멤버 변수와 같은 의미로 사용
  • class Character { int hp, mp, exp, lv }
  • 접근 지정자(Access Specifiers): 클래스, 메서드, 필드 등의 접근 범위를 설정하는 키워드
  • 접근 제한자(Access Modifiers): 접근 지정자와 같은 의미로 클래스 멤버의 접근 수준을 제어
  • hp, mp, exp, lv 맨 앞에 붙는 public, private, protected, internal 등
  • public: 모든 클래스에서 접근 가능.
  • private: 같은 클래스 내에서만 접근 가능
  • protected: 같은 클래스와 파생 클래스에서만 접근 가능
  • internal: 같은 어셈블리 내에서만 접근 가능
  • 정보 은닉(Information Hiding): 객체 내부를 외부에서 접근 못하도록하여 사용자가 객체를 수정못하도록 방지
  • 캡슐화(Encapsulation): 객체의 데이터와 메서드를 하나의 단위로 묶어 보호하는 개념, 접근 지정자로 범위 제어
// Properties
    public int MP
    {
        set 
        {
            mp = value;
            if (mp > 99) mp = 99;
        }
        get { return mp; }
    }

    // 생성자(Constructor)
    public Character()
    {
        Console.WriteLine("Character Constructor Call!");

        hp = 100;
        mp = 20;
        exp = 0;
        lv = 1;
    }

    // 소멸자(Destructor)
    ~Character()
    {
        Console.WriteLine("Character Destructor Call!");
    }
  • Property: 속성으로 필드 mp 값을 제어합니다. set과 get 접근자를 다룹니다.
  • get접근자: 값을 반환하는 메서드 // set접근자: 값을 설정하는 메서드 mp가 99보다 크면 99로 설정한다는 뜻
  • 생성자(Constructor): 객체가 생성될 때 호출되어 초기화 작업을 수행 
  • 소멸자(Destructor): 객체가 소멸될 때 호출되어 정리 작업을 수행, 클래스 이름 앞에 ~ 기호를 붙이고 매개변수 X
  • Character Constructor Call! 출력하고 hp, mp, exp, lv을 선언한 값으로 초기화
  • Character 객체가 소멸될 때 호출되어 Character Destructor Call!을 출력

<메서드>(Methods)

// Member Functions(멤버함수)
    // Methods
    public void Damage(int _dmg)
    {
        if (_dmg > 100) return;

        hp -= _dmg;

        if (hp < 0) hp = 0;
    }

    // Getter / Setter
    public void SetHP(int _hp)
    {
        hp = _hp;
    }

    public int GetHP()
    {
        return hp;
    }
  • 멤버함수(Member Function)와 메서드(Method): 클래스 내에 정의된 함수로 객체의 동작을 정의. C언어에서 함수와 같은 역할 수행. Damage, SetHP, GetHP 모두 이에 속함
  • 구성요소: 접근 지정자 public 반환타입 void 메서드 이름 Damage 매개변수 int _dmg 메서드 본문 { .... } 
  • Damage: _dmg가 100 초과값이면 예외 처리, hp를 감소시키는 메서드, hp가 0미만이면 0으로 설정
  • SetHP: hp를 _hp로 초기화
  • GetHP: hp값 반환

<객체 인스턴스화> (Object, Instance, Instantiate)

class Program
{
    static void Test()
    {
        Character mob = new Character();
    }
    
	static void Main()
    {
        // 객체(Object)
        // 인스턴스화(Instance, Instantiate)
        Character player = new Character();
        player.hp = 100;
        player.Damage(10);
        Console.WriteLine(
            "Player.hp: " + player.GetHP());
        player.MP = 10;

        Character npc = null;

        Test();
        GC.Collect();
        Console.ReadLine();
    }
}
  • 객체(Object): 클래스의 인스턴스로 클래스는 객체를 생성하기 위한 청사진(설계도) 역할
  • 인스턴스화(Instance, Instantiate): 클래스로부터 객체를 생성하는 과정을 의미
  • Character player = new Character(); // player: Character class 내의 객체 // new Character(): player객체의 인스턴스화
  • GC.Collect(): 가비지 컬렉터(Garbage Collector)를 강제로 실행하여 사용하지 않는 객체를 메모리 해제하는 용도, C#은 가비지 컬렉션을 자동 관리되지만, 특정 상황에서 메모리 해제를 강제하고 싶을 때 사용
  • Console.ReadLine(): 콘솔에서 사용자가 입력한 한 줄의 문자열을 읽습니다. C언어에서 scanf와 같은 역할

'프로그래밍 C#언어' 카테고리의 다른 글

상속 (Inheritance)  (0) 2024.08.30
String (문자열)  (0) 2024.08.30
구조체 (Structure)  (1) 2024.08.29
배열 (Array)  (0) 2024.08.29
DataType(데이터 타입)  (3) 2024.08.28