본문 바로가기
Development/멋쟁이사자처럼 게임개발 부트캠프

[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 7일차 - 클래스 & this 키워드

by jjeondeuk1008 2025. 3. 9.

 

 


 

1. 내장형 구조체

 

내장형 구조체란 무엇인가?

 

저번의 구조체에 이어서 내장형 구조체가 있다.

이것은 .NET Framework에 포함 되어 있으며 자주 사용되는 데이터 타입이다.

 

 

그중에서

 

DataTime  : 특정 날짜와 시간을 나타낸다.

                   - 날짜와 시간을 조작하고 포맷 가능

TimeSpan : 시간의 간격이나 두 날짜 간의 차이를 표현하는 것을 나타낸다.

                   - 일, 시, 분, 초, 밀리초로 표현됨

 //내장형 구조체
 DateTime now = DateTime.Now; //현재 시간을 불러냄
 Console.WriteLine($"Current Date and Time: {now}");

 TimeSpan duration = new TimeSpan(1, 30, 0); //시간을 표시해주는 형태
 Console.WriteLine($"Duration: {duration}"); //01:30:00

 

 

 

 


 

2. 클래스

 

 

데이터들을 모아서 함수를 묶는 느낌이다.

new 키워드로 할당한다.

 

구조체랑 비슷하긴 하다.

 

특정 class를 구현할 때 묶일 수 있는 것으로 묶어서 관리하는 용도로 쓰인다.

 class Person
 {
     public string name;

     public void ShowInfo()
     {
         Console.WriteLine($"이름: {name}, 나이: {Age}");
     }
 }
 
 class Program
{
    static void Main(string[] args)
    {
        //class Person
        Person p1 = new Person(); //객체 생성 (instance)
        p1.ShowInfo();
    }
}

 

 

 


 

기본생성자

 

 

기본생성자란?

클래스가 객체로 생성될 때 자동으로 실행되는 특별한 메서드이다.

 

클래스와 같은 이름을 가지며, 반환형이 없다. (void 사용x)

class Person
{
    public string name;
    public int Age;

    //기본생성자
    //클래스가 객체로 생성될때 자동으로 실행되는 특별한 메서드
    //클래스와 같은 이름을 가지며, 반환형이 없다 (void도 사용하지 않음)
    //객체를 만들때 필요한 초기값을 설정할 때 사용 많이한다.
    public Person()
    {
        //초기화 해준 값이 public string name, public int age에 들어감
        name = "이름 없음";
        Age = 0;
        Console.WriteLine("기본 생성자가 실행됨");
    }

    public void ShowInfo()
    {
        Console.WriteLine($"이름: {name}, 나이: {Age}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        //class Person
        Person p1 = new Person(); //객체 생성 (instance)
        p1.ShowInfo();
    }
}

 

 

 

매개변수가 있는 생성자

 

생성자가 아예 없는 클래스의 경우 기본생성자를 자동으로 만들어준다.

하지만 매개변수를 받는 생성자만 코딩했을 경우 기본생성자를 생성 안 한다.

 

일반적인 경우에는 기본 생성자를 따로 만들어줘야 한다.

 

매개변수는 외부에서 입력 받아 넣어주고

기본 생성자안에서 초기화 해준 값이 매개변수 값에 들어간다.

class Person
{
    public string Name;
    public int Age;

    //기본생성자
    //클래스가 객체로 생성될때 자동으로 실행되는 특별한 메서드
    //클래스와 같은 이름을 가지며, 반환형이 없다 (void도 사용하지 않음)
    //객체를 만들때 필요한 초기값을 설정할 때 사용 많이한다.
    
    public Person(string name, int age) //외부에서 입력 받아서 넣어주려고 함
    {
        //초기화 해준 값이 public string name, public int age에 들어감
        Name = name;
        Age = age;
        Console.WriteLine("매개변수있는 생성자가 실행됨");
    }

    public void ShowInfo()
    {
        Console.WriteLine($"이름: {Name}, 나이: {Age}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        //class Person
        Person p1 = new Person("철수", 25); //객체 생성 (instance)
        p1.ShowInfo();

        Person p2 = new Person("영희", 30);
        p2.ShowInfo();

    }
}

 

 

 

 

 


 

실습

스타크래프트의 마린 클래스를 만들어보는 실습을 진행해보았다.

기본생성자와 인자 있는 생성자를 사용해서 진행하였다.

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

namespace lionstudy33
{
    //마린 클래스를 만드세요.
    //이름, 미네랄
    //기본생성자, 인자 있는 생성자
    class Marin
    {
        public string Name;
        public int mineral;

        public Marin()
        {
            Name = "마린";
            mineral = 50;
        }

        public Marin(string _name, int _ral)
        {
            Name = _name;
            mineral = _ral;
        }

        public void ShowInfo()
        {
            Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
        }
    }

    //배럭클래스를 만드세요 barracks (스타 이름임.,.)
    //Barracks 150
    
    class Barracks
    {
        public string Name;
        public int mineral;
        public Barracks()
        {
            Name = "배럭";
            mineral = 150;
        }

        public Barracks(string name2, int ral2)
        {
            Name = name2;
            mineral = ral2;
        }

        public void ShowInfo()
        {
            Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
        }
    }

    class Scv
    {
        public string Name;
        public int mineral;

        public Scv()
        {
            Name = "마린";
            mineral = 50;
            Console.WriteLine("");
        }

        public Scv(string _name, int _ral)
        {
            Name = _name;
            mineral = _ral;
        }

        public void ShowInfo()
        {
            Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Marin marin = new Marin("불꽃테란", 100);
            Scv scv = new Scv("열받은 SCV", 70);
            Barracks barracks = new Barracks();

            marin.ShowInfo();
            scv.ShowInfo();
            barracks.ShowInfo();
        }
    }
}

 

 

 

 


 

3. this 키워드

 

 

this 키워드는 자기 자신을 가르킨다. 

this를 사용하게 되면 해당 객체에 접근할 수 있다.

public Barracks(string Name, int mineral)
{
    this.Name = Name; //헷갈리는 변수명 때문에 프로그램이 인식하기 힘들어 표시해놓는 느낌, 같은 이름을 쓰고 싶을때
    this.mineral = mineral;
}

 

 

 

 

그렇게 this 키워드를 사용한 위의 마린 클래스 실습을 수정하였다.

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

namespace lionstudy33
{
    //마린 클래스를 만드세요.
    //이름, 미네랄
    //기본생성자, 인자 있는 생성자
    class Marin
    {
        public string Name;
        public int mineral;

        public Marin()
        {
            Name = "마린";
            mineral = 50;
        }

        public Marin(string _name, int _ral)
        {
            Name = _name;
            mineral = _ral;
        }

        public void ShowInfo()
        {
            Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
        }
    }

    //배럭클래스를 만드세요 barracks (스타 이름임.,.)
    //Barracks 150
    //this 키워드를 사용해보자!
    //this란? 자기자신을 가르킨다.
    
    class Barracks
    {
        public string Name;
        public int mineral;
        public Barracks()
        {
            Name = "배럭";
            mineral = 150;
        }

        public Barracks(string Name, int mineral)
        {
            this.Name = Name; //헷갈리는 변수명 때문에 프로그램이 인식하기 힘들어 표시해놓는 느낌, 같은 이름을 쓰고 싶을때
            this.mineral = mineral;
        }

        public void ShowInfo()
        {
            Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
        }
    }

    class Scv
    {
        public string Name;
        public int mineral;

        public Scv()
        {
            Name = "마린";
            mineral = 50;
            Console.WriteLine("");
        }

        public Scv(string _name, int _ral)
        {
            Name = _name;
            mineral = _ral;
        }

        public void ShowInfo()
        {
            Console.WriteLine($"이름: {Name}, 미네랄: {mineral}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Marin marin = new Marin("불꽃테란", 100);
            Scv scv = new Scv("열받은 SCV", 70);
            Barracks barracks = new Barracks();

            marin.ShowInfo();
            scv.ShowInfo();
            barracks.ShowInfo();
        }
    }
}

 

 

 

 

그 외에도 생성자와 this 키워드를 사용한

미네랄 클래스를 실습하였다.

class Mineral
{
    public int MineralCount;

    public Mineral()
    {
        MineralCount = 1500;
    }

    public void ShowInfo()
    {
        Console.WriteLine($"현재 미네랄 갯수 : {MineralCount}");
    }
}

//Game클래스를 만들어보자
class Game
{
    public static int mineral;
    public static int gas;
    public static int charCount;

    public static void ShowInfo()
    {
        Console.WriteLine($"미네랄 {mineral} 가스 {gas} 인구수 {charCount}");
    }

}

class Program
{
    static void Main(string[] args)
    {

        Game.mineral = 50;
        Game.gas = 0;
        Game.charCount = 4;
        Game.ShowInfo();

        //클래스의 배열 7개 생성
        Mineral[] mineral = new Mineral[7];

        //각 배열에 new 객체화
        for (int i = 0; i < mineral.Length; i++)
        {
            mineral[i] = new Mineral();
            mineral[i].ShowInfo();
        }

    }
}

 

 

 

 


 

 

4. get / set 함수 (Getter Setter)

 

 

보통 외부에서 제한하고 싶은 코드는 private 을 사용한다.

 

여기에서 문제점은

하지만 main 에서 접근을 할 수가 없다는 것이다.

 

 

그럴 때를 위해 get / set 함수를 사용하는 것이다!

이 함수를 적용해서 private 속성에 접근하는 것이다.

 

아래의 코드에서는

SetName

GetName

으로 접근하였다.

class person
{

    private string name = "기본값";        //내부 변수

    //값 설정하기 (setter) 함수가 필요.
    //아래 같은 함수를 setter 함수라고 함.
    
    public void SetName(string newName)
    {
        name = newName;
    }

    public string GetName()
    {
        return name;
    }
}
class Person
{
    private string name = "기본값"; //내부 변수
    private string nam = "남";
}
static void Main(string[] args)
{
 //private, public, protected
 //C#    get/set 방식의 함수와 프로퍼티 비교
 //C# 에서는 객체의 값을 읽고 (get), 설정 (set)하는
 //방식으로 함수 (get/set 메서드) 또는
 //** 프로퍼티 **를 사용할 수 있다.
             person p1 = new person();
             Console.WriteLine(p1.GetName());
             p1.SetName("할루");
             Console.WriteLine(p1.GetName());
}

 

 

 

프로퍼티

 

그리고 Get Set 함수를 관리하기 쉽도록 프로퍼티 라는 것을 제공한다.

get {}

set {}

형식으로 작성하면 된다.

 

이렇게 하면 함수를 나누지 않고 바로 사용할 수 있어 가독성도 좋고 편리해진다.

 class Person
 {
     private string name = "기본값"; //내부 변수
     private string nam = "남";

     public string Name //프로퍼티
     {
         get { return name; } //getter
         set { name = value; } //setter
     }

 }

 class Program
 {
     static void Main(string[] args)
     {
         Person p1 = new Person();

         Console.WriteLine(p1.Name);
         p1.Name = "가나다";
         Console.WriteLine(p1.Name);
         
//위쪽 처럼 GetName함수 SetName함수 나누지않고 바로 사용할 수 있어 편하다.

 

 

 

 

자동구현 프로퍼티

 

 

여기에서 자동구현 프로퍼티 라는 것도 있다.

 

public (변수) (변수명) { get; set; }

 

이렇게 한 줄로 표기가 가능하다.

class marine
{
    public string Name { get; } = "마린";
    public int Mineral { get; set; } = 50;
}
  class Program
  {
      static void Main(string[] args)
      {
      marine m = new marine();
			Console.WriteLine("이름 : " + m.Name + ", 미네랄 : " + m.Mineral);
	}
}

 

 

 

 


 

 

이렇게 오늘의 내용도 끝!

 

프로퍼티가 솔직히 날 정말 헷갈리게 했다..

 

근데 블로그를 쓰면서 다시 공부하니

 

이해가 어느정도 잘 되는 느낌이었다~

 

 

그리고 나름 블로그 쓰는 것도 재밌다! ^,^

😊

 

 

그럼 오늘도 고생했다~!

 

 


목차