C#

C# 03 ( 클래스 )

상상모음 2025. 3. 12. 14:33

클래스(class)

클래스와 객체

프로그래밍 언어적인 측면에서 

객체 자료형 또는 객체 클래스

클래스의 구성 - 클래스 멤버

필드 계통 - 상수 정의, 필드, 이벤트

메소드 계통 - 메소드, 생성자, 소멸자, 프로퍼티, 인덱서, 연산자 중복

 

C# 클래스(Class) 개념과 사용법

1. 클래스(Class)란?

클래스는 객체 지향 프로그래밍(OOP)의 기본 단위로, 데이터(필드)와 동작(메서드)을 하나의 논리적 단위로 묶은 것입니다.

클래스 = 객체의 설계도
객체 = 클래스의 인스턴스(실제 메모리에 할당된 것)


2. 클래스 선언 및 객체 생성

// 클래스 선언
class Person  
{
    public string Name;   // 필드 (멤버 변수)
    public int Age;       // 필드

    // 메서드 (행동)
    public void SayHello()
    {
        Console.WriteLine($"안녕하세요, 저는 {Name}이고 {Age}살입니다.");
    }
}

// 객체 생성 및 사용
Person p1 = new Person();  // new 연산자로 객체 생성
p1.Name = "철수";
p1.Age = 25;
p1.SayHello();  // 안녕하세요, 저는 철수이고 25살입니다.

3. 생성자(Constructor)

생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메서드입니다.

  • 이름이 클래스 이름과 동일
  • 리턴 타입이 없음 (void도 없음)
class Person  
{
    public string Name;
    public int Age;

    // 생성자
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public void SayHello()
    {
        Console.WriteLine($"안녕하세요, 저는 {Name}이고 {Age}살입니다.");
    }
}

// 객체 생성 시 생성자 호출
Person p1 = new Person("영희", 30);
p1.SayHello();  // 안녕하세요, 저는 영희이고 30살입니다.

4. 필드와 속성(Property)

 필드(Field)

클래스 내부에서 데이터를 저장하는 변수

class Car
{
    public string brand;  // 필드
}

 속성(Property)

  • 필드에 캡슐화(Encapsulation) 를 적용한 개념
  • get, set 접근자를 사용하여 값을 읽고 변경할 수 있음
  • 외부에서 접근을 제한할 수도 있음 (private 필드 사용)
class Car
{
    private string brand;  // private 필드

    // 속성 (Property)
    public string Brand
    {
        get { return brand; }   // Getter
        set { brand = value; }  // Setter
    }
}

// 사용
Car myCar = new Car();
myCar.Brand = "BMW";   // Setter 호출
Console.WriteLine(myCar.Brand);  // Getter 호출 -> BMW

 자동 구현 속성

필드 없이 간단하게 속성을 정의할 수도 있음

class Car
{
    public string Brand { get; set; }  // 자동 속성
}

Car myCar = new Car { Brand = "Tesla" };
Console.WriteLine(myCar.Brand);  // Tesla

5. 메서드(Method)

클래스 내부에서 기능(행동)을 정의하는 함수

class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

Calculator calc = new Calculator();
Console.WriteLine(calc.Add(3, 5));  // 8

6. 정적(Static) 멤버

 정적 필드 및 정적 메서드

  • static 키워드를 사용하여 클래스 차원의 멤버를 선언
  • 객체를 생성하지 않고 클래스명으로 직접 접근 가능
class MathUtil
{
    public static double Pi = 3.14159;  // 정적 필드

    public static int Square(int x)  // 정적 메서드
    {
        return x * x;
    }
}

Console.WriteLine(MathUtil.Pi);        // 3.14159
Console.WriteLine(MathUtil.Square(4)); // 16

7. 상속(Inheritance)

부모 클래스의 기능을 자식 클래스에서 물려받는 개념

// 부모 클래스
class Animal  
{
    public string Name;

    public void Speak()
    {
        Console.WriteLine($"{Name}가 소리를 냅니다.");
    }
}

// 자식 클래스 (Animal을 상속)
class Dog : Animal  
{
    public void Bark()
    {
        Console.WriteLine($"{Name}가 멍멍 짖습니다.");
    }
}

// 사용
Dog myDog = new Dog();
myDog.Name = "바둑이";
myDog.Speak();  // 바둑이가 소리를 냅니다.
myDog.Bark();   // 바둑이가 멍멍 짖습니다.

8. 인터페이스(Interface)

클래스가 구현해야 하는 메서드 목록을 정의

interface IFlyable  
{
    void Fly();  // 구현해야 할 메서드
}

class Bird : IFlyable  
{
    public void Fly()
    {
        Console.WriteLine("새가 날아갑니다.");
    }
}

Bird myBird = new Bird();
myBird.Fly();  // 새가 날아갑니다.

9. 추상 클래스(Abstract Class)

공통 기능을 제공하지만 직접 객체를 생성할 수 없는 클래스

abstract class Animal  
{
    public abstract void MakeSound();  // 추상 메서드
}

class Cat : Animal  
{
    public override void MakeSound()
    {
        Console.WriteLine("야옹!");
    }
}

Cat myCat = new Cat();
myCat.MakeSound();  // 야옹!

10. 클래스 사용 예제 (응용)

class BankAccount  
{
    private double balance;

    public void Deposit(double amount)
    {
        balance += amount;
        Console.WriteLine($"입금: {amount}원, 잔액: {balance}원");
    }

    public void Withdraw(double amount)
    {
        if (amount > balance)
        {
            Console.WriteLine("잔액 부족!");
        }
        else
        {
            balance -= amount;
            Console.WriteLine($"출금: {amount}원, 잔액: {balance}원");
        }
    }
}

// 사용
BankAccount account = new BankAccount();
account.Deposit(1000);
account.Withdraw(500);
account.Withdraw(700);

출력:

입금: 1000원, 잔액: 1000원  
출금: 500원, 잔액: 500원  
잔액 부족!  

 정리:

클래스: 데이터(필드)와 동작(메서드)을 포함하는 객체의 설계도
생성자: 객체가 생성될 때 호출되는 특별한 메서드
속성(Property): get과 set을 이용한 필드 접근 방법
정적 멤버: static 키워드를 사용하여 클래스 단위에서 사용 가능
상속: 부모 클래스의 기능을 자식 클래스가 물려받음
인터페이스: 클래스가 반드시 구현해야 할 메서드를 정의
추상 클래스: 일부 구현을 포함하지만 직접 객체 생성 불가