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 키워드를 사용하여 클래스 단위에서 사용 가능
상속: 부모 클래스의 기능을 자식 클래스가 물려받음
인터페이스: 클래스가 반드시 구현해야 할 메서드를 정의
추상 클래스: 일부 구현을 포함하지만 직접 객체 생성 불가