본문 바로가기

개발자 면접준비

[Daily] 3월 27일 데일리 과제

Q. 객체지향 프로그래밍(OOP)에 대해 설명해주세요. (알고있는 원칙이나 키워드를 언급해주세요)

A.프로그래밍 패러다임 중에 하나로, 현실 세계의 개념들을 프로그래밍에 반영하여 코드의 재사용성과 유지보수성, 확장성 등을 개선하고자 하는 목적을 가지고 있습니다. OOP에서는 프로그램을 객체 단위로 분해하여 각 객체가 데이터와 메서드를 포함하는 캡슐화된 독립적인 개체로서 작동합니다. 객체는 클래스를 통해 정의되며, 클래스는 객체를 생성하기 위한 템플릿으로서 객체의 공통적인 속성과 동작을 정의합니다. 그러나 OOP는 코드의 재사용성과 유지보수성을 높이는 장점이 있기는 하지만 객체 간의 상호작용이 많아 질 수록 복잡도가 증가 할 수 있습니다. 따라서 적절한 객체 설계와 디자인 패턴의 적용이 반드시 필요하다고 생각합니다. 

 

* OOP의 장점과 단점

[장점]

1. 코드 재사용성 증가 : 상속을 통해 프로그래밍 시 코드의 재사용성을 높일 수 있다 

2. 생산성 향상 : 잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로서 개발의 생산성을 향상 시킬 수 있다. 

3. 자연적인 모델링 : 생각하고 있는 것들을 그대로 자연스럽게 구현할 수 있다. 

4. 유지보수의 우수성 : 프로그램 수정 시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기 때문에 유지보수가 비교적 쉽게 이루어지기 때문에 경제적이라고 할 수 있다. 

[단점]

1. 개발 속도가 느릴 수 있다 : 객체가 처리하려는 것에 대한 정확한 이해가 필요하기 때문에 설계 단계에서부터 많은 시간이 소요될 수 있다. 

2. 실행속도가 느린점 : 객체 지향언어는 클래스, 객체, 상속 및 다형성과 같은 개념의 추가 오버헤드 때문에 실행 시간에 추가적인 작업을 수행하게 되어 성능을 저하시킬 수 있다. 

3. 코드 재사용성 문제 : 객체지향 프로그래밍에서는 상속을 통해 코드를 재사용 할 수 있지만, 재사용성이 떨어지는 경우가 있다. 상속을 과도하게 사용하면 코드의 유지보수가 어려워질 수 있다. 또한 상속 자체가 일반적으로 컴파일 시간을 늘리므로 실행 속도가 느려질 수 있다.

 

* OOP의 특징 4가지

1. 캡슐화

- 캡슐화는 데이터와 그 데이터를 다루는 메서드를 하나의 단위로 묶는 것을 의미한다. 이는 객체의 내부 구현 정보를 외부에서 직접 접근할 수 없도록 하고, 데이터의 일관성을 유지할 수 있도록 한다. 

 

2. 추상화

- 복잡한 시스템을 단순화 할 수 있도록 모델화 하는 것을 말하며, 이로 인하여 코드의 이해도와 유지보수성을 높일 수 있다. 추상화는 인터페이스나 추상 클래스를 통해 구현될 수 있다.

 

3. 상속성

- 부모 클래스가 가진 특성을 자식 클래스가 물려받는 것을 의미하며, 이를 통해 자식 클래스는 부모 클래스의 메서드와 변수를 그대로 이용할 수 있으며, 코드의 재사용성과 유지보수성을 높일 수 있다. 

 

4. 다형성

- 다형성은 같은 메서드를 호출하지만 객체에 따라 다른 동작을 수행할 수 있도록 하는 것을 의미한다. 이를 통해 코드의 재사용성을 높일 수 있으며, 유연성과 확장성을 높일 수 있다. 

 

 

Q. REST API란 무엇인가요? (모두가 답변)

A. HTTP와 URI를 사용하여 웹서비스를 제공하는 소프트웨어 아키텍처 스타일이다.

인터넷 브라우저와 같은 웹 클라이언트를 통해 간단하게 호출하고 사용할 수 있으며, 이를 통해 다양한 플랫폼과 언어를 통한 이용이 가능하고, 유연성과 확장성이 뛰어난 API를 만들 수 있다는 장점이 있습니다. 

 

REST API의 주요 특징은 총 네가지가 있습니다. 

1. 리소스 중심 : 모든것을 리소스로 간주하기 때문에 URI는 리소스를 식별하기 위해 사용되며, 리소스의 행동은 HTTP메서드를 사용하여 정의한다. (GET, POST, PUT, PATCH)

 

2. 무상태성 : REST API는 클라이언트의 상태 정보를 유지하지 않는다. 각 요청은 서버로부터 독립적으로 처리되며, 서버는 이전 요청의 상태 정보를 기억하지 않는다. 이를 통해 확장성과 유연성이 높아짐

 

3. 자체 표현성 : REST API는 자체적으로 설명되어 있어, 클라이언트가 리소스에 대한 정보를 이해하기 쉽다. 이는 HTTP메서드와 URI를 사용하여 리소스와 해당 동작을 명시하고, 메세지 헤더를 사용하여 MIME유형과 캐싱, 브라우저 측에서 요청 및 응답을 처리하는 방법 등에 대한 정보를 제공한다. 

 

4. 연결 지향성 : REST API는 클라이언트와 서버 간의 통신을 통해 자원의 상태 변화를 전달한다. 이를 통해 클라이언트와 서버 간의 상호 작용이 가능 해짐.

 

Q. 프로젝트에 REST API를 사용한 이유가 무엇인가요? (프로젝트에 REST API를 사용하셨을 경우에만 추가 답변)

A.  REST API는 간편한 사용이 가능합니다. HTTP 메서드와 URI를 사용하여 리소스와 해당 동작을 명시하므로, 호출 및 사용이 간편합니다. 또한 REST API는 언어나 플랫폼에 종속되지 않기 때문에 다양한 클라이언트 및 서버 간 상호 작용이 가능하며, REST API는 자원을 고유한 URI로 식별하므로 새로운 자원이 추가되거나 기존 자원이 변경되어도 API 디자인을 변경할 필요가 없어 유지보수성과 확장성이 높기 때문에 사용하게 되었습니다.

-> 프로젝트와 더 밀접하게 연관지어서 설명해줘야 할듯..

 

Q. REST API 말고 다른 비교할만한 것을 알고 있나요?

A. SOAP API, gRPC, GraphQL, Falcor 총 네가지가 있으며, 대표적으로 SOAP API는 XML기반의 프로토콜로, 메세지 전송을 위한 표준화된 프로토콜이라고 알고 있습니다. SOAP API를 사용하기 위한 프로토콜의 종류로는 HTTP, SMTP, FTP등의 프로토콜을 사용할 수 있으며 SOAP API는 메세지를 전송하는데 있어서 REST API보다 더 많은 오버헤드와 복잡성을 가지고 있습니다. SOAP API는 REST API에 비해서 복잡하고 무거우며 따라서 사용하는 시스템의 특성과 목적에 맞게 선택하여 사용해야 된다고 생각합니다. 

 

* (간략한 요약 : SOAP API는 XML 기반의 메시지 교환을 통해 서비스를 제공하며, GraphQL은 클라이언트에서 필요한 데이터만 요청할 수 있는 쿼리 언어입니다.)

 

 

[헷갈리는 용어사전]

* API : Application Programming Interface의 약자로 응용 프로그램에서 서비스를 요청하거나 데이터를 전송하기 위한 인터페이스를 의미한다. 즉. 다른 소프트웨어나 시스템이 해당 서비스나 데이터를 활용하기 위한 방법을 제공하는 것

대게 API는 웹 서비스나 모바일 애플리케이션에서 사용된다. 

 

* 소프트웨어 아키텍처 스타일 : 소프트웨어 시스템을 설계하고 구축하기 위한 일련의 원칙과 규칙을 정의하는 것. 

아키텍처 스타일은 특정한 문제를 해결하기 위한 아키텍처 패턴의 집합으로서,

일반적으로 소프트웨어 시스템 구조, 구성요소 및 구성요소간의 상호작용을 정의한다.  

 

* 오버헤드 : 어떤 처리를 수행할 때, 실제로 처리에 필요한 시간 이상으로 추가적인 시간, 메모리, 대역폭, 프로세서 등의 자원을 소모하는 것을 말함. 처리해야 할 작업 외에 발생하는 부가적인 작업이나 소모되는 자원을 의미한다. 

(오버헤드는 일반적으로 성능을 저하시키는 요인 중 하나로서, 시스템 최적화 및 개선을 위해서는 오버헤드를 최소화 하는 것이 중요하다)

 

* 프로토콜 : 컴퓨터 네트워크에서 통신을 원활하게 하기 위해 약속된 규칙의 집합.

프로토콜은 보통 물리계층, 데이터 링크 계층, 네트워크 계층, 전송 계층, 세션 계층, 표현 계층, 응용 계층 등과 같은 다층의 프로토콜 아키텍처에서 사용된다. 각 계층마다 해당 계층에서 사용하는 규칙과 기능을 정의하여, 상위 계층은 하위 계층을 사용하여 데이터를 전송하고, 하위 계층은 상위 계층에서 받은 데이터를 다음 계층으로 전달하는 방식으로 데이터를 처리하게 된다. 일반 적으로 인터넷에서 사용되는 대표적인 프로토콜은 TCP/IP프로토콜로서 이외에도 HTTP, FTP, SMTP, POP3, IMAP등 다양한 프로토콜이 존재함