게임 개발_HISTORY

C# STUDY_TIL251007 [클래스와 객체] 본문

Development In Unity/Study : C#

C# STUDY_TIL251007 [클래스와 객체]

EVANJ 2025. 10. 7. 10:16

📝 학습 요약

  • 클래스와 객체
  • 상속과 다형성

🧩 학습 내용

✔️ 클래스와 객체

static void Main() 은 프로그램의 시작점이다. C# 프로그램이 실행될 때 가장 먼저 호출되는 메서드가 바로 "Main()"이다.

그리고 클래스나 구조체는 실제 실행되는 코드가 아니라, 데이터와 기능을 묶어 정의한 틀(템플릿)이다.

class Program
{
    static void Main()
    {
        Player hero = new Player();   // 객체 생성
        hero.name = "스파르타 전사";
        hero.hp = 100;

        hero.Attack(); // 메서드 실행
    }
}

 

여기서 Main() 은 "게임의 무대",
클래시는 "캐릭터 설계도",
"객체(Object)"는 설계도로 만든 실제 캐릭터라고 보면 된다.

비유 프로그래밍 용어 설명
게임의 시작 버튼 Main () 메서드 프로그램이 시작되는 곳
캐릭터 설계서 클래스 / 구조체 데이터와 행동을 정의한 틀
실제 캐릭터 객체(Object) 설계도로 만든 실제 인스턴스

 

method는 독립적으로 존재할 수 없으며 어떤 형식의 맴버로 정의되어야 한다. 따라서 관련된 Class 하위에 속해 있어야만 한다.
class 즉, 설계도는 속성(필드)과 행동(메소드)이 포함된다.

class Car
{
    public string brand;   // 속성
    public string color;   // 속성

    public void ShowInfo() // 행동
    {
        Console.WriteLine($"{color} {brand} 자동차입니다.");
    }
}

 

위 코드 처럼 class Car 설계도 안에 ShowInfo 라는 행동을 가진다. 만약  public void ShowInfo() 가 class 밖에 있으면 자동차의 해동이 아니라 프로그램 전체의 일반 함수가 되어버려 Car 객체가 함수를 호출하는 구조가 불가능하게 된다.

 

▫️클래스와 객체 구조 다이어그램

┌──────────────────────────────┐
│         [class Car]          │   ← 설계도 (Blueprint)
│──────────────────────────────│
│  public string brand;        │   ← 자동차의 브랜드 (데이터)
│  public string color;        │   ← 자동차의 색상 (데이터)
│──────────────────────────────│
│  public void ShowInfo()      │   ← 자동차의 기능 (행동)
│  {                           │
│      Console.WriteLine(...); │
│  }                           │
└──────────────────────────────┘
               ↑
               │  new (설계도로부터 실체를 만든다)
               │
     ┌──────────────────────────┐
     │   Car myCar = new Car(); │   ← 객체 생성 (메모리에 실물 등장)
     └──────────────────────────┘
               │
               │
         ┌──────────────┐
         │ myCar 변수    │
         │──────────────│
         │ brand = "현대"│
         │ color = "빨간색"│
         └──────────────┘
               │
               │
               ▼
        myCar.ShowInfo();
               │
               ▼
📢 콘솔 출력 → "이 자동차는 빨간색 현대입니다."

 

💡class program 의 의미
C# 프로그램이 실제로 시작되는 진입점(Entry Point)을 담고 있는 클래스이다. 프로그램의 출발선을 지정해 주는 껍데기 클래스.

Main() 메서드는 하나의 클래스 안에 있어야만 하는데 그게 바로 class program 이다.

✔️ 상속과 다형성

class Player
{
    public string Name;
    public virtual void Attack()
    {
        Console.WriteLine($"{Name}이(가) 기본 공격을 했다!");
    }
}

class Warrior : Player
{
    public override void Attack()
    {
        Console.WriteLine($"{Name}이(가) 검으로 강하게 공격했다!");
    }
}

 

여기서 핵심은 Warrior가 Player 를 상속받는다 점과 Attack () 을 재정의 (override) 한다는 점이다.

Player hero = new Warrior();
단계 설명
Player 변수의 데이터 타입. hero 라는 변수는 Player타입이다.
hero 객체 변수 이름(참조 변수), Player 설계도로 만든 hero 하나를 가르킨다.
 new 메모리에 새 객체를 생성하는 명령어. 실제로 "영웅 하나 만들기"
Warrior() Player 클래스의 생성자(Constructor) 호출as
hero.Attack(); 실제로는 Warrior가 재정의한 Attack() 실행됨 (다형성)

 

▫️객체 생성 양식은 다음과 같다.
클래스이름 객체이름 = new 클래스이름();
여기서 클래스는 같은 클래스를 가르킨다.

- 인스턴스(instans) : 객체는 클래스의 인스턴스로, 동일한 클래스에서 여러 개의 객체를 생성할 수 있다.
- 속성 접근 : 객체의 필드(속성)에 접근하여 값을 설정하거나 읽을 수 있다.

- 메서드 호출 : 객체의 메서드를 호출하여 특정 동작을 수행할 수 있다.

 

▫️ 다형성(polymorphism)

hero 는 Player 타입의 변수이지만 실제로 가르키는 건 Warrior 객체이다. 그래서 hero.Attack() 을 호출하면 자식 클래스(Warrior)의 Attack() 이 실행된다.

Player hero = new Warrior();
hero.Name = "스파르타 전사";
hero.Attack();

 

hero 의 타입은 Player인데도, 실제로는 Warrior의 행동이 나타나는 이유가 virtual / override 를 통한 다형성 때문이다.

 

new Warrior ()  :  Warrior 객체 생성(Player 기반 포함)

Player hero = ...  :  Player 참조 변수에 주소 저장

hero.Attack()  :  Player 타입이지만, Warrior의 메서드를 찾아 실행

결과:다형성  :  "하나의 변수(hero)"가 여러 형태(player, warrior)로 행동 가능

 

Player hero1 = new Warrior();
Player hero2 = new Mage();
Player hero3 = new Archer();

hero1.Attack();  // 전사가 검 공격
hero2.Attack();  // 마법사가 마법 공격
hero3.Attack();  // 궁수가 화살 공격

 

따라서 이렇게도 확장이 가능하다.
Player 라는 공통된 타입 하나로 여러 서로 다른 행동을 통합 관리할 수 있게 할 수 있다.