ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다시한번 개발자도전! 8일차(클래스,생성자,접근제한자,프로퍼티)
    다시한번 개발자도전! 2026. 1. 13. 15:37

    어제도 어김없이 늦게 잠들어서 잠에 찌든 채로 일어나 버림,

    오늘 진짜 일찍 잔다. 오늘도 늦게 자면 사람도 아닌 걸로..

    계속 졸다 커피하나 낋여오고 빡집중 스타투!


    < 📋C# 클래스(Class)  >

     

    1. 클래스란?

    • 정의: 데이터(변수)와 기능(메서드)을 하나로 묶어놓은 **설계도(청사진)**임.
    • 비유: 클래스가 '자동차 설계도'라면, 객체(Object)는 그 설계도로 만든 '실제 자동차'임.
    • 특징: 유니티의 모든 스크립트는 기본적으로 MonoBehaviour를 상속받는 클래스임.
    • 메모리: 클래스는 **참조 타입(Reference Type)**임. 변수에 값이 직접 저장되는 게 아니라 데이터가 있는 메모리 주소를 가리킴.

    2. 클래스 구조와 생성 방법

    클래스는 상태를 나타내는 필드 동작을 나타내는 메서드로 구성.

    public class Player // 클래스 선언
    {
        // 1. 필드 (데이터/상태)
        public string nickName;
        public int hp;
    
        // 2. 메서드 (기능/동작)
        public void Move()
        {
            // 이동 로직
        }
    }

     


    3. 생성자 (Constructor)

    객체가 생성될 때 호출되는 특수한 함수임. 데이터를 초기화할 때 씀.

     

        public class Player
        {
            public string nickName;
            public int hp;
    
            public Player()  //생성자 선언
            {
                nickName = "해유";
                hp = 100;
            }
    
            public Player(string _name, int _hp)//생성자 오버로딩
            {
                nickName = _name;
                hp = _hp;
            }
        }

    💡유니티 MonoBehaviour를 상속받은 클래스는 new를 쓰지 않으므로 생성자 대신 Awake()나 Start()를 사용해야 함.


     

    4. 접근 제한자: 정보 보안 설정

    누가 이 데이터를 볼 수 있는지 결정함. 코드의 꼬임을 방지하기 위해 매우 중요함.

    키워드 범위 특징
    public 전체 클래스 외부, 인스펙터 창 등 어디서든 접근 가능함.
    private 클래스 내부 해당 클래스 안에서만 사용 가능함. (기본값)
    protected 상속 관계 나를 상속받은 자식 클래스까지만 접근을 허용함.
    internal 프로젝트(어셈블리) 같은 프로젝트 파일 내에서는 public처럼 작동함
     private string nickName; //외부에서 사용불가
     public int hp; // 누구든 사용가능
     protected int mp; // 나와 상속받은 자식만 사용가능

     

     


    5. 클래스 배열과 객체 생성 

    • 배열을 만든다는 건 **"설계도를 담을 빈 박스들을 나열하는 것"**과 같음. 중요한 건 배열만 만든다고 객체가 생기는 게 아니라, 각 칸에 new 키워드로 객체를 직접 생성해서 넣어줘야 함.
      1. 클래스[] 배열명 = new 클래스[크기];로 박스를 먼저 만듦.
      2. 배열명[인덱스] = new 클래스();로 실제 객체를 생성해서 채워 넣음.
      3. 그 후에야.(도트 연산자)를 써서 데이터를 다룰 수 있음.
    public class Monster
        {
            public string name;
            public int hp;
    
            // 생성자
            public Monster(string _name, int _hp)
            {
                name = _name;
                hp = _hp;
            }
    
            public void Info()
            {
                Console.WriteLine($"몬스터 이름: {name}, 체력: {hp}");
            }
        }
    
        class Program
        {
            static void Main()
            {
                // 배열 선언 (3칸짜리 몬스터 박스 생성)
                Monster[] monsterArray = new Monster[3];
    
                // 각 칸에 객체 생성 및 할당 (new 키워드 필수!)
                monsterArray[0] = new Monster("슬라임", 10);
                monsterArray[1] = new Monster("고블린", 30);
                monsterArray[2] = new Monster("오크", 100);
    
                // 사용 예시
                for (int i = 0; i < monsterArray.Length; i++)
                {
                    monsterArray[i].Info(); // 각 객체의 메서드 호출
                }
            }
        }

     

    체크포인트 

    • NullReferenceException 주의: Monster [] monsters = new Monster [5];만 하면 5개의 빈칸만 생길 뿐임. monsters [0]. hp = 10; 같이 접근하면 에러 남. 반드시 new Monster()로 객체를 넣어줘야 함.
    • 배열 vs 리스트: 배열은 크기가 고정됨. 게임 도중 몬스터가 계속 추가/삭제된다면 List <Monster>를 쓰는 게 훨씬 편함.

    <📋 프로퍼티 (Property) >

     

    1. 프로퍼티란?

    • 정의: 변수(필드)의 값을 읽거나 쓸 때, 중간에서 제어할 수 있는 기능을 가진 특수한 메서드임.
    • 특징: 외부에서는 변수처럼 보이지만, 실제로는 함수처럼 동작함.
    • 목적: 캡슐화를 유지하면서 데이터를 안전하게 보호하기 위해 사용함.
        public class Player
        {
            private int hp; // 실제 데이터 (Field)
    
            public int HP // 데이터를 제어하는 프로퍼티 (Property)
            {
                get { return hp; } // 값을 읽어갈 때 실행
                set
                {
                    // 값을 넣을 때 실행 (value는 새로 들어온 값)
                    if (value < 0) hp = 0; // 0 아래로 못 내려가게 방어!
                    else hp = value;
                }
            }
        }

     

    2. 왜 사용하는가? 

    데이터 오염 방지

    위의 HP 예시처럼 체력이 음수가 되는 것을 막거나, 레벨이 100을 넘지 못하게 하는 등 유효성 검사가 가능함.

     

    읽기 전용/쓰기 전용 설정

    get만 선언하면 외부에서 값을 절대 바꿀 수 없는 '읽기 전용' 변수를 만들 수 있음. (중요 데이터 보호에 필수임)

     

    디버깅 및 로직 연결

    값이 바뀔 때마다 Debug.Log를 찍거나, UI를 갱신하는 함수를 자동으로 호출하게 만들 수 있음.

     


    <📋 static (정적) 멤버>

     

    1. static이란?

    • 정의: 객체(Instance)에 속하는 게 아니라, 클래스(Class) 자체에 속하는 키워드임.
    • 특징: new로 객체를 만들지 않아도 메모리에 딱 하나 올라가며, 모든 객체가 이 하나를 공유함.
    • 메모리: 프로그램이 시작될 때 메모리(Data/Static 영역)에 고정적으로 할당되어 프로그램 종료 시까지 유지됨.
    •  

    2. static 변수 (정적 필드)

    모든 객체가 공동으로 사용하는 "공용 변수"임.

    public class Monster
    {
        public static int totalCount = 0; // 모든 몬스터가 공유하는 변수
        public string name;
    
        public Monster(string _name)
        {
            name = _name;
            totalCount++; // 새로운 몬스터가 생길 때마다 공용 카운트 증가
        }
    }
    
    // 사용 예시
    Monster m1 = new Monster("슬라임");
    Monster m2 = new Monster("고블린");
    
    Console.WriteLine(Monster.totalCount); // 결과: 2 (객체 이름이 아닌 클래스 이름으로 접근!)

    3. static 메서드 (정적 함수)

    객체 없이 클래스 이름만으로 바로 호출할 수 있는 함수임.

    public class Calculator
    {
        public static int Add(int a, int b)
        {
            return a + b;
        }
    }
    
    // 사용 예시
    int result = Calculator.Add(10, 20); // new Calculator() 할 필요 없음!

     

    ❗주의사항: static 메서드 안에서는 일반 변수(인스턴스 변수)를 사용할 수 없음. 메모리에 올라가는 시점이 다르기 때문임.


    4. 인스턴스 vs 정적 멤버 비교

    구분 인스턴스 (일반) 정적 (static)
    소속 생성된 객체(Instance) 클래스(Class)
    메모리 할당 new 할 때마다 각각 할당 프로그램 시작 시 1번만 할당
    접근 방식 객체명.변수 클래스명.변수
    공유 여부 각자 따로 가짐 모두가 하나를 공유함

     

     


    개인적으로 따로 공부해야 될 게 많은 것 같다ㅜㅜ

    그래도 취업을 위해 화이팅!

Designed by Tistory.