# TIL 웹개발 - CS 모의 면접 정리

우선 CS 면접의 경험을 정리해보면, 왜 CS를 공부해야하는지 이제서야 알게 된 느낌이었다.
단순히 개념과 설명을 반복해서 표현하는게 아니라 각 개념들 간 관계를 알고 차이점까지 설명할 줄 알아야 실무에서도 적용할 수 있다.

> 주로 두 가지 개념에 대해 묻는다. 
이렇게 두 가지를 물어보는 이유는 차이점이 존재하기 때문에 그 특징을 잘 설명하는 것이 중요하다.

1. **배열, 연결리스트**

![Image](https://upload.cafenono.com/image/slashpagePost/20240807/155820_QnvHHEI6QeT6tU7ToK?q=80&s=1280x180&t=outside&f=webp)

자료구조에서 배열과 연결리스트는 모두 데이터를 저장하고 관리하는데 사용된다.

- 배열

    - **연속적인 메모리 공간**에 정하는 데이터 구조

    - **고정 크기**를 가지며 한번 선언되면 크기를 변경할 수 없다.
    -  → 이는 단점으로도 작용하는데 배열의 크기를 동적으로 변경할 수 없다.

    - **인덱스를 사용**해 데이터에 접근이 빠르다. → O(1)의 시간복잡도를 가진다.

    - **삽입 및 삭제의 비효율성 **→ 배열 중간에 삽입하거나 삭제할 경우 나머지 요소들을 이동시켜야하므로 O(n)이 걸린다.

- 연결리스트

    - 각 요소가 노드로 구성되고, 각 노드는 데이터와 다음 노드를 가리키는 포인터를 표함되는 데이터 구조

    - **동적 크기**로 필요에 따라 노드를 추가하거나 제거하여 크기를 동적으로 변경할 수 있다.
    - → 각 노드는 

    - **효율적인 삽입/삭제 **리스트의 중간에 요소를 삽입하거나 삭제하는데 O(1) 시간이 소요된다.
    - → 반면 특정 위치를 찾는데 O(n)의 시간이 걸려 접근이 느리다.

    - **비연속적 저장**으로 메모리 활용이 유연하다.

2. **프로세스와 스레드**

![Image](https://upload.cafenono.com/image/slashpagePost/20240807/203609_KzXrcVMQczgNWYSr5i?q=80&s=1280x180&t=outside&f=webp)

- 프로세스

    - 실행중인 프로그램의 인스턴스를 의미하며, 프로그램이 메모리에서 실행되는 상태를 말한다.

    - 각 프로세스는 **독립된 메모리 공간**을 가지며, **다른 프로세스와 메모리 공간을 공유하지 않는다.**

    - 실행에 필요한 자원(파일, 메모리, CPU 등) 을 소유한다.

    - 운영체제는 프로세스를 생성, 스케쥴링, 종료등의 작업을 관리한다.

    - 한 프로세스의 오류가 다른 프로세스에 영향을 미치지 않는다.

- 스레드

    - 프로세스 내에서 **실행되는 작업의 단위**

    - 프로세스는 하나 이상의 스레드를 가질 수 있으며, 이를 **멀티스레딩**이라고 한다.

    - 같은 프로세스 내의 스레드들은 **메모리 공간(코드, 데이터, 힙)을 공유**한다.
    - → 각 스레드는 독립적인 스택을 가진다.

    - 스레드는 프로세스보다 생성 및 종료에 필요한 자원이 적다. →** 경량 프로세스**

    - 여러 스레드를 사용하여 병행 작업을 수행할 수 있어, 프로그램의 성능을 향상시킬 수 있다.

    - 스레드 간 통신은 같은 프로세스 내에서 이루어지기 때문에 프로세스 간 통신보다 빠르다.

> 프로세스 : 웹 브라우저, 텍스트 편집기, 시스템 유틸리티 등 각각 독립적으로 실행되는 프로그램
스레드 : 웹 브라우저 내에서의 탭들, 텍스트 편집기의 자동 저장 기능, 시스템 유틸리티의 배그라운드 작업 등 병행 처리가 필요한 작업

3. **TCP, UDP**

우선 이 용어들은 네트워크와 관련된 것인데, 우리가 인터넷을 사용할 때 서버와 어떻게 상호작용하는지에 대한 내용이다. 패킷을 통해 데이터를 전송하는데 이 패킷을 어떻게 다루는지에 대한 규약이다.

- TCP(Transmission Control Protocol)

    - 서버와 통신할때 syn, arc를 통해 신뢰성을 보장하는 연결지향적 프로토콜

    - 만약 분할된 패킷을 잃어버렸다면 서버에게 어떤 패킷이 없는지 알려주고 다시 전송을 받는다.

    - UDP에 비해 속도가 느리다.

- UDP(User Datagram Protocol)

    - 서버와 통신할때 TCP와 달리 일방향으로 주고 받는 비연결성 프로토콜

    - 패킷을 잃어버려도 서버에게 다시 알리지 않는다.

    - TCP에 비해 속도가 빠르다.

    - 비디오 스트리밍에 자주 사용된다.

4. HTTP , HTTPS

- HTTP (HyperText Transfer Protocol)

    - 웹브라우저와 서버간에 데이터를 주고받기 위한 프로토콜

    - 일반 텍스트로 데이터를 전송하기 때문에 보안에 취약하다.

    - 보안이 필요하지 않은 웹사이트나 페이지에 주로 사용된다.

    - 포트번호: 기본적으로 포트 80을 사용한다.

- HTTPS (HyperText Transfer Protocol Secure) 

    - HTTP에 SSL 또는 TLS라는 암호화 프로토콜을 추가하여 보완성을 높인 프로토콜

    - HTTPS를 통해 주고받는 데이터는 암호화되어, 중간에 누군가가 데이터를 가로채더라도 내용을 읽을 수 없도록 보호

    - 금융 거래, 로그인 정보 입력 등의 민감한 데이터가 오가는 웹사이트에 주로 사용

    - HTTPS는 포트 443을 사용한다.

5. 객체지향 프로그램의 특징

- 캡슐화

    -  객체의 속성과 데이터를 하나로 묶어 외부에서 객체의 내부 상태를 직접 접근하지 못하도록 보호하는 것 → 객체 내부의 세부 구현을 감추고, 외부에는 필요한 부분만 공개해 데이터의 무결성을 유지한다.

- 상속

    - 기존 클래스의 속성과 메소드를 새로운 클래스가 물려받아 재사용 하는 것 → 코드의 재사용성을 높이고 계층 구조를 형성한다.

- 다형성

    - 동일한 메소드나 연산자가 서로 다른 객체에서 다르게 동작하도록 하는 것

    - 주로 메소드 오버로딩과 메소드 오버라이딩을 통해 구현된다.

- 추상화

    - 복잡한 시스템에서 필요한 부분만을 모델링하여 표현하는 것

    - 구체적인 구현을 감추고, 필요한 기능만을 인터페이스로 제공함으로 써 복잡성을 줄이고 이해하기 쉽게 한다.

6. SQL, NoSQL

- SQL (Structured Query Language)

    - 관계형 데이터베이스 관리 시스템(RDBMS)로 데이터를 테이블 형태로 저장한다. 각 테이블은 행과 열로 구성되며, 데이터는 엄격하게 구조화되어 있다.

    - 데이터베이스 스키마(schema)를 사전에 정의해야 하며, 모든 데이터는 이 스키마를 따라야 한다. 

- NoSQL (Not only SQL)

    - 비구조화된 데이터로 테이블 기반이 아닌 다양한 데이터 모델(키-값, 문서, 그래프, 컬럼 패밀리 등)을 지원한다. → 비정형 데이터, 반정형 데이터 처리에 적합

    - 스키마가 없거나 굉장히 유연하다.

For the site tree, see the [root Markdown](https://slashpage.com/kyugntae-ai.md).
