팀스파르타 코딩

📚 내일의 학습 목표 - 클래스와 객체 (C#)

creator2041 2025. 4. 14. 20:50

📌 01. 객체지향 프로그래밍(OOP)의 핵심 개념

✅ OOP의 5대 특징 정리

  1. 캡슐화 (Encapsulation)
    • 데이터와 해당 데이터를 다루는 메서드를 하나로 묶는 개념.
    • 외부에서 객체의 내부 구현을 숨기고, 꼭 필요한 정보만 공개해요.
    • 🧪 비유: 약통 안에 각각의 약을 넣지 않고, 하나의 캡슐에 전부 담는 것과 같아요!
  2. 상속 (Inheritance)
    • 기존 클래스를 기반으로 새로운 클래스를 만들 수 있어요.
    • 중복 코드를 줄이고, 공통 기능을 공유할 수 있어요.
    • 📦 예: 몬스터라는 클래스를 만들어두고, 그걸 상속받아 좀비, 고블린, 드래곤을 만들 수 있어요.
  3. 다형성 (Polymorphism)
    • 같은 이름의 메서드가 상황에 따라 다르게 작동해요.
    • 오버라이딩(재정의)과 오버로딩(중복정의)으로 구현해요.
    • 🎮 예: Attack() 메서드가 고블린에선 칼을 휘두르고, 드래곤에선 불을 뿜게 할 수 있어요!
  4. 추상화 (Abstraction)
    • 복잡한 내부 구조는 숨기고, 꼭 필요한 기능만 공개하는 방식이에요.
    • 사용자에게는 인터페이스만 보여주고, 내부 로직은 감춰요.
  5. 객체 (Object)
    • 클래스라는 설계도를 바탕으로 만들어진 실체예요.
    • 각 객체는 상태(데이터)와 동작(기능)을 가집니다.

📌 02. 클래스의 구성과 인스턴스

✅ 클래스란?

  • 데이터(필드)와 기능(메서드)을 하나로 묶은 사용자 정의 타입입니다.
  • 인스턴스를 만들어야 실제로 사용 가능해요.
class Monster
{
    public string Name;
    public int HP;

    public void Attack()
    {
        Console.WriteLine($"{Name}이(가) 공격합니다!");
    }
}

Monster goblin = new Monster();
goblin.Name = "고블린";
goblin.HP = 30;
goblin.Attack();
// 출력: 고블린이(가) 공격합니다!

📌 03. 접근 제한자 (Access Modifiers)

  • public: 외부에서 접근 가능
  • private: 클래스 내부에서만 접근 가능
  • protected: 상속받은 클래스에서 접근 가능
class Player
{
    public string Name;       // 누구나 접근 가능
    private int exp;          // 클래스 내부에서만 사용 가능
    protected int level;      // 상속받은 클래스에서도 사용 가능
}

📌 04. 필드와 메서드

class NPC
{
    public string Name;          // 외부에서 NPC 이름을 설정할 수 있음
    private string Dialogue;     // 외부에 직접 노출하지 않고, 내부에서만 저장됨

    public void Talk()
    {
        // 저장된 대사를 출력하는 메서드
        Console.WriteLine($"{Name}: {Dialogue}");
    }

    public void SetDialogue(string text)
    {
        // 외부에서 대사를 설정할 수 있는 메서드
        Dialogue = text;
    }
}

NPC merchant = new NPC();                       // NPC 클래스의 인스턴스를 생성
merchant.Name = "상인";                        // public 필드에 접근하여 이름 설정
merchant.SetDialogue("좋은 물건 있어요~");   // 메서드를 통해 대사 설정
merchant.Talk();                                // 대사를 출력

필드(Fields)

필드는 클래스 내에서 데이터를 저장하는 변수입니다. 예제에서:

  • public string Name: 외부에서 직접 접근 가능한 공개 필드
  • private string Dialogue: 클래스 내부에서만 접근 가능한 비공개 필드

메서드(Methods)

메서드는 클래스 내에서 정의된 함수로, 객체의 행동을 정의합니다. 예제에서:

  • Talk(): 저장된 이름과 대사를 출력하는 메서드
  • SetDialogue(string text): 대사를 설정하는 메서드

접근 제한자(Access Modifiers)

  • public: 어디서든 접근 가능
  • private: 같은 클래스 내에서만 접근 가능

코드 실행 흐름

  1. NPC merchant = new NPC(); - NPC 클래스의 인스턴스(객체)를 생성합니다.
  2. merchant.Name = "상인"; - 공개(public) 필드인 Name에 직접 값을 할당합니다.
  3. merchant.SetDialogue("좋은 물건 있어요~"); - SetDialogue 메서드를 통해 비공개(private) 필드인 Dialogue에 값을 설정합니다.
  4. merchant.Talk(); - Talk 메서드를 호출하여 이름과 대사를 출력합니다.

중요 개념

  • 캡슐화(Encapsulation): private 필드(Dialogue)는 직접 접근할 수 없고, 메서드(SetDialogue)를 통해서만 값을 설정할 수 있습니다. 이를 통해 데이터 접근을 제어하고 무결성을 유지합니다.
  • 객체 지향 프로그래밍: 데이터(필드)와 기능(메서드)을 하나의 단위(클래스)로 묶어 관리합니다.

이 패턴은 좋은 객체 지향 설계의 기본이며, 클래스의 내부 구현을 외부로부터 보호하는 데 도움이 됩니다.


📌 05. 생성자와 소멸자

✅ 생성자 (Constructor)

class Enemy
{
    public string Name;
    public int HP;

    public Enemy(string name, int hp)
    {
        Name = name;
        HP = hp;
        Console.WriteLine($"{Name}이(가) 생성되었습니다! HP: {HP}");
    }
}

Enemy slime = new Enemy("슬라임", 20);

✅ 소멸자 (Destructor)

class Enemy
{
    public string Name;
    public Enemy(string name)
    {
        Name = name;
    }
    ~Enemy()
    {
        Console.WriteLine($"{Name}이(가) 소멸됩니다.");
    }
}

소멸자는 객체가 메모리에서 제거될 때 자동으로 호출되는 특별한 메서드입니다. C#에서 소멸자는 클래스 이름 앞에 물결표(~) 기호를 붙여 정의합니다.

예제 코드 설명:

  • 생성자는 객체가 생성될 때 Name 속성을 초기화합니다.
  • 소멸자는 객체가 가비지 컬렉터에 의해 메모리에서 제거될 때 호출되며, 이때 "{Name}이(가) 소멸됩니다." 메시지를 콘솔에 출력합니다.

📌 06. 프로퍼티 (Property)

class Hero
{
    private int hp;  // 직접 접근은 불가능한 필드

    public int HP
    {
        get { return hp; }  // 값을 외부에서 읽을 수 있음
        set
        {
            if (value >= 0) hp = value;  // 0 이상의 값만 허용
        }
    }
}

Hero knight = new Hero();
knight.HP = -10;  // 무시됨
Console.WriteLine(knight.HP); // 출력: 0

✅ 자동 프로퍼티

class Item
{
    public string Name { get; set; }    // 자동 생성되는 필드로 이름 저장
    public int Price { get; set; }      // 자동 생성되는 필드로 가격 저장
}

Item potion = new Item { Name = "포션", Price = 50 };
Console.WriteLine(potion.Name + ": " + potion.Price + "골드");

✅ 텍스트 RPG 만들 때 이렇게 활용해요!

  • Player 클래스 → 이름, 체력, 공격력, Attack() 메서드 포함
  • Monster 클래스 → 이름, 체력, 패턴, TakeDamage() 메서드 포함
  • Item 클래스 → 자동 프로퍼티로 Name, Effect 등 저장
  • NPC 클래스 → Talk() 메서드로 대사 출력
  • 각 요소를 객체로 생성해서 게임 내 상호작용 구현 가능!

📌 챗GPT의 도움을 받긴 했지만, 강의의 설명과 GPT의 부가설명을 더 들으니 강의가 더욱 이해되기 시작했고,
무엇보다 과제였던 ‘프롬프트 RPG 만들기’의 로직에 한 발 더 가까워졌다는 느낌을 받았다!
이제는 단순히 따라 치는 것이 아닌, 내가 왜 이걸 쓰는지를 고민하며 코드에 접근할 수 있게 되었다. 💡

 

내일 아침 일어나 복습으로 읽어보고. 다시 강의를 들어보면. 더 나은 상태로 이해할수있을 것이라 믿는다!