본문 바로가기
Programming/C#

C# 클래스: 객체지향 프로그래밍의 기초

by Dev_카페인 2024. 6. 9.
반응형

[C#] 클래스: 객체지향 프로그래밍의 기초

 

안녕하세요! 이번 포스트에서는 C# 클래스에 대해 자세히 알아보겠습니다.

 

클래스란 무엇인가요?

클래스는 객체지향 프로그래밍에서 중요한 개념으로, 데이터와 해당 데이터를 다루는 메서드를 함께 묶어놓은 사용자 정의 데이터 타입입니다. 클래스를 사용하여 객체를 생성할 수 있으며, 이러한 객체는 클래스의 인스턴스입니다.

클래스의 구성 요소

필드 (Fields)

클래스 내부에 선언된 변수를 필드라고 합니다. 이러한 필드는 클래스의 상태를 나타내며, 클래스의 모든 메서드에서 사용할 수 있습니다.

public class Person
{
    public string Name; // 필드 선언
    public int Age;
}

메서드 (Methods)

메서드는 클래스 내부에 정의된 함수를 의미합니다. 이러한 메서드는 클래스가 수행할 수 있는 동작을 정의하며, 필드의 값을 조작하거나 다른 작업을 수행할 수 있습니다.

public class Person
{
    public string Name;
    public int Age;

	// 메서드
    public void DisplayInfo()
    {
        Console.WriteLine($"Name: {Name}, Age: {Age}");
    }
}

생성자 (Constructors)

생성자는 클래스가 인스턴스화될 때 호출되는 특별한 메서드입니다. 주로 필드를 초기화하는 데 사용됩니다.

public class Person
{
    public string Name;
    public int Age;

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

    public void DisplayInfo()
    {
        Console.WriteLine($"Name: {Name}, Age: {Age}");
    }
}

클래스의 활용

클래스를 사용하여 객체를 생성하고 다양한 작업을 수행할 수 있습니다.

class Program
{
    static void Main(string[] args)
    {
        // Person 클래스의 인스턴스 생성
        Person person1 = new Person("John", 30);
        Person person2 = new Person("Alice", 25);

        // 메서드 호출
        person1.DisplayInfo();
        person2.DisplayInfo();
    }
}

상속 (Inheritance)

C#에서는 상속을 통해 기존 클래스의 특성을 그대로 물려받아 새로운 클래스를 만들 수 있습니다.

public class Student : Person
{
    public int StudentId;

    public Student(string name, int age, int studentId) : base(name, age)
    {
        StudentId = studentId;
    }

    public void Study()
    {
        Console.WriteLine($"{Name} is studying.");
    }
}

 

추상화란 무엇인가요?

추상화는 복잡한 시스템이나 개념을 간결하게 표현하는 과정을 의미합니다. 객체지향 프로그래밍에서는 추상화를 통해 클래스를 정의하고, 해당 클래스의 인스턴스를 생성하여 현실 세계의 개념을 모델링할 수 있습니다.

추상 클래스 (Abstract Classes)

추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스입니다. 추상 메서드는 선언만 있고 구현이 없는 메서드로, 해당 메서드를 상속받는 클래스에서 반드시 구현해야 합니다.

public abstract class Shape
{
    public abstract double CalculateArea(); // 추상 메서드
}

인터페이스 (Interfaces)

인터페이스는 클래스가 구현해야 하는 메서드와 속성을 정의하는 역할을 합니다. 인터페이스를 통해 클래스 간의 통일된 계약을 정의할 수 있습니다.

public interface IShape
{
    double CalculateArea(); // 메서드 선언만
}

추상화의 장점

  1. 모듈화: 클래스와 인터페이스를 사용하여 코드를 모듈화할 수 있습니다.
  2. 재사용성: 추상화를 통해 작성된 코드는 다른 프로젝트나 모듈에서 쉽게 재사용할 수 있습니다.
  3. 유지보수성: 추상화를 사용하면 코드의 유지보수성을 높일 수 있습니다.

예시: 도형 계층 구조

public abstract class Shape
{
    public abstract double CalculateArea();
}

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }

    public override double CalculateArea()
    {
        return Width * Height;
    }
}

public class Circle : Shape
{
    public double Radius { get; set; }

    public override double CalculateArea()
    {
        return Math.PI * Radius * Radius;
    }
}

도형 계층 구조는 다양한 도형들을 객체지향적으로 모델링하는 방법입니다. 이러한 모델링은 클래스의 상속과 다형성을 통해 구현됩니다. 주로 추상 클래스나 인터페이스를 사용하여 공통된 특성을 정의하고, 각 도형의 특징을 구체적으로 정의합니다.

예시: 도형 계층 구조 구현

추상 클래스 Shape

먼저, 모든 도형에 대한 공통적인 특성을 정의하는 추상 클래스인 Shape을 만듭니다. 이 클래스는 도형의 면적을 계산하는 추상 메서드인 CalculateArea()를 포함합니다.

public abstract class Shape
{
    public abstract double CalculateArea();
}

구체 클래스 Rectangle

사각형을 나타내는 클래스인 Rectangle은 Shape 클래스를 상속받아 구현합니다. 사각형은 너비와 높이를 가지고 있으므로 이를 필드로 추가하고, CalculateArea() 메서드를 구현합니다.

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }

    public override double CalculateArea()
    {
        return Width * Height;
    }
}

구체 클래스 Circle

원을 나타내는 클래스인 Circle도 Shape 클래스를 상속받아 구현합니다. 원은 반지름을 가지고 있으므로 이를 필드로 추가하고, CalculateArea() 메서드를 구현합니다.

public class Circle : Shape
{
    public double Radius { get; set; }

    public override double CalculateArea()
    {
        return Math.PI * Radius * Radius;
    }
}

도형 계층 구조의 활용

위에서 정의한 도형 클래스들은 다음과 같이 사용할 수 있습니다.

class Program
{
    static void Main(string[] args)
    {
        Rectangle rectangle = new Rectangle { Width = 5, Height = 3 };
        Circle circle = new Circle { Radius = 2 };

        double rectangleArea = rectangle.CalculateArea();
        double circleArea = circle.CalculateArea();

        Console.WriteLine($"사각형의 면적: {rectangleArea}");
        Console.WriteLine($"원의 면적: {circleArea}");
    }
}

 

반응형