본문 바로가기
프로그래밍/C#

객체 지향 프로그래밍

by 오 복 이 2024. 11. 13.

이번 글에서는 C#의 **객체 지향 프로그래밍(Object-Oriented Programming, OOP)**의 기본 개념을 다룹니다. 객체 지향 프로그래밍은 C#의 핵심 개념으로, 프로그램을 구성할 때 클래스와 객체를 사용해 코드의 구조를 정의하고 데이터를 관리합니다. 이 글에서는 클래스와 객체, 속성(Property)과 메서드(Method), 접근 제한자, 생성자와 소멸자에 대해 자세히 설명합니다.

 


클래스와 객체의 개념

클래스는 객체의 설계도와 같은 역할을 하는 데이터 구조로, 속성과 메서드(기능)를 정의합니다. 객체는 클래스를 기반으로 생성된 실체로, 메모리에 할당된 후 프로그램에서 실제로 사용됩니다.

클래스와 객체 예제

using System;

class Person // Person이라는 클래스를 정의
{
    // 클래스의 속성 선언
    public string Name; // 이름 속성
    public int Age; // 나이 속성

    // 클래스의 메서드 선언
    public void Introduce() // 인사를 출력하는 메서드
    {
        Console.WriteLine($"안녕하세요, 저는 {Name}이고, 나이는 {Age}살입니다.");
    }
}

class Program
{
    static void Main()
    {
        // 객체 생성 및 속성 초기화
        Person person1 = new Person(); // Person 클래스 기반으로 person1 객체 생성
        person1.Name = "홍길동"; // 속성 설정
        person1.Age = 30;

        // 객체의 메서드 호출
        person1.Introduce(); // 출력: 안녕하세요, 저는 홍길동이고, 나이는 30살입니다.
    }
}
 

💡 Person 클래스는 이름과 나이라는 속성, 인사를 출력하는 Introduce 메서드를 가집니다. person1은 Person 클래스의 인스턴스(객체)로, Name과 Age 속성을 설정하고 Introduce 메서드를 호출할 수 있습니다.


 

 

속성(Property)과 메서드(Method)

속성은 객체의 데이터(상태)를 나타내며, 메서드는 객체의 동작을 정의합니다. 속성과 메서드를 적절히 활용하면 클래스의 내부 데이터를 관리하고 원하는 동작을 수행할 수 있습니다.

속성 예제

속성은 간단하게 필드에 접근할 수 있도록 돕는 요소입니다. 일반적으로 get과 set 접근자를 사용하여 속성을 정의합니다.

 
class Car
{
    // 속성 선언
    public string Color { get; set; } // 차의 색상
    public string Model { get; set; } // 차의 모델

    // 메서드 선언
    public void Drive()
    {
        Console.WriteLine($"{Color} 색상의 {Model} 차가 주행 중입니다.");
    }
}

class Program
{
    static void Main()
    {
        Car car = new Car();
        car.Color = "빨강"; // 속성 설정
        car.Model = "BMW";

        car.Drive(); // 출력: 빨강 색상의 BMW 차가 주행 중입니다.
    }
}

💡 Color와 Model 속성은 get과 set 접근자를 사용해 정의되었습니다. 이로 인해 Color나 Model에 값을 쉽게 할당하거나 가져올 수 있습니다.


 

접근 제한자 (public, private, protected, internal)

접근 제한자는 클래스의 멤버(속성, 메서드 등)에 접근할 수 있는 범위를 지정합니다. C#에서 주로 사용되는 접근 제한자는 다음과 같습니다.

접근 제한자 접근 제한자
public 모든 곳에서 접근 가능
private 해당 클래스 내에서만 접근 가능
protected 해당 클래스와 파생 클래스에서만 접근 가능
internal 같은 어셈블리(프로젝트) 내에서만 접근 가능

접근 제한자 예제

 
class BankAccount
{
    // private 접근 제한자: 외부에서 직접 접근할 수 없음
    private decimal balance = 0; // 잔액

    // public 메서드를 통해 balance에 간접 접근
    public void Deposit(decimal amount)
    {
        balance += amount;
        Console.WriteLine($"입금된 금액: {amount}원, 현재 잔액: {balance}원");
    }

    public void Withdraw(decimal amount)
    {
        if (amount <= balance)
        {
            balance -= amount;
            Console.WriteLine($"출금된 금액: {amount}원, 현재 잔액: {balance}원");
        }
        else
        {
            Console.WriteLine("잔액이 부족합니다.");
        }
    }
}

class Program
{
    static void Main()
    {
        BankAccount account = new BankAccount();
        account.Deposit(50000); // 입금된 금액: 50000원, 현재 잔액: 50000원
        account.Withdraw(20000); // 출금된 금액: 20000원, 현재 잔액: 30000원
    }
}

💡 balance 필드는 private로 설정되어 클래스 외부에서 직접 접근할 수 없습니다. 대신, Deposit과 Withdraw 메서드를 통해 간접적으로 접근하게 됩니다. 이렇게 하면 데이터의 무분별한 수정이나 오류를 방지할 수 있습니다.

 


 

 

 

생성자와 소멸자

생성자는 객체가 생성될 때 호출되는 특별한 메서드로, 객체 초기화를 담당합니다. 생성자는 클래스 이름과 동일하며 반환 타입이 없습니다. 소멸자는 객체가 메모리에서 삭제될 때 호출됩니다.

생성자 예제

class Book
{
    public string Title { get; set; }
    public string Author { get; set; }

    // 생성자: Book 객체가 생성될 때 제목과 저자를 초기화
    public Book(string title, string author)
    {
        Title = title;
        Author = author;
    }

    public void PrintInfo()
    {
        Console.WriteLine($"책 제목: {Title}, 저자: {Author}");
    }
}

class Program
{
    static void Main()
    {
        // 생성자를 통해 객체 초기화
        Book book = new Book("C# 프로그래밍", "홍길동");
        book.PrintInfo(); // 출력: 책 제목: C# 프로그래밍, 저자: 홍길동
    }
}
 

💡 생성자를 사용하면 객체 생성과 동시에 필수 속성을 설정할 수 있습니다. Book 클래스의 생성자는 제목과 저자를 초기화하며, PrintInfo 메서드를 통해 책 정보를 출력할 수 있습니다.

소멸자 예제

소멸자는 ~클래스이름 형태로 정의하며, 객체가 소멸될 때 자동으로 호출되어 메모리를 정리하는 역할을 합니다.

class Sample
{
    public Sample()
    {
        Console.WriteLine("Sample 객체가 생성되었습니다.");
    }

    // 소멸자: 객체가 소멸될 때 호출
    ~Sample()
    {
        Console.WriteLine("Sample 객체가 소멸되었습니다.");
    }
}

class Program
{
    static void Main()
    {
        Sample sample = new Sample();
        // Sample 객체가 소멸될 때 소멸자가 호출됨
    }
}

💡 소멸자는 주로 파일이나 데이터베이스 연결을 종료하거나 메모리를 정리할 때 유용하게 사용됩니다. 다만, .NET은 가비지 컬렉션(Garbage Collection) 시스템이 있으므로 소멸자를 직접 정의하는 일은 드물며, 특별히 정리가 필요한 경우에만 사용합니다.


 

728x90
반응형