기술 지식을 쌓자 #2 객체지향 프로그래밍

덴바·2024년 7월 27일

기술 정리

목록 보기
2/6

이 포스팅은 제가 직접 공부하고 제 방식대로 내용을 정리한 글입니다.



using System;

// 사각형 클래스
public class Rectangle
{
    public double Width { get; set; }
    public double Height { get; set; }

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

// 원 클래스
public class Circle
{
    public double Radius { get; set; }

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

// 면적 계산기 클래스
public class AreaCalculator
{
    public double CalculateRectangleArea(Rectangle rectangle)
    {
        return rectangle.CalculateArea();
    }

    public double CalculateCircleArea(Circle circle)
    {
        return circle.CalculateArea();
    }
}

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

        AreaCalculator calculator = new AreaCalculator();

        double rectangleArea = calculator.CalculateRectangleArea(rectangle);
        double circleArea = calculator.CalculateCircleArea(circle);

        Console.WriteLine($"Rectangle Area: {rectangleArea}");
        Console.WriteLine($"Circle Area: {circleArea}");
    }
}

Q1. 위 코드에서 삼각형 Triangle 클래스를 새로 작성한다고 했을 때,
AreaCalculator의 코드를 수정하지 않고 AreaCalculator가 삼각형의 넓이를 계산하도록 만들 수 있을까요?

A1. 삼각형과 사각형의 넓이 계산 방식은 한끝 차이기 때문에 가능합니다.

Q2. 1번 질문 답변을 바탕으로 위 코드가 유지보수 측면이 어려운 부분을 설명해주세요.

AreaCalulator는 파라미터로 필요한 클래스를 받습니다. 이렇게 되면 계산할 도형이 늘어날 수록 Areaculator의 메서드는 계속해서 늘어나며 복잡해집니다. 또한 해당 클래스를 사용하기 위해서 해당 인스턴스를 정확히 넣어줘야하는 불편함이 생깁니다.

  • 이를 해결하기 위해서 추상 클래스나 인터페이스 등을 사용하여 보다 간결하고 확장성이 쉽게 설계해야 합니다.

Q1. SOLID 원칙에 대해 설명해주세요.

객체지향의 5가지 원칙입니다.

S : (Single Responsibility Principle : 단일 책임의 원칙) : 각 클래스는 단 하나의 책임을 수행해야 한다.

O : (Open Closed Principle : 개방 폐쇄의 원칙) : 클래스의 확장성이 보장되면서 수정은 최소한으로 제한되어야 한다.

L : (Liskv Substitution Principle : 리스코프 치환 원칙) : 자식 타입은 부모 타입으로 교체할 수 있어야 한다.

I : (Interface Segregation Principle : 인터페이스 분리 원칙) : 인터페이스를 각 용도에 맞게 분리해야 합니다.

D : (Dependency Inversion Principle : 의존 역전 원칙) : 상위 모듈이 하위 모듈에 의존하지 않고, 추상 클래스, 인터페이스 등을 이용하여 상위 계층을 하위 계층의 구현으로부터 독립할 수 있어야 한다.

Q2. 객체지향 프로그래밍의 속성 중 하나인 다형성과 이를 활용한 설계의 장점에 대해 설명해주세요.

다형성 활용하면 코드의 확장성, 유지보수성의 장점을 가질 수 있습니다.

Q3. override와 overload에 대해 설명해주세요.

override : 상속 관계에 있는 클래스 중 virtual이 선언된 메서드를 재정의하는 기능으로 부모 메서드에 새로운 기능을 추가할 수 있습니다.
overload : 같은 이름의 메서드를 여러 개 만들 수 있으며, 동일한 메서드 명 내에 메서드의 매개변수의 타입, 개수 등으로 차이를 둬서 오버로딩을 구현할 수 있습니다.

Q4. 확장 메서드에 대해 설명하고 어떻게 활용했는지 알려주세요.

확장 메서드란 기존 클래스 내에 존재하지 않는 메서드를 추가하여 확장할 수 있습니다. 확장 메서드의 장점은, int, string 등과 같이 변경 불가능한 클래스 및 타입에 기능을 추가 확장할 수 있습니다.

profile
배움의 광인

0개의 댓글