본문 바로가기

내일배움캠프/꾸준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}");
            }
        }
    }

    .