본문 바로가기

C#/Knowledge

객체지향 프로그래밍


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

인터페이스를 사용하는 방법이 있다.
모든 도형 클래스가 동일한 CalculateArea 메서드를 갖게 만들어 AreaCalculator가 도형 객체를 통해 면적을 계산할 수 있다.

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

ⓐ 인터페이스 구현의 강제성
모든 새로운 도형 클래스는 IArea 인터페이스를 구현해야 한다.

ⓑ 형 변환 및 타입 검사
AreaCalculator 클래스가 다양한 도형의 면적을 계산할 수 있도록 하려면 인터페이스를 통해 접근해야 한다. 이는 코드의 가독성과 유지보수성을 저하시킬 수 있다.

ⓒ 개방-폐쇄 원칙의 위반 가능성
새로운 도형을 추가할 때 AreaCalculator 클래스는 수정할 필요가 없지만, 인터페이스에 변화를 가하는 경우 기존 도형 클래스들도 수정해야 하는데, 이는 개방-폐쇄 원칙에 어긋날 수 있다.

ⓓ 설계 패턴의 미적용
전략 패턴을 적용하면 다양한 면적 계산 로직을 캡슐화하여 코드의 유연성을 높일 수 있습다. 현재는 모든 계산 로직이 각 도형 클래스에 분산되어 있어 유지보수가 어렵다.

 

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

SOLID 원칙은 객체지향 프로그래밍 및 설계의 5가지 기본 원칙을 나타내며, 코드의 유연성, 재사용성, 유지보수성을 향상시키기 위해 제안된 것으로, 원칙은 다음과 같다.

① 단일 책임 원칙
클래스는 하나의 책임만 가져야 하며, 클래스는 그 책임을 완전히 캡슐화해야 한다.

② 개방-폐쇄 원칙
소프트웨어 구성 요소는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.
즉, 새로운 기능을 추가할 때 기존 코드를 변경하지 않고 확장할 수 있어야 한다.

③ 리스코프 치환 원칙
서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.
즉, 프로그램의 객체는 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 바꿔도 정상적으로 작동해야 한다.

④ 인터페이스 분리 원칙
인터페이스는 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록 작게 분리해야 한다.

⑤ 의존 역전 원칙
고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다.
추상화는 구체적인 것에 의존해서는 안 된다.

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

다형성 : 객체지향 프로그래밍의 핵심 개념 중 하나로, 동일한 인터페이스를 통해 서로 다른 데이터 타입을 처리할 수 있는 능력을 의미하며, 주로 두 가지 형태로 나타난다.

ⓐ 컴파일 시간 다형성 : 메서드 오버로딩 및 연산자 오버로딩을 통해 구현
ⓑ 런타임 다형성 : 상속과 인터페이스를 활용한 메서드 오버라이딩을 통해 구현

다형성을 활용한 설계의 장점 : 유연성/ 확장성/ 재사용성/ 유지보수성

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

Override : 메서드 오버라이딩으로 상위 클래스에서 정의된 메서드를 하위 클래스에서 재정의하는 것
Overload : 메서드 오버로딩으로 동일한 이름의 메서드를 매개변수의 타입, 개수, 순서가 다르게 여러 개 정의하는 것

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

확장 메서드 : 기존 클래스나 구조체를 수정하지 않고도 새로운 메서드를 추가할 수 있는 기능이다.
정적 클래스 내에 정적 메서드로 정의되며, 첫 번째 매개변수에 this 키워드를 사용하여 확장할 타입을 지정

확장 메서드 활용의 장점 : 기존 코드 수정 없이 기능 추가/ 가독성 향상/ 유연성