본문 바로가기

Q&A

[Q&A] 1. 디자인 패턴 및 프로그래밍 패러다임

1. 싱글톤 패턴에 대해 설명하고 장단점을 설명하시오.

클래스에 하나의 인스턴스만 만들어, 단일 인스턴스를 모듈이 공유합니다. 
단일 인스턴스 기반으로 로직을 설계합니다. 데이터베이스 연결 모듈에 많이 사용됩니다.
장점으로는 인스턴스 생성비용이 감소합니다. 
따라서 인스턴스 생성 비용이 많이 드는 I/O바운드 작업(네트워크 연결, 데이터베이스 연결 등 )에 많이 사용됩니다.
단점으로는 단일 인스턴스에 모듈들이 종속되기에 의존성이 높아집니다.

+추가 답변: 따라서 TDD(Test Driven Development)에서는 걸림돌이 될 수 있습니다.
TDD에서는 단위 테스트를 주로 하기에 테스트가 서로 독립적이고 어떤 순서로든 실행가능해야합니다.
하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패펀이므로 
각 테스트마다 '독립적인' 인스턴스를 생성하기 어렵습니다.

2. OOP에 대해서 설명해주세요.

OOP는 Object Oriented Programming 객체지향 프로그래밍을 뜻합니다. 
명령형 프로그래밍에 속하고 프로그램을 수많은 객체(object)로 나누고 
이를 기본단위로 객체의 상호작용으로 표현하는 프로그램 설계방법론입니다.

+추가 답변 : 설계에 많은 시간이 소요되며, 캡슐화와 특유의 격리구조로 인해 
처리속도가 다른 프로그래밍 패러다임(절차지향형)에 비해 상대적으로 느릴 수도 있습니다.

3. 객체지향의 특징에 대해서 설명해주세요.

AEIP (Abstracion / Encapsulation / Inheritance / Polymorphism)
객체지향의 특징인 추상화/캡슐화/상속성/다형성에 대해 설명드리겠습니다.
(1) 추상화
추상화는 객체들의 공통적인 핵심 개념, 기능, 속성을 도출하는 것입니다.
예를 들어 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있습니다.
(+추가 답변 : 클래스가 없는 객체지향 언어도 존재-Javascript)
(2) 캡슐화
객체의 속성과 메서드를 하나로 묶고 일부를 외부로부터 은닉하는 것입니다.
데이터와 로직을 외부에서 알 수 없도록하고, 구조/역할/기능을 하나의 캡슐로 만드는 방법입니다.
(+추가 답변 : 외부와 상호작용을 위해서는 메서드를 이용할 수 있습니다. )
(3) 상속성 
상위 클래스의 특성을 하위클래스가 이어받아 재사용하거나 추가, 확장하는 것을 말합니다.
코드의 재사용성, 계층적 관계 생성, 그리고 유지보수성 측면에서 중요합니다.
(4) 다형성
하나의 메서드나 클래스가 다양한 방법으로 동작하는 것을 뜻합니다.
(+추가 답변 : 동일한 명령의 해석을 연결된 객체에 의존합니다. )
대표적으로 오버로딩과 오버라이딩이 있습니다.

4. 오버 로딩과 오버 라이딩의 차이점에 대해서 설명해주세요.

오버로딩은 하나의 클래스에서 동일한 이름의 메서드를 여러개 정의한 후 
매개변수를 다르게 하여 동일 이름을 경우에 따라 호출하여 사용하는 것입니다.
(+추가 답변 : 컴파일 중 발생하는 정적 다형성입니다. )
오버라이딩은 상위 클래스에서 상속받은 메서드 내용을 
하위 클래스에서 변경하여 사용하는 것으로 리턴타입이 동일해야합니다.
(+추가 답변 : 크레이지 아케이드 캐릭터 생성. 배찌/우니/마리드)

5. 객체지향 5대 원칙에 대해서 설명해주세요.

객체지향의 다섯가지 설계원칙으로는 
단일 책임 원칙/개방폐쇄 원칙/리스코프 치환 원칙/인터페이스 분리 원칙/의존성 역전 원칙이 있습니다.

(1) 단일 책임 원칙    
객체와 클래스는 오직 단일 책임만 가져야한다는 것입니다. 
예를 들어 계산을 위한 클래스에 번역 메서드가 있어서는 안되는 것입니다.
(2) 개방 폐쇄 원칙    
객체는 확장에 대해 개방적이고 수정에 대해서는 폐쇄적이어야한다는 원칙입니다.
기존 코드의 수정은 최소화하면서도 확장을 쉽게할 수 있어야한다는 것입니다.
(3) 리스코프 치환 원칙
프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야합니다.
(+추가 답변 : 해당원칙은 상속의 본질로서 이를 지키지 않으면 부모 클래스의 본래 의미가 변하기에 
is-a 관계(EX 상속관계, '사람은 동물이다', '소도 동물이다')가 망가져 다형성이 안 지켜짐.)
(4) 인터페이스 분리 원칙
클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야합니다.
이를 어길 시 자신이 사용하지 않는 메서드가 수정되는 경우에도 
자신 또한 다시 컴파일하여 배포되어야하는 문제가 있습니다.
(5) 의존성 역전 원칙
추상성이 높고 안정적인 고수준의 클래스는 구체적이고 불안정한 저수준 클래스에 의존해서는 안됩니다.
상위계층은 하위 계측의 변화에 대해 독립적이어야합니다.

6. MVC 패턴을 설명하고 MVVM 패턴과의 차이점을 설명하세요.

MVC 패턴은 모델, 뷰, 컨트롤러로 이루어진 디자인 패턴입니다. 앱의 구성 요소를 세 가지 역할로 구분하기에 
개발 프로세스에서 각자 구성 요소에만 집중 할 수 있고 재사용성와 확장성이 용이하다는 장점이 있습니다.
애플리케이션이 복잡해질수록 모델과 뷰의 관계가 복잡해지는 단점이 있습니다.
MVVM패턴은 MVC의 C에 해당하는 컨트롤러가 뷰모델로 바뀐 패턴입니다. 뷰모델은 뷰를 더 추상화한 계층이며, 
MVVM패턴은 MVC패턴과 달리 커맨드와 데이터 바인딩을 가지는 것이 특징입니다.
뷰와 뷰모델 사이의 양방향 데이터 바인딩을 지원하며 
UI를 별도의 코드 수정없이 재사용할 수 있고 단위 테스팅이 쉽다는 장점이 있습니다.

7. 옵저버 패턴에 대해서 설명해보세요.

8. 옵저버 패턴을 어떻게 구현하나요?

9. 프록시 서버를 설명하고 사용 사례에 대해 설명하세요.

Reference
http://www.incodom.kr/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5
https://developer-dson.tistory.com/18

도서 | 면접을 위한 CS 전공지식 노트

'Q&A' 카테고리의 다른 글

3. 네트워크 Q&A  (0) 2022.10.29
2. 기본적인 기술면접 질문 및 답변  (0) 2022.10.24