Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 인텔리제이
- c언어 기본
- git 오류
- 인스타
- 파이썬 알고리즘 인터뷰
- 코테
- Git
- 자료구조
- 스택
- python기초
- 참고X
- 그리디
- c언어
- c언어 제어문
- 4장
- 1주차(1)
- 데베시 1주차
- 최단거리
- Workbench
- 운체 1주차
- 5장
- git오류
- git기초
- DP
- 코딩테스트
- #코린이 #코딩 #할 수 있다
- 도커
- python자료형
- 백준
- python기본
Archives
- Today
- Total
하루살이 개발자
[CS] 개발상식 본문
# 면접 대비 cs스터디를 하면서 정리한 내용입니다
1. 라이브러리와 프레임워크에 대해 설명해 주세요
- 라이브러리
- 미리 작성된 코드의 모음으로 바로 사용 가능한 기능들의 집합입니다.
- 따라서, 개발자는 필요한 기능을 바로 가져와서 사용할 수 있습니다.
- 예시) Python pip로 설치한 패키지/모듈, STL, npm, JQuery 등
- 프레임워크
- 애플리케이션 구현에 있어서, 큰 구조를 결정하고 흐름을 제어하는 프로그램의 골격입니다.
- 예시) Java 서버 개발에 사용되는 Spring, Django, Flask, Android, Vue.js 등
- 라이브러리와 프레임워크의 차이?
- "제어 흐름의 주도권"이 어디에 있는지에 따라 차이가 있다
- 프레임워크: 전체적인 흐름을 제어하고 있으며, 개발자는 그 안에서 필요한 코드를 넣음 [주도권: 프레임워크]
- 라이브러리: 개발자가 전체적인 흐름을 만들며, 라이브러리를 사용 [주도권: 개발자]
- "제어 흐름의 주도권"이 어디에 있는지에 따라 차이가 있다
- [참고] IoC(Inversion of Control) 제어의 역전이란?
- 어떠한 일을 하도록 만들어진 "프레임워크"에 Control권한을 위임하는 것이다.
- 즉, 프로그램의 제어 흐름 구조가 뒤바뀐 것
2. Call By Value와 Call By Reference의 차이에 대해 설명해 주세요.
함수 호출 시 인자를 넘기는 방식에 대한 차이이다.
- Call By Value(값에 의한 호출) -> 값 복사 후 전달 / 값 변경시 변경x
- 인자로 전달할 변수의 값이 복사되어 인자로 전달되는 방식
- 함수 호출 시, 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.
- 장점
- 함수 안의 인자 값이 변경되더라도, 외부의 변수 값은 변경되지 않는다.
- 단점
- 복사를 하기 때문에, 메모리 사용량이 늘어난다.
- Call By Reference(참조에 의한 호출) -> 주소값 전달 / 값 변경시 같이 변경
- 인자로 전달할 변수의 주소가 복사되어 인자로 전달되는 방식
- 함수 호출 시, 메모리 공간 안에는 "함수를 위한 별도의 임시공간"이 생성된다.
- 장점
- 직접 참조를 하기 때문에 빠르다.
- 단점
- 함수 안에서 인자 값이 변경되면, 아규먼트로 전달된 객체의 값도 함께 변경된다.
- [추가 질문] 자바는 Call By Value일까, Call By Reference 일까?
- 자바는 원시 타입, 참조 타입 모두 Call By Value이다.
- 이유 추가하기
3. 테스트 주도 개발(TDD)이 무엇이고, TDD해야하는 이유는 무엇인지 설명하시오.
- TDD란?
- 개발 방법론 중 하나로, 비즈니스 코드가 아닌 테스트 코드를 먼저 작성하고 테스트 코드를 통과할 수 있는 개발 코드를 이후에 작성하는 방식으로 진행
- 과정
- 1. 테스트케이스 작성
- 2. 테스트 케이스를 통과하는 코드 작성
- 3. 작성한 코드 리팩토링
- TDD 개발주기
- Red
- 실패하는 테스트코드를 먼저 작성
- Green
- 테스트를 통과하는 실제 코드 작성
- Blue
- 중복코드 제거, 일반화 등의 리팩토링 수행
- Red
- 장점
- "요구조건에 대한 명확한 이해"를 해야 테스트 시나리오를 작성할 수 있기 때문에, 개발자는 요구사항에 만족하는 코드를 구현할 수 있다.
- 테스트 코드를 중심으로, 유지보수가 용이하다.
- 안전한 테스트: 전체 테스트 코드를 구동함으로써 새로운 기능이 추가됐을 때, 이전 기능에 대해 영향을 미칠 수 있는 가능성을 제거한다.
- TDD를 왜 해야할까?
- 개발자가 요구사항에 더욱 집중하고, 요구사항을 명확히 이해할 수 있게 된다.
- 사전에 다양한 케이스를 고려해봄으로써, 문제가 될 수 있는 잠재적 오류를 방어할 수 있다.
- 개발자가 의도한대로 로직이 동작하는지 빠르고 명확하게 알 수 있고, 로직에 대해 보증할 수 있다.
- 리팩토링 속도가 향상될 수 있다.
- 아키텍처와 로직이 깔끔해진다. (리팩토링 속도가 향상되기 때문에)
- 이후 다른 사람이 로직을 수정할 때, 로직의 변경에 대한 영향도가 명확하게 보인다.
- [추가] 모든 기능에 대해 테스트 코드를 작성하는 것은 현실적으로 불가능 할 수 있다. 어떻게 해야할까?
- 핵심 기능에 대해 우선적으로 테스트를 작성하면 된다.
- 핵심 기능이라는 것은, 서비스 이용에 필수적으로 필요한 기능을 의미한다.
- [꼬리질문] 리팩토링이란?
- 이미 존재하는 프로그램의 코드를 코드의 외부 동작은 그대로 둔 채, 내부의 코드를 정리하면서 개선하는 것을 말한다.
- 예시) 하나의 함수가 너무 클 때, 여러 함수로 분리하기 / 조건부 로직을 다형성으로 바꾸기 / 코드 중복 제거
- 리팩토링 목적
- 성능 최적화가 목표가 아니라, 코드를 신속하게 개발할 수 있게 만들어주고, 코드 품질을 좋게 만들어 준다.
- 장점
- 코드의 가독성을 높이고, 유지보수에 좋다
4. MVC 패턴에 대해 설명하시오.
- MVC 패턴이란?
- 모델, 뷰, 컨트롤러로 구성된 소프트웨어 디자인 패턴으로 사용자 인터페이스로부터 비즈니스 로직을 분리하여 보여지는 화면과, 그 이면에 실행되는 비즈니스 로직이 서로 다른 구성 요소에 존재하는 아키텍처이다.
- 모델
- 앱이 포함해야할 데이터를 저으이하며, 데이터의 상태 변화가 있을 때 컨트롤러와 뷰에 이를 통보하는 역할
- 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
- 뷰나 컨트롤러에 대해서 어떠한 정보도 알지 말아야 한다.
- 앱이 포함해야할 데이터를 저으이하며, 데이터의 상태 변화가 있을 때 컨트롤러와 뷰에 이를 통보하는 역할
- 뷰
- 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어오는 역할
- 모델이 가지고 있는 정보를 따로 저장해서는 안된다.
- 모델이나 컨트롤러와 같이 다른 구성요소를 몰라야 한다.
- 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어오는 역할
- 컨트롤러
- 모델과 뷰를 연결하는 역할. 사용자의 요청에 맞는 데이터를 모델에 요청하고, 데이터를 뷰에 반영하여 사용자에게 보여줌
- 모델이나 뷰에 대해 알고 있어야 한다.
- 모델이냐 뷰의 변경을 모니터링 해야 한다.
- 모델과 뷰를 연결하는 역할. 사용자의 요청에 맞는 데이터를 모델에 요청하고, 데이터를 뷰에 반영하여 사용자에게 보여줌
- 장점
- 비교적 간단한 패턴으로 구조 파악과 확장이 쉽다.
- 모델 - 뷰 - 컨트롤러를 구분해서 개발함으로서 동시 다발적인 개발이 가능하다.
- 단점
- 뷰와 모델의 완벽한 분리가 어렵다.-> 뷰와 모델의 의존성 문제**
- 설계단계에서 클래스가 많아져 구조가 복잡해질 수 있다.
- 프로젝트가 커지면서 컨트롤러의 코드양이 많아져 유지보수가 힘들다.
- MVC 패턴을 사용하는 프레임워크나 라이브러리는?
- php, AngularJS, Django, Spring
- [추가] MVC 외에 들어본 아키텍처가 있나?
- MVP
- Model + View + Presenter
- Controller 대신 Presenter 존재
- 구조
- Presenter: 뷰에서 요청한 정보로, 모델을 가공하여 뷰에 전달해주는 부분
- 동작
- 1. 사용자의 액션들은 뷰를 통해 들어온다
- 2. 뷰는 데이터를 presenter에 요청한다
- 3. presenter은 모델에게 데이터를 요청한다
- 4. 모델은 presenter에서 요청받은 데이터를 응답한다
- 5. presenter은 뷰에게 데이터를 응답한다
- 6. 뷰는 presenter가 응답한 데이터를 이용하여 화면을 나타낸다
- 특징
- presenter은 뷰와 모델의 인스턴스를 가지고 있어 둘을 연결한다.
- presenter와 뷰는 1:1관계
- 장점
- 뷰와 모델의 의존성이 없다
- 이를 통해, MVC 패턴의 단점이었던 뷰와 모델의 의존성을 해결함(presenter를 통해서만 데이터를 전달 받기 때문에)
- 단점
- 뷰와 Presenter 사이의 의존성이 높다
- 애플리케이션이 복작해 질 수록 뷰와 Presenter 사이의 의존성이 강해진다.
- MVVM
- Model + View + ViewModel
- ViewModel: 뷰를 표현하기 위해 만든 뷰를 위한 모델임. 뷰를 나타내주기 위한 모델이자, 뷰를 나타내기 위한 데이터 처리를 하는 부분이다.
- 동작
- 사용자 액션이 들어오면 뷰를 통해 들어온다
- 뷰에 액션이 들어오면, Command 패턴으로 ViewModel에 액션을 전달한다
- ViewModel은 모델에게 데이터를 요청한다
- 모델은 ViewModel에게 요청받은 데이터를 응답한다
- ViewModel은 응답 받은 데이터를 가공하여 저장한다
- 뷰는 ViewModel과 Data Binding하여 화면을 나타낸다
- 특징
- Command 패턴과 Data Binding 두가지 패턴을 사용하여 구현됨
- 이를 통해, 뷰와 ViewModel 사이의 의존성 없앰
- ViewModel과 뷰는 1:n 관계
- 장점
- 뷰와 모델 사이의 의존성이 없다
- 뷰와 ViewModel 사이의 의존성이 없다
- 단점
- ViewModel 설계가 어렵다
- MVP
[정리]
- MVC 패턴: 뷰와 모델 의존성 문제
- MVP 패턴: 뷰와 모델 의존성 문제 해결, but 뷰와 Presenter 의존성 문제
- MVVM 패턴: 뷰와 모델 의존성, 뷰와 ViewModel 의존성 모두 존재하지 않음, but 설계 어려움
5. 소프트웨어에서 아키텍처란?
- 아키텍처란?
- 여러가지 소프트웨어 구성요소(ex. 클래스, 프로세스, 프로그램 등) 와 그 구성요소가 가진 특성 중 외부에 드러나는 특성, 그리고 구성 요소 간의 관계를 표현하는 시스템 구조나 구조체이다.
- 상위 레벨의 추상화를 통해 시스템의 전반적인 모습을 보여주는 것
- 예시) 클라이언트 - 서버형, 계층형, MVC, 파이프 - 필터 등
- 소프트웨어 아키텍처 설계의 기본 원리: 모듈화, 추상화, 단계적 분해, 정보 은닉
6. API와 SDK에 대해 설명해 주세요.
- API란?
- Application Programming Interface의 약자로, 서로 다른 두 애플리케이션이 통신할 수 있도록 연결해주는 통로이다. -> 만들어진 걸 연동하는 느낌
- SDK란?
- Softaware Development Kit의 약자로, 소프트웨어를 개발할 떄 사용하는 도구 모음을 말한다.
- 하드웨어 플랫폼, 운영체제 또는 프로그래밍 언어 제작사가 제공하는 일련의 툴
- 장점
- API의 한계를 넘어서 독자적으로 원하는 개발이 가능하다
- 특정 목적을 가진 개발에 필요한 모듈, 샘플 소스, 메뉴얼 등이 포함된다는 점에서 반드시 필요한다.
- 예시) 자바 - JDK, 안드로이드 - ADK 등
- API와 SDK가 헷깔리는 이유는?
- API가 SDK에 포함되는 경우가 많기 때문이다.
- 개발 키트에는 이미 만들어진 기능과 통신해서 사용하는 부분이 포함될 수 있으니까
- API: 결과를 받아오기 위해 어떤 작업을 수행해야 하는 지 알려줄 뿐, 받아온 이후의 처리는 개발자 몫
- SDK: 소프트웨어 개발을 위한 실제 코드까지 있음
- 결국, SDK가 조금 더 크고 편리한 도구라고 할 수 있다. (하지만, API가 더 결과를 내맘대로 가공할 수 있는 경우도 있음)
7. 동시성과 병렬성에 대해 설명해 주세요.
- 동시성
- 여러 작업이 같이 실행되고 있음을 의미한다.
- 싱글 코어에서 멀티 쓰레드를 동작시키는 방식이다. -> context switch가 일어남
- 여러 작업을 빠르게 번갈아가면서 실행해서, 동시에 실행되는 것 같이 보이는 것
- 빠른 시간에 하나씩 많은 것을 처리
- 논리적인 개념
- 동시성이 병렬성보다 조금 더 큰 개념이다.
- 병렬성
- 2개 이상의 서로 다른 작업들이 독립적으로 동시에 실행되고 있음을 의미한다.
- 멀티 코어에서 쓰레드를 동시에 동작시키는 방식이다.
- 한 번에 많은 일을 동시 처리한다.
- 물리적인 개념