본문 바로가기

내일배움캠프/꾸준CS과제

[TIL 24.07.02] 02. 객체지향 프로그래밍

글의 요약 설명 부분.

 

 


확인 문제

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}");
    }
}

 

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

AreaCalculator에 Triangle 관련 코드를 추가하지 않는 이상 AreaCalculator를 이용해 삼각형의 넓이를 계산할 수는 없다. 

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

새로운 도형이 생길 때마다 새로운 코드를 추가해주어야 하기 때문에 이 코드는 유지보수가 어렵다. 
만약 여러 도형을 아우르는 Shape라는 이름의 추상클래스가 존재한다면 AreaCalculator에서 이 Shape 클래스를 인자로 받음으로써 추가적인 코드 없이도 면적을 계산해주는 구현을 해낼 수 있을 것이다.


 

설명 문제

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

S: 단일 책임의 원칙, 각 클래스는 하나의 기능만을 가진다.
O: 개방폐쇄의 원칙, 소프트웨어의 각종 구성요소 - 클래스, 메서드, 모듈 등 -는 확장에는 열려있고, 변경에는 닫혀있어야 한다.
L: 리스코프 치환의 원칙, 서브 클래스는 언제나 베이스 클래스로 변환될 수 있어야 한다. 즉, 부모 클래스의 구현부를 자식클래스에서 무시해선 안된다.
I: 인터페이스 분리의 원칙, 클래스는 자신이 필요로 하는 인터페이스만을 구현해야 한다.
D: 의존성 역전의 법칙, 상세 구현은 언제나 추상적 표현에 의존해야 한다.

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

다형성이란 동일한 메서드에 대해 서로 다른 객체가 각각의 방법으로 응답할 수 있도록 하는 것이다. 
다형성의 장점으로는 유연한 코드 작성, 재사용성의 향상, 가독성 증가가 있다.

 

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

override란 같은 이름, 같은 인자를 가진 함수를 부모-자식 클래스 관계에서 다시 사용할 때 사용되는 방식이다. 
overload란 같은 이름, 다른 인자를 가진 함수를 하나의 클래스 내에서 정의하는 것이다. 비슷한 기능을 다른 인자와 자료형으로 구현하려 할 때 주로 사용된다.

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

확장 메서드는 기존의 클래스를 수정하지 않고 새로운 메서드를 추가하는 기능이다. 
별도의 정적 클래스에 확장 메서드를 static으로 선언함으로써 활용할 수 있다. 


 

실습 문제

namespace _02.객체지향_프로그래밍_실습
{
    public static class ArrayExtension
    {
        public static double CalculateAverage(this int[] array)
        {
            // TODO: 확장 메서드 CalculateAverage를 구현하세요
            double result = array.Sum(x => x);
            //설명: 람다를 통해 array의 모든 값들의 합을 구하고, 그 값을 sumResult에 저장.

            return result / array.Length;
            //설명: 구하는 것은 평균이므로 array의 원소의 개수만큼 sumResult를 나누어줌.
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = { 1, 2, 3, 4, 5 };

            // 확장 메서드를 사용하여 배열의 평균값을 계산하고 출력
            double average = numbers.CalculateAverage();
            Console.WriteLine($"The average is: {average}");
        }
    }
}

.