JAVA

기본 타입과 참조타입에 대해 말씀해주세요

기본타입은 미리 정의된 8가지의 타입으로 사용 전 반드시 선언되어야 하므로 비객체 타입이기에 null이 될수 없습니다. null이 되고싶다면 wrapper class 를 활용해야 합니다.

참조 타입은 기본 타입을 제외하고 모든 타입이며 java의 최상인 java.lang.object 클래스를 상속하는 모든 클래스를 말합니다. new를 통해 생성되는 참조 타입은 heap영역에 저장되며 클래스 타입, 인터페이스 타입, 배열 타입, 열거 타입이 있습니다.

다형성이란?

프로그램 언어에서 한 자료형에 여러가지 자료형이 속하는 허가하는 것입니다.

캐스팅이란?

변수나 리터럴 타입을 다른 타입으로 변환하는 것입니다.

주로 타입이 다른 값을 계산하는 경우 사용되며 자동으로 캐스팅이 발생하는 묵시적 형변환과 직접 캐스팅할 내용을 적어주는 명시적 형변환이 있습니다.

캐스팅이 필요한 이유는 다형성으로 오버라이딩된 함수를 분리해서 사용할 수 있으며

상속으로는 캐스팅을 통해 범용적인 프로그래밍이 가능합니다.

자바의 컴파일 순서를 말씀해주세요

개발자가 자바 소스코드를 작성하면 자바 컴파일러가 자바 소스를 컴파일해서 바이트 코드를 만듭니다.

그리고 컴파일된 바이트 코드를 JVM의 클래스 로더에게 전달하며

클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 JVM의 메모리에 올립니다.

이후 실행 엔진은 JVM 메모리에 올라온 바이크 코드들을 명령어 단위로 하나씩 가져와서 실행합니다.

컴파일 → 바이트코드 → jvm 클래스로더 → jvm 메모리 → 실행 엔진

클래스 로더 세부 동작

로드 - 클래스 파일을 가져와서 JVM의 메모리에 로드합니다.

검증 - 자바 언어 몇세 및 JVM 명세에 명시된 대로 구성되어 있는지 검사합니다.

준비 - 클래스1

가 필요로 하는 메모리를 할당합니다(필드, 메서드, 인터페이스)

분석 - 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다.

초기화 - 클래스 변수들을 모두 적절한 값으로 초기화합니다. (static)

가비지 컬렉션이란?

heap 메모리를 재활용하기 위해 참조되지 않는 객체들을 해제시켜 가용한 공간을 만드는 작업입니다.

개발자가 직접 메모리 정리를 하지 않아도 되기에 개발 속도가 대폭 향상됩니다.

그러나 메모리를 언제 되찾을지 결정하기 위한 오버헤드 발생 문제가 있습니다.

가비지 컬렉션의 동작을 설명해주세요

먼저 가비지 컬렉션을 위한 두가지 전제가 있습니다.

신규로 생성한 객체의 대부분은 금방 사용되지 않는 상태가 되며

오래된 객체에서 신규 객체로의 참조는 매우 적게 존재하는 것입니다.

이를 활용해 가비지 컬렉션은 young 영역과 old 영역으로 메모리를 나누고, 신규 객체는 young 영역에, 오랫동안 살아남은 객체는 old 영엑에 보관합니다.

여기서 young 영역에서 객체가 사라지는걸 minor gc, old 영역에서 객체가 사라지는걸 major gc라고 합니다.

새롭게 생성된 객체는 eden으로 보내집니다.

이후 eden이 가득 차면 survivor 영역중 하나로 이동됩니다.

그리고 하나의 다른 서바이벌 영역이 가득 차면 해당 서바이벌 영역에서 살아남은 객체만을 또 다른 서바이벌로 보냅니다.

이 과정을 반복하다가 일정 경계값 이상의 age가 된 객체는 old 영역으로 보내집니다.

이후 old 영역에서는 여러 gc 알고리즘이 있는데 이중 시리얼 gc는 힙에서 살아남은 것을 탐색하는 mark, 살아있는것만 남기는 sweep, 객체가 존재하는 부분과 아닌부분으로 나누는 compaction으로 gc가 진행됩니다.

string와 stringBuffer, stringBuilder 차이

string은 불변적이며 수정하기 위해서는 삭제 후 다시 생성을 해야합니다.

stringBuffer와 stringBuilder는 가변적이며 stringbuffer는 동기화를 지원하며 stringBuilder는 비동기로 여러 스레드에서 접근이 가능합니다.

Serializtion이란?

직렬화란 뜻으로 객체의 상태 혹은 데이터 구조를 기록할 수 있는 JSON 등으로 포멧으로 변환해줍니다.

JAVA의 메모리 영역

메소드, 힙, 스택의 영역으로 나뉩니다.

메소드 영역은 바이트코드, 전역변수, static 정적 변수 등이 들어가며

힙 영역은 new로 생성된 객체를 담는 영역입니다.

스택 영역은 매개변수, 지역변수 등이 들어갑니다.

오버로딩과 오버라이딩

오버로딩은 메소드의 이름은 같으나 매개 변수를 다르게 함으로써 여러 메소드를 만드는 것이며 오버라이딩은 부모클래스로부터 상속받은 메소드를 재정의하는 것입니다.

추상 클래스와 인터페이스

추상 클래스는 실체 클래스들의 공통적인 부분을 추출해 선언한 것으로

abstract로 선언하거나 추상 메소드가 포함되며

extends를 통해 기능을 이용하고 확장하도록 할 수 있습니다.

인터페이스는 객체의 사용 방법을 정의한 것으로

모든 메소드가 추상 메소드이며,

구현하는 모든 클래스에 대해 강제적으로 메소드를 구현하도록 만들었습니다.

공통점으로는 선언만 있고 구현 내용이 없으며, 인스턴스화를 할 수 없습니다.

차이점으로는 추상 클래스는 상속을 받아서 기능을 확장시키는 것이며 단일 상속이고 인터페이스는 구현하는 모든 클래스에 대해 특정 메서드가 반드시 존재하도록 강제하며 다중 상속이 가능합니다.

제네릭이란?

클래스에서 사용할 타입을 클래스 외부에서 설정하도록 만드는 것입니다.

참조자료형만 가능하며 기본 자료형을 이용하기 위해서는 wrapper 클래스를 활용해야 합니다.

어노테이션이란?

어노테이션이란 인터페이스를 기반으로 한 문법입니다. 주석과는 역할이 다르며 주석처럼 사용해서 특별한 의미를 부여하거나 기능을 주입할 수 있으며, 해석되는 시점을 정할 수 있습니다.

접근 지정자 4가지

public은 모든 접근을 허용하며

protected는 상속받은 클래스와 같은 패키지만 접근이 가능합니다.

default 는 기본 제한자로 자신의 클래스 내부와 같은 패키지만 접근 가능합니다.

private은 외부 접근이 불가능하며 같은 클래스 내에서만 가능합니다.

Array와 ArrayList의 차이

Aarry는 크기가 고정되어 있으며 ArrayList는 크기가 가변적입니다.

Array는 인덱스를 통해 직접 접근하지만 arraylist는 메소드를 통해 접근합니다. array는 객체뿐 아닌 기본 타입도 담을 수 있지만, arraylist 는 객체만 가능해서 기본 타입 넣기 위해서는 wrapper 클래스를 활용해야 합니다.

vector와 ArrayList의 차이

vector은 동기식으로 한 스레드가 작업중이면 다른 스레드는 보유가 불가능 합니다. 그러나 arraylist는 비동기식으로 여러 스레드가 동시 작업이 가능합니다.

클래스와 구조체의 차이

구조체는 하나의 구조로 묶인 변수 집합으로 메소드를 포함할 수 없으나 클래스는 메소드를 포함할 수 있습니다.

스레드 생성 방식 및 특징

스레드를 생성하기 위해서는 runnable 로 선언된 클래스 혹은 스레드 클래스를 상속받아서 run() 메소드를 구현하면 되며 장점으로는 빠르고 메모리를 적게 사용하나 단점으로는 데드락에 빠질 위험이 있기에 관리해주어야 합니다.

Map Set 종류(Set은 Map을 Set으로만 바꾸면 됨)

HasyMap은 key를 해싱하여 나온 인덱스에 value를 저장하는 방법으로 순서가 보장되지 않습니다.

TreeMap은 RedBlack Tree를 활용한 것으로 순서가 보장됩니다.

LinkedHashMap은 입력된 순서를 보장합니다.

자료구조 (list, set, map)

네트워크

HTTP에 대해 설명해주세요

HTTP는 웹 상에서 클라이언트와 서버간에 요청 응답으로 데이터를 주고받을 수 있는 프로토콜입니다.

http get 과 post에 대해 설명해주세요

GET

GET 요청은 필요한 데이터를 body가 아닌 url 끝에 물음표와 함께 이름과 값으로 쌍을 이루는 요청을 전송합니다. 만약 파라미터가 여러 개이면 &로 연결합니다.

GET은 불필요한 요청을 제한하기 위해 캐시될 수 있습니다. JS,CSS,이미지 등 정적 컨텐츠는 데이터 양이 크고 변경될 일이 적어서 반복된 요청을 보낼 필요가 없습니다. 정적 컨텐츠를 요청하면 브라우저는 캐시하고, 동일 요청 발생시 캐시 데이터를 이용합니다.

POST

POST는 리소스를 생성/변경하기 위해 설계되어서 전송할 데이터를 BODY에 담아서 전송합니다. BODY는 길이의 제한 없이 데이터를 전송할 수 있기에 GET보다 대용량의 데이터를 전송할 수 있습니다. BODY로 전송되고 눈에 보이지 않기에 보안면에서 안전하다고 생각할 수 있지만 개발자 도구와 같은 툴로 확인할 수 있기에 민감한 내용은 암호화해야 합니다.

차이

GET은 요청을 URL에, POST 는 BODY에 담아서 보냅니다.

그리고 GET은 가져오기 위한 요청이고 SELECT와 비슷합니다. 그러나 POST는 값이나 상태를 변경하거나 추가하기 위해 사용됩니다.

또한 GET은 캐싱될 수 있지만 POST는 캐싱되지 않습니다.

GET은 멱등, POST는 멱등하지 않습니다.

그렇기에 GET은 서버에게 동일한 요청을 여러번 전송해도 동일한 응답이 돌아와야 합니다.

반대로 POST는 멱등하지 않기에 서버에 동일 요청을 여러번 전송해도 응답이 항상 다를 수 있습니다.

TCP와 UDP에 대해 설명해주세요

UDP

user datagram protocol로 비 연결형 프로토콜입니다. 연결 설정이 필요하지 않으며 UDP는 컨제션 컨트롤, 플로우 컨트롤, 에러 컨트롤 등 손상된 세그먼트를 재전송하지 않습니다. 손상된 패킷에 대한 처리는 응용 계층에서 처리합니다. 그렇기에 전송 속도가 빠릅니다.

TCP

transmission control protocl로 신뢰성과 순차적인 전달을 합니다. 컨제션 컨트롤 플로우 컨트롤 등을 하며 3 way handshake를 통해 연결 설정을 합니다. 그렇기에 신뢰성은 있지만 전송 속도가 udp에 비해 느린 편입니다.

HTTP와 HTTPS에 대해 설명해주세요

HTTP

서버와 클라이언트가 데이터를 주고 받기 위해 사용하는 프로토콜입니다. HTTP는 텍스트 교환이므로 네트워크에서 신호를 가로채면 내용이 노출될 수 있습니다.

HTTPS

HTTP의 보안 문제를 해결하기 위한 프로토콜이 HTTPS입니다. SSL를 사용해 정보를 암호화합니다.

HTTPS의 흐름은 서버 측이 HTTPS를 적용하기 위해 공개키와 개인키를 만듭니다.

CA 기업을 선택하고 CA기업에 공개키 관리를 부탁합니다.

CA기업은 해당 기업의 이름, 공개키,공개키 암호화 방법을 담은 인증서를 만들고 CA기업의 개인키로 암호화해서 서버에게 제공합니다.

서버는 클라이언트에게 HTTPS 요청이 오면 인증서를 클라이언트 측에 전달합니다.

클라이언트는 CA기업의 개인키로 암호화한 인증서를 받습니다.

인증서를 CA기업의 공개키로 해독한 후 서버 정보와 서버의 공개키를 얻습니다.

클라이언트는 서버의 공개키로 대칭키를 암호화 하여 서버에게 전달합니다.

서버는 개인키로 해독하여 대칭키를 얻고 이후 클라이언트와 서버 측은 대칭키로 암호화하여 정보를 주고 받습니다.

HTTP 1.0, 1.1, 2.0에 대해 설명해주세요

HTTP 1.0

메서드가 GET, POST, HEAD만 존재합니다. 매 요청마다 연결을 설정하고 해제해야하기 때문에 효율적이지 못합니다.

HTTP 1.1

HTTP 1.0을 개선하기 위해 Keep-alive를 지원합니다. keep-alive는 하나의 TCP 연결을 이용하여 복수의 요청과 응답을 주고 받을 수 있습니다. 그리고 PUT,DELETE 가 추가됐습니다.

HTTP 2.0

HTTP 1.1 을 개선하기 위해 하나의 커넥션에서 병렬적으로 응답을 받지 않아도 요청을 보낼 수 있게 됐습니다. 또한 1.1이 텍스트로 보냈다면 바이너리로 인코딩하고 헤더를 압축해 보내기 때문에 1.1에 비해 빠른 속도를 가지는 것이 특징입니다.

3-way-handshake에 대해 설명해주세요

TCP연결을 시작하기 위해 진행되는 과정입니다.

클라이언트가 서버에게 연결을 요청하기 위해 SYN 패킷을 보내고 SYN_SENT 상태가 됩니다.

서버는 SYN를 받고 응답한다는 의미로 SYN+ACK를 보내고 ACK 상태를 기다리며 SYN_RECEIVED 상태가 됩니다.

클라이언트는 서버에 ACK를 보내고 연결이 이루어 집니다. 이 때 서버는 ESTABLISED 상태입니다.

4-way-handshake에 대해 설명해주세요

TCP 연결을 종료하기 위해 진행되는 과정입니다

클라이언트가 서버에게 연결을 종료하기 위해 FYN 을 보냅니다

서버는 ACK 메시지를 보내고 자신의 통신이 끝날때까지 기다립니다.

통신이 종료되면 연결이 종료 되었다고 클라이언트에게 FIN을 보냅니다.

클라이언트는 확인했다는 의미로 ACK를 보내고 연결이 종료됩니다.

운영체제

프로세스와 스레드의 차이

프로세스

프로세스는 실행중인 프로그램으로 디스크로부터 메모리 적재되어 CPU의 할당을 받을 수 있는 것입니다. 운영체제로부터 주소 공간, 파일, 메모리 등을 할당받으며 이것들을 총칭해 프로세스라 합니다. 구체적으로는 프로세스는 함수의 매개변수, 복귀 주소와 로컬 변수와 같은 임시 자료를 갖는 프로세스 스택과 전역 변수들을 수록하는 데이터 섹션을 포함합니다. 그리고 프로세스는 실행 중 동적 할당되는 메모리인 힙을 포함합니다.

PCB

PCB는 특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제 자료구조입니다. 운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB를 생성합니다. 프로세스는 CPU를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU를 반환해야 하는데, 이 때 작업의 진행상황을 PCB에 저장합니다. 그리고 다시 CPU를 할당받으면 PCB에 저장된 내용을 불러와 이전 종료 시점부터 다시 수행합니다.

  • PCB 저장 정보

    PID

    프로세스 상태 : new,ready,running,waiting,terminated 등

    프로그램 카운터 : 프로세스가 다음에 실행할 명령 주소

    cpu 레지스터

    cpu 스케줄링 정보 : 프로세스 우선순위 ,스케줄 큐에 대한 포인터

    메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보 포함

    입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록

    어카운팅 정보 : 사용된 cpu 시간, 시간 제한, 게정 정보 등

프로세스 주소 공간

프로세스 주소공간은

소스 코드를 저장하는 코드

전역변수를 저장하는 데이터

함수, 지역변수를 저장하는 스택으로 나뉘어있습니다.

이는 최대한 데이터를 공유하여 메모리를 아낄 수 있도록 나눈것입니다.

스레드

스레드는 프로세스의 실행 단위입니다. 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유할 수 있습니다. 스레드는 ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성됩니다.

하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화해 수행 능력을 향상시키는게 멀티스레딩입니다. 이 경우 각각의 스레드는 독립적 작업을 수행하기에 각자 스택과 PC레지스터 값을 가집니다.

스택을 스레드마다 할당하는 이유는 스택은 함수 호출시 전달인자, 되돌아갈 주소값, 함수 내 선언 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택이 독립적이라는 것은 독립 함수 호출이 가능하다는 것이고 이는 독립적 실행 흐름이 추가되는 것입니다. 따라서 스레드는 정의에 따라 독립 실행 흐름을 추가하기 위한 최소 조건으로 각자 스택을 할당합니다.

PC 레지스터를 스레드마다 독립적 할당하는 이유는 PC값은 스레드가 명령을 어디까지 수행하는것을 나타냅니다. 스레드는 CPU를 할당받고 스케줄러에 의해 다시 선점됩니다. 그렇기에 연속 수행되지 못해서 어디까지 기억할 필요가 있기에 PC 레지스터를 독립할당합니다.

멀티 스레드

멀티스레드란 스레드들이 공유 메모리를 통해 다수의 작업을 동시에 처리하는 것입니다.

멀티스레딩 장점

프로세스를 이용하여 동시 처리하던 일을 스레드로 구현할 경우 메모리 공간과 시스템 자원 소모가 줄어듭니다 .스레드 간 통신이 필요할 경우 별도 자원의 이용이 아닌 전역 변수의 공간 또는 동적 할당 공간인 Heap을 이용해 데이터를 주고 받을 수 있습니다. 그렇기에 프로세스간 통신 방법에 비해 스레드 방법이 훨씬 간단합니다. 또한 context switch는 프로세스 context switch와 달리 캐시 메모리를 비울 필요가 없기에 더 빠릅니다. 이러한 장점때문에 여러 프로세스에서 할 수 있는 작업을 하나의 프로세스에서 스레드로 나눠 실행합니다.

멀티스레딩 단점

멀티 프로세스 기반으로 프로그래밍 할 때는 자원 공유가 없기에 동시 접근이 없지만 멀티 스레딩은 이를 고려해야합니다. 그렇기에 멀티스레딩은 동기화 작업이 필요합니다. 동기화를 통해 작업 순서를 제어하고 접근을 제어합니다.

멀티스레드 vs 멀티 프로세스

멀티 스레드는 멀티 프로세스에 비해 메모리를 적게 차지하고 context switching이 빠르다는 장점이 있지만, 오류로 하나의 스레드가 종료되면 저체가 종료될수 있고 동기화 문제가 있습니다.

반면 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행되는 장점이 있지만, 멀티 스레드보다 많은 메모리와 cpu시간을 차지하는 단점이 있습니다.

스케줄러

스케줄링 queue

스케줄링 큐는 3가지가 있습니다.

job queue로 현재 시스템 내에 있는 모든 프로세스의 집합입니다.

ready queue로 현재 메모리 내에 있으며 cpu를 잡아서 실행되기 기다리는 프로세스 집합입니다.

device queue로 device I/O 작업을 대기하는 프로세스 집합입니다

스케줄러

각각의 QUEUE에 프로세스들을 넣고 빼주는 스케줄러도 3가지가 있습니다.

장기 스케줄러

한정된 메모리에 많은 프로세스가 한번에 올라올 경우 디스크에 저장됩니다. 이 POOL에 저장되어 있는 프로세스 중 어떤 프로세스를 메모리에 할당해 ready queue로 보낼지 결정하는 역할을 합니다.

단기 스케줄러

ready queue 에 존재하는 프로세스 중 어떤 프로세스를 running 시킬지 결정합니다. 즉 프로세스에 cpu를 할당합니다.

중기 스케줄러

메모리에 너무 많은 프로그램이 동시에 올라가는 것을 조절하고 여유 공간을 마련하기 위해 프로세스를 통째로 메모리에서 쫒아냅니다. 프로세스의 상태는 ready에서 suspended가 됩니다

cpu 스케줄러

스케줄링 대상은 ready queue에 있는 프로세스입니다.

FCFS

FCFS는 먼저 온 프로세스를 처리하며 비선점형입니다. CPU를 할당받으면 완료될 때까지 반환하지 않습니다.

SJF

다른 프로세스가 먼저 도착해도 작업 시간이 짧은프로세스에 먼저 할당합니다. 비선점형입니다. 작업시간이 오래 걸리는 프로세스는 영원히 프로세스를 할당받지 못할 수 있습니다.

SRT(shortest remaining time)

새로운 프로세스가 도착할때마다 스케줄링이 이루어지며 현재 수행중인 프로세스의 남은 작업 시간보다 짧은 작업시간을 가진 프로세스가 도착하면 CPU를 할당받습니다. 새로운 프로세스가 도착할때마다 스케줄링을 하기에 작업시간을 측정할 수 없습니다.

Priority Scheduling

우선순위가 높은 프로세스에게 cpu를 먼저 할당합니다. 선점형 방식은 더 높은 우선순위 프로세스가 도착하면 cpu를 새로운 프로세스에 할당하며 비선점형 방식은 더 높은 우선순위 프로세스가 도착하면 래디 큐의 head에 넣습니다.

문제점으로는 우선순위가 낮은 프로세스는 cpu를 할당받지 못해 기아현상이 발생할 수 있습니다. 이를 방지하기 위해서는 대기 시간에 따른 우선순위를 부여하는 aging이 필요합니다.

Roung Robin

각 프로세스는 동일한 크기의 할당시간을 가집니다. 할당 시간이 지나면 프로세스는 선점당하고 ready queue의 제일 뒤에 들어가게 됩니다. 설정한 타임 퀀텀이 너무 크면 FCFS와 같아지며 너무 작으면 context switching으로 인한 오버헤드가 발생합니다.

sync, async

동기는 일반적으로 실행 시킨 후 반환값을 기다리는 것을 의미하며, 비동기는 반환값을 기다리지 않고 여러 작업을 함께 처리하는 것을 의미 합니다.

ciritical section

동일한 자원을 동시에 접근하는 작업을 실행하는 코드 영역을 critical section이라 합니다.

critical section problem

프로세스들이 critical section을 함께 사용할 수 있는 프로토콜을 설계하는 것입니다.

Race Condition

공유자원에 대해 여러 프로세스가 동시에 접근할 때, 결과값에 영향을 줄 수 있는 상태입니다.

발생하는 경우는 커널 작업 수행 중 인터럽트 발생, System call 하여 커널 모드 진입시 문맥 교환이 발생할 때, 멀티 프로세스 환경에서 공유 메모리 내의 커널 데이터에 접근 하는 경우가 있습니다.

세마포어와 뮤텍스9

세마포

멀티프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법입니다.

세마포는 임계 구역에 들어가기 전 진입 여부를 알리는 동작인 P, 임계 구역에서 나올 때 반납 여부를 알리는 V연산을 통해 진행됩니다.

뮤텍스

임계 구역을 가진 스레드들의 실행시간이 서로 겹치지 않고 단독적으로 실행되는 기술로 임계 구역에 들어갈 시 권한을 얻는 LOCK, 임계 구역 사용후 사용함을 알리는 UNLCOK으로 이루어져있으며 상태가 0, 1이기에 이진 세마포어로도 불립니다.

데드락

프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태입니다. 예를 들어 서로 원하는 자원이 상대방에게 할당돼있을 경우 데드락이 발생합니다.

데드락의 발생조건은 4가지가 모두 성립되어야 합니다.

  1. 상호 배제 : 자원은 한번에 하나의 프로세스만 사용할 수 있습니다.
  2. 비선점 : 다른 프로세스 할당된 자원은 뺏을 수 없습니다.
  3. 점유 대기 : 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가 점유하기 위해 대기하는 프로세스가 존재합니다.
  4. 순환 대기 : 프로세스의 집합에서 순환 형태로 자원을 대기해야 합니다.

데드락 처리

데드락의 처리 방법에는 예방, 회피, 회복이 있습니다.

예방

예방은 데드락의 발생 조건 중 하나를 제거하면서 해결합니다. 그렇기에 자원 낭비가 심합니다.

회피

회피는 교착 상태 발생 시 피해나가는 방법으로 프로세스가 자원을 요구할 때, 자원을 할당 후에도 안정상태로 남아있는지 검사하는 방법이 있습니다.

회복

교착 상태가 된 이후 회복 시키는 방법입니다.

  • 탐지

    자원 할당 그래프를 통해 교착 상태를 탐지합니다.

  • 회복

    교착 상태의 프로세스를 모두 종료하거나, 데드락이 제거될 때까지 자원을 해제시켜 회복시킵니다.

메모리

연속 메모리 관리

프로그램 전체가 하나의 커다란 공간에 연속해서 할당됩니다.

  • 고정 분할 기법은 고정된 파티션으로 분할해서 넣기에 내부 단편화가 발생하며
  • 동적 분할 기법은 파티션이 동적 생성돼서 자신과 같은 크기의 파티션에 넣기에 외부 단편화가 발생합니다.

불연속 메모리 관리

하나의 프로그램이 페이지나 세그먼트 단위로 나뉘어 분산 배치되는 방법입니다.

  • 페이지는 고정 사이즈의 작은 프로세스 조각입니다.
  • 프레임은 페이지 크기와 같은 메모리 조각입니다.
  • 단편화는 빈 공간이 여러 조각으로 나뉘는 현상입니다.
  • 세그먼트는 서로 다른 크기를 가진 논리적 블록이 연속공간에 배치됩니다.

단편화

단편화란 메모리 상에서 적재되고, 해제되는 과정에서 발생하는 메모리 사이의 사용하지 못할정도로 작은 빈 공간입니다. 단편화는 외부 단편화와 내부 단편화로 나뉩니다.

외부 단편화는 프로세스와 프로세스 사이에 발생하는 빈 공간이며,

내부 단편화는 프로세스 안에서 발생하는 빈 공간입니다.

메모리를 할당하는 방법으로는

First Fit : 메모리 할당할 때 가장 먼저 발견한 곳에 넣습니다.

Best fit : 메모리 할당할 때 가장 작은 곳에 넣습니다 (정렬 필요)

Worst fit : 메모리 할당할 때 가장 큰 곳에 넣습니다. (정렬 필요)

가상 메모리

다중 프로그래밍을 실현하기 위해서는 많은 프로세스를 동시에 메모리에 올려두어야 하는데 이를 프로세스 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 하는 기법입니다.

가상 메모리는 요구 페이지 기법을 통해 필요한 페이지만 메모리에 적재하고 사용하지 않는 부분은 그대로 둡니다. 하지만 필요한 페이지만 올려도 메모리가 가득 차고, 올라온 페이지가 사용 된 이후에도 자리만 차지할 수 있습니다. 이런 상황에서 안쓰는 페이지를 out 시키고 현재 필요한 페이지를 in시킵니다.

이 때 사용하는 것이 페이지 교체 알고리즘입니다.

  • FIFO

    메모리에 먼저 올라온 페이지를 내보냅니다.

  • OPT (OPTimal replacement)

    앞으로 사용하지 않을 페이지를 가장 우선적으로 내보냅니다. 하지만 앞으로 사용되지 않을 보장이 없기에 구현이 어렵습니다.

  • LRU (Least Recently Used)

    가장 오래도록 사용하지 않은 페이지를 먼저 내보내는 알고리즘입니다.

  • LFU (Least Frequentyl Used)

    가장 덜 사용된 페이지를 내보내는 방법입니다.

데이터베이스

엔티티란?

데이터의 집합을 의미하며 저장,관리되어야 하는 데이터로 개념,장소,사건을 가리킵니다.

특징으로는 유일한 식별자, 2개 이상의 인스턴스, 속성 보유, 다른 엔티티와의 관계 등이 있습니다.

릴레이션이란?

흔히 말하는 테이블로 같은 성격의 데이터의 집합입니다.

SQL injection

해커에 의해 조작된 sql 쿼리문이 db에 그대로 전달되어 비정상적 실행을 시키는 공격입니다.

이를 막기 위해서는 입력을 받을 때 특수문자 검사, 에러 발생시 에러 메시지 감추기, 예약어를 사용해서 특수문자를 자동으로 이스케이핑 해주는 방법이 있습니다.

인덱스

인덱스는 관계형 데이터베이스에서 검색 속도를 높이기 위한 기술로

테이블의 칼럼의 값과 해당 저장된 주소를 키와 값의 쌍으로 인덱스로 저장합니다.

MYI파일에 저장되며 select 쿼리로 인덱스를 사용하는 칼럼을 탐색이 MYI 파일의 내용을 검색합니다. 인덱스는 정렬된 상태를 유지하기에 값을 탐색하는 경우 빠르지만 삭제,수정,추가의 경우 느려집니다.

트랜잭션

트랙잭션이란 작업의 완전성을 보장해주는 것으로 논리적입 작업 셋을 모두 완벽히 처리하거나 또는 처리하지 못할 경우는 원상태로 복구해서 작업의 일부만 적용되는 현상이 발생되지 않게 해줍니다.

트랙잭션의 특징으로는 ACID 4가지 특성을 만족해야 합니다.

A . 원자성으로 트랜잭션은 아에 반영되지 않거나 모든 작업이 반영돼야 합니다.

C. 일관성으로 트랜잭션이 완성된 다음에도 트랜잭션 일어나기 전의 상황과 데이터의 일관성이 보장되어야 합니다.

I. 고립성으로 트랜잭션은 서로 간섭이 없어야 합니다.

D.지속성으로 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 결과가 저장되어야 합니다.

트랙잭션 격리 수준

트랜잭션이 독립적으로 수행해야 하는데 필요한 Lcoking 방법입니다.

Read Uncommitted 격리 수준 0은 select 문장이 수행하는 동안 해당 데이터에 Shared lock이 걸리지 않으므로 일관적이지 않습니다.

Read Committed 격리 수준 1은 커밋된 데이터만 조회할 수 있습니다.

REPEATABLE READ 격리 수준 2는 트랜잭션이 완료될때까지 같은 값을 가져옵니다.

SERIALIZABLE 격리 수준 3은 테이블을 읽으면 트랜잭션은 해당 테이블의 데이터를 추가변경삭제할 수 없습니다.

정규화란?

관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업입니다. 정규화 과정을 거치면서 정규형을 만족하게 됩니다. 정규형이란 특정 조건을 만족하는 릴레이션의 스키마의 형태를 말하며 1,2,3 정규형이 존재합니다.

  • 제 1 정규형

    릴레이션에 속한 모든 속성의 도메인이 원자값만으로 구성되어야 합니다.

  • 제 2 정규형

    제 1 정규형을 만족시키는 릴레이션에서 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되어야 합니다.

  • 제 3 정규형

    제 2 정규형에 속하면서, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않아야 합니다.

정규화를 하는 이유?

한 릴레이션에 여러 엔티티의 정보가 중복 저장되면, 저장 공간을 낭비합니다. 또 중복 정보로 인해 갱신 이상이 발생합니다. 동일 정보를 한 릴레이션에서는 변경하고 다른 릴레이션에서는 변경하지 않으면 문제가 생깁니다. 이것을 해결하기 위한 것입니다.

갱신 이상에는

원하지 않는 자료가 삽입되거나 삽입되지 않는 삽입이상

하나의 자료만 삭제하고싶지만 그 자료가 포함된 튜플 전체가 삭제됨으로 원치 않는 정보 손실이 발생하는 삭제 이상

일부 튜플만 갱신되어 정보가 모호해지는 수정 이상입니다.

자료구조

배열

선언할 때 크기를 정하며 논리적 저장 순서와 물리적 저장 순서가 일치하는 자료구조입니다.

연결리스트

연속되지 않은 메모리에 위치하며 각 노드는 값과 다음 노드의 위치를 포함합니다.

백터 (리스트)

리스트는 배열처럼 크기를 정해주지 않아도 됩니다.

이진 탐색트리

각 노드의 자식이 2개 이하이며 왼쪽은 부모보다 작고 오른쪽은 부모보다 크며 중복된 노드가 없으며 logN으로 효율적인 동작이 가능한 트리입니다. 그러나 편향된 트리일 경우 N의 시간복잡도를 가집니다

해시

데이터를 효율적으로 관리하기 위해 임의의 길이 데이터를 고정된 길이의 데이터로 매핑합니다.

다른 데이터여도 같은 해시값일 경우 충돌이 발생합니다. 이를 해결하기 위해서는 체이닝과 오픈 어드레싱 방식인 선형 탐사, 제곱 탐사가 있습니다

set

중복되지 않는 데이터를 저장할 수 있는 자료구조입니다. 내부적으로는 정렬되지 않은 셋이면 해시를 사용합니다. 정렬된 셋의 경우 레드블랙트리를 사용합니다.

MAP

map은 데이터를 키- 벨류로 저장할 수 있는 자료구조입니다. 내부적으로는 정렬되지 않은 맵이면 해시를 사용합니다. 정렬된 맵의 경우 레드블랙트리를 사용합니다.

정렬

머지 소트

배열을 쪼갠 후 다시 합병시키며 정렬하는 방식으로 항상 nlogn이 보장됩니다.

퀵 소트

피벗을 정하고 피벗 앞에서는 작은 값이 피벗 뒤에는 큰값이 오도록 정렬합니다.

이후 작은 값과 큰값으로 나뉘어진 영역을 재귀적으로 분할정복하면서 다시 정렬합니다.

이는 O(NlogN)의 시간복잡도를 가집니다.

그러나 만약 이미 정렬되어있는 배열이라면 최악으로 n^2의 시간복잡도를 가집니다.

그렇기에 이를 개선하기 위해서는 첫,중간,마지막 인덱스의 값을 정렬하고 중간 값을 피벗으로 사용하면 해결할 수 있습니다.

버블 소트

O(N^2)

배열의 크기만큼 반복하면서 해당 인덱스와 다음 인덱스의 값을 비교하면서 정렬하는 방법

Selection sort

배열의 위치를 정해놓고 배열을 순회하면서 들어갈 값을 찾는 방법으로 O(N^2)

Insertion sort

2번째 원소부터 시작해서 그 앞의 배열과 비교해서 넣어야 할 위치를 찾는 방법으로 O(N^2) 그러나 이미 정렬되어있다면 O(N)의 시간복잡도를 가짐

개발에 필요한 지식

OOP

객체지향이란 필요한 데이터를 추상화시켜서 객체를 만들고 객체들간 상호작용을 통해 로직을 구성하는 개발론입니다.

장점으로는 코드 재사용이 용이하며 유지보수가 쉽습니다.

단점으로는 절차지향에 비해 상대적으로 느리며 설계에 많은 노력이 필요합니다.

4가지 키워드

  • 추상화 : 클래스의 정의
  • 캡슐화 : 코드를 수정없이 재사용을 목적으로 함, 클래스라는 캡슐에 기능과 특성을 담음
  • 상속 : 부모 클래스로부터 상속을 받는 것
  • 다향성 : 오버로딩 오버라이딩

SOLID 원칙

객체지향에는 5가지 solid원칙이 있습니다.

S(SRP) (Single Responsibility principle) : 단일 책임 법칙으로 클래스는 하나의 목적만을 가집니다.

O(OCP) (Open Close): 클래스는 확장에는 open되고 수정에는 close여야 합니다.

L(LSP) (리스코브 치환 원칙): 자식 객체의 자리에 부모 객체가 치환되어도 문제가 없어야 합니다.

I(ISP) (interface segration): 자신이 사용하지 않는 인터페이스는 구현하지 않아야 한다.

D(DIP) (depandancy inversion): 상위 클래스가 하위 클래스에 의존하면 안됨

TDD

TDD 란 테스트 주도 개발로 우선 요구되는 기능에 대한 테스트 케이스를 작성하고 해당 케이스를 통과하는 간단한 코드를 작성한 후 상황에 맞게 리팩토링 하는 것 입니다.

함수형 프로그래밍

자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 개발론입니다.

MVC

MVC는 MODEL - VIEW - CONTROLLER 로 디자인 패턴입니다. 비즈니스 로직과 사용자 인터페이스를 분리시켜 서로 영향 없는 개발이 가능합니다.

MODEL은 무엇을 할지 정의합니다. 처리된 데이터, 데이터베이스, 내부 알고리즘 등 내부 비즈니스 로직을 처리합니다.

VIEW 는 사용자에게 보여지는 영역을 처리합니다.

CONTROLLER는 모델에게 어떻게 할것인지를 알려주며 데이터를 처리하고 모델과 뷰 사이를 연결하는 역할을 합니다.

RESTFUL API

먼저 REST란 REpresental State Transfer의 약자로 자원을 표현하여 상태를 전달한다는 뜻으로, 자원을 http를 통해 전달하기 위한 인터페이스입니다.

REST 의 특징으로는 Statelessness, API만 보고 직관적으로 이해 가능 등이 있습니다.

restful 하다는 것은 rest 법칙에 통과한 것으로 그 법칙은 자원, 메서드로 표현, 명사만, 확장자는 표시하지 않음입니다.

쿠키, 세션, 로컬 스토리지

쿠키는 텍스트 형태로 클라이언트에게 저장되며 만료시점은 쿠키 저장시 설정할 수 있습니다. 용량 제한은 한 도메인 당 20개, 하나당 4KB입니다.

세션은 객체 형태로 서버에 저장되며 브라우저 종료시 삭제됩니다. 서버가 허용하는 한 용량 제한이 없습니다.

로컬 스토리지는 세션 스토리지와 로컬 스토리지로 나뉩니다.

로컬 스토리지는 반 영구적 저장이 가능하며 브라우저가 종료해도 유지됩니다. 도메인이 다른 경우 접근이 불가능합니다.

세션 스토리지는 브라우저가 종료되면 삭제되며 각 세션마다 즉 탭이 달라도 개별적으로 저장되며 세션이 다르면 접근하지 못합니다.

쿠키를 이용한 사용자 인증은 왜 보안에 문제가 있나요?

CORS

CORS란 크로스 오리진 리소스 쉐어링으로 다른 도메인간 자원 공유입니다. 본래 다른 도메인간 자원 공유는 Same-origin-policy정책에 의해 막힙니다. 이 설정을 HTML5이후 CORS로 헤더를 통해 크로스도메인간 자원 공유를 가능하게 해줍니다.

서버측에서 CORS로 자원 공유가 가능하게 해주려면 헤더에

access-control-allow-origin을 통해 특정 도메인을, access-control-credentail로 특정 쿠키를, access-control-allow-header로 특정 헤더를, access-control-allow-method로 특정 메서드를 접근 가능하게 설정할 수 있습니다.

브라우저에 url을 입력하면 일어나는 일

먼저 브라우저에 url을 입력하고 엔터를 입력합니다

그러면 웹 브라우저가 URL을 해석합니다.

그리고 해당하는 도메인의 IP를 얻어오기 위해 DNS에 조회합니다.

이 때 먼저 브라우저에 캐시되어 있는지, hosts파일에 참조할 수 있는지 확인하고

없다면 DNS로 요청을 보냅니다.

다음으로 ARP 를 이용해 목적지 경로의 MAC 주소를 알아옵니다.

그리고 대상 서버와 3 WAY HANDSHAKE를 통해 TCP 연결을 합니다.

만약 HTTPS 라면 TCP연결을 한후 HTTPS의 TLS 핸드 쉐이크를 진행합니다.

이제 연결이 됐기에 HTTP 프로토콜로 GET 요청을 보냅니다.

그러면 서버로부터 상태 코드 200인 메시지와 함께 응답 메시지를 받습니다.

html을 받은 클라이언트는 브라우저에 페이지를 띄우고 사용자에게 보여줍니다.

OAuth

인터넷 사용자가 비밀번호를 제공하지 않고 다른 웹사이트의 정보를 이용해 접근 권한을 부여할 수 있는 방법입니다.

  1. 소비자가 서비스 제공자에게 요청 토큰을 요청합니다.
  2. 서비스 제공자가 소비자에게 요청 토큰을 발급합니다.
  3. 소비자가 사용자를 서비스 제공자로 이동시키면서 인증을 수행합니다.
  4. 서비스 제공자가 사용자를 소비자로 이동시킵니다. 이 때 서비스 제공자는 인증 코드를 소비자에게 제공합니다.
  5. 소비자가 접근 토큰을 요청합니다.
  6. 서비스 제공자가 접근 토큰을 발급합니다.
  7. 발급된 접근 토큰을 이용해서 소비자에서 사용자 정보에 접근합니다.

JWT

JWT는 두 개체에서 JSON 객체를 사용하여 가볍고 자가 수용적인 방식으로 정보를 안정성 있게 전달해줍니다.

JWT는 .(닷)을 구분자로 헤더, 페이로드, 서명으로 구성됩니다.

헤더는 토큰의 타입과 헤싱 알고리즘이 들어있습니다.

페이로드 부분에는 토큰을 담을 정보가 들어있습니다. (토큰 발급자,제목,대상자,만료시간 등)

서명은 헤더의 인코딩값과 정보의 인코딩 값을 합친 후 주어진 비밀키로 해쉬를 해 생성됩니다.

AJAX

자바스크립트를 통해서 비동기 요청으로 클라이언트와 서버간 데이터를 주고 받는 기술입니다.

NODE.JS

Node.js란? |

크롬 v8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임

왜 쓰는가? |

프론트엔드와 백엔드를 JavaScript언어로 관리 가능

비동기 처리로 퍼포먼스 증가하며 매우 빠름, 탁월한 생산성

프론트엔드 개발자가 직접 서버 개발을 할 수 있음

광범위한 커뮤니티 (활성화)

IO작업이 많은 서버 개발에 유리

단점 |

싱글스레드여서 하나의 작업이 시간 많이 걸리면 전체 시스템 성능 저하.

코드의 가독성이 좋지 않음. 그러므로 유지보수 어려워 질 수 있음.

컴파일 시 에러를 확인 할 수 없고 실행해야 알 수 있음.

적합한 어플리케이션 |

짧은 시간에 대량의 클라이언트 요청을 처리하는 웹 어플리케이션 개발에 적합

간단하지만 많은 양의 처리를 요하는 서버를 구축할 때 효율이 좋음.

CPU의 사용이 높게 필요한 어플리케이션의 경우 부적합

JS

ES버전에 따른 특징 ES3 흔히 말하는 자바스크립트 ES5 배열에 forEach, map, filter, reduce, some과 같은 메소드 지원 Object에 대한 getter / setter 지원 JSON 지원 ES 2015(ES6) let, const 키워드 추가 기존의 변수는 함수 scope를 가진 var 키워드를 이용하였습니다. 때문에 block scope를 가진 let과 const 키워드를 추가했습니다. arrow 문법 지원 arrow 문법은 두가지 장점이 있습니다. 첫째, 편하고 간결해진 코드를 작성할 수 있습니다. 둘째 this를 바인딩 하지 않습니다. iterator / generator 추가 module import / export 추가 Promise 도입 프로토 타입만 있었으나 class 도입 구조 분해 할당 탬플릿 리터럴 ECMA 2017(ES8) async - await 도입

  • let, var, const 차이

  • 클로저

    클로저는 독립적인 변수를 가리키는 함수입니다. 또한 클러저는 만들어진 환경을 기억합니다.

  • 콜백

    다른 함수의 매개변수로 함수를 전달하고, 어떤 이벤트가 발생한 후 매개변수로 전달한 함수가 다시 호출되는 것을 의미합니다.

  • 프라미스

    프라미는 비동기 처리에 사용되는 객체로 시점에 관계없이 동일한 결과를 낼 수 있도록 해주는 도구입니다.

  • 이벤트 루프

    이벤트 발생시 호출한 콜백 함수들은 관리하고, 호출된 콜백함수의 실행 순서를 결정하는 역할을 합니다.

ORM이란 무엇인가요

ORM이란 객체와 관계와의 설정을 의미하는 것으로 객체 모델과 관계형 모델간에 불일치가 존재하는데 이 객체 관계를 바탕으로 SQL을 생성하여 불일치는 해결하는 것입니다.

'취업 관련' 카테고리의 다른 글

프로그래머스를 이용한 코딩테스트 준비 소감  (0) 2020.03.11

+ Recent posts