[ 확인 문제 ]
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는 Rectangle과 Circle 객체를 매개변수로 받아와서 각 메서드를 호출 하고 있기 때문에 Triangle은 계산할 수 없다.
2. 1번 질문 답변을 바탕으로 위 코드가 유지보수 측면이 어려운 부분을 설명해주세요.
: 다른 도형 클래스가 생길 때마다 해당 도형의 넓이를 계산하기 위한 코드들을 매번 또 작성해야 한다.
[ 설명 문제 ]
1. SOLID 원칙에 대해 설명해주세요.
: 객체 지향 설계 5대 원칙이다. S는 단일 책임의 원칙(Single Responsibility Principle)으로, 클래스는 하나의 기능만 가지며 그 하나의 책임을 다해야 한다는 원칙이다. O는 개방 폐쇄의 원칙(Open Close Principle)으로, 확장에는 열려있고 변경에는 닫혀있어야 한다는 원칙이다. L은 리스코프 치환 원칙(Liskov Substitution Principle)으로, 하위 타입은 상위 타입을 대체할 수 있어야 한다는 원칙이다. I는 인터페이스 분리 원칙(Interface WSegregation Principle)으로, 본인이 사용하지 않는 인터페이스는 구현하지 말아야 한다는 원칙이다. D는 의존 역전 원칙(Dependency Inversion Principle)으로, 고수준 모듈은 저수준 모듈의 구현에 의존하지 않고 저수준 모듈이 고수준 모듈에 의존해야 한다는 원칙이다.
<참고 자료>
- 객체지향 개발 5대 원리: SOLID(https://www.nextree.co.kr/p6960/)
- [OOP] 객체지향 프로그래밍의 5가지 설계 원칙, 실무 코드로 살펴보는 SOLID(https://mangkyu.tistory.com/194)
2. 객체지향 프로그래밍의 속성 중 하나인 다형성과 이를 활용한 설계의 장점에 대해 설명해주세요.
: 다형성은 같은 이름의 메서드가 상황에 따라 다른 동작을 수행하는 것이다. 동일한 로직을 수행할 때 중복된 코드를 작성하지 않고 재사용할 수 있으며 기능 확장에 유연한 구조를 가질 수 있다.
<참고자료>
- 객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화( https://codestates.com/blog/content/객체-지향-프로그래밍-특징)
3. override와 overload에 대해 설명해주세요.
: 오버라이드는 부모 클래스의 메서드를 자식 클래스에서 재정의하여 사용하는 것이고, 오버로드는 같은 메서드를 매개변수의 타입이나 개수를 달리해서 사용하는 것이다.
4. 확장 메서드에 대해 설명하고 어떻게 활용했는지 알려주세요.
: 확장 메서드는 클래스의 외부에서 기존 클래스의 메서드처럼 사용할 수 있는 새로운 메서드를 만드는 것이다.
<참고자료>
- [C#] 확장 메서드 (Extension Method) 설명과 예제(https://blockdmask.tistory.com/604)
[ 실습 문제 ]
💡 [Array에 기능 추가하기]
Array 클래스에 확장 메서드를 이용하여 배열의 평균값을 계산하는 기능을 추가하세요.
이 확장 메서드는 CalculateAverage라는 이름을 가지며, int[] 타입의 배열을 입력으로 받아 평균값을 double 타입으로 반환해야 합니다.
using System;
namespace ArrayExtensions
{
public static class ArrayExtension
{
public static double CalculateAverage(this int[] array)
{
// TODO: 확장 메서드 CalculateAverage를 구현하세요
//
}
}
class Program
{
static void Main(string[] args)
{
int[] numbers = { 1, 2, 3, 4, 5 };
// 확장 메서드를 사용하여 배열의 평균값을 계산하고 출력
double average = numbers.CalculateAverage();
Console.WriteLine($"The average is: {average}");
}
}
}
개별 코드
public static double CalculateAverage(this int[] array)
{
// TODO: 확장 메서드 CalculateAverage를 구현하세요
int sum = 0;
foreach(int num in array)
{
sum += num;
}
double result = sum / array.Length;
return result;
}
전체 코드
using System;
namespace ArrayExtensions
{
public static class ArrayExtension
{
public static double CalculateAverage(this int[] array)
{
int sum = 0;
foreach(int num in array)
{
sum += num;
}
double result = sum / array.Length;
return result;
}
}
class Program
{
static void Main(string[] args)
{
int[] numbers = { 1, 2, 3, 4, 5 };
// 확장 메서드를 사용하여 배열의 평균값을 계산하고 출력
double average = numbers.CalculateAverage();
Console.WriteLine($"The average is: {average}");
}
}
}
'Coding > CS' 카테고리의 다른 글
[내일배움캠프 60일차 TIL] 기술 면접 08. 선형 자료구조 - LinkedList (1) | 2024.07.10 |
---|---|
[내일배움캠프 53일차 TIL] 기술 면접 대비 01. 객체와 한정자 (0) | 2024.07.01 |