서류 통과.. 도 안되는거는 뭐가 문제가 있다는거 아닌가.. 이력서랑 포트폴리오 수정을 해보자 이렇게는 안될거 같고,

음..

노션으로 이력서를 형식적인 틀에서 벗어나게.. 하고 보내보자
그리고 포트폴리오 기술 나열해놓은 곳에 이 기술을 배운 이유와 왜 이 기능에 접목시켰는지 좀 더 자세하게
내가 한 개발에서 왜 이렇게 했는지, 어떤 성장을 했는지, 성과는 어땠는지

.
.
.

구글 문서로 이력서 수정은 완료했고 -> 계속 수정은 해야겠지만...

 

 

그 전에 이력서 양식으로만 보내는 것보다 개발자로서는 유튜브도 찾아보고 여기저기 서치해보니 프로젝트, 어떤 기술을 가지고 있는지를 좀 더 어필하는게 중요한것같다.

참고사이트

.
.
.

이거 생각보다 기간을 좀 잡아야할거같은데.. 진짜 짧아도 3개월...? 음..

 

루틴✨

지치지 않게 계획적인 생활을 좀 짜야할것같다.

  1. 이력서 넣기
    → 매일 최소 3개씩 넣자 (그냥 이력서 10곳 넣는거 말고, 회사 분석하고 지원동기를 좀 더 구체화해서)
  2. 코딩 테스트
    → 매일 1시간씩 알고리즘 문제 풀기
  3. 독서
    → 컴퓨터 기초 지식 계속 쌓아야지!
  4. 기술 질문 정리
    → 예상 질문 뽑아내고, 답변 정리해서 항시 대기 상태!
  5. 프로젝트
    → 개인 프로젝트 작업물을 더 만들어야 될 듯

이렇게 하고, 일요일은 그냥 편하게 쉬는 걸로(?) 음.. 프로젝트는 하자 😀 오후에만 쉬자 키키

사실 아무것도 안하고 있는게 더 힘들어.. 우히..

지금까지 계속 이거해야되는데 저거 해야되는데 계속 혼돈의 연속..? 이라는 느낌이였는데 지금 상태는 어느정도는 정리가 된 상태이고, 만들어둔 프로젝트나 이력서 포폴 업데이트를 계속 하면 되는 상태라 다른 작업도 하면서 계속 보충해나가면 될 것같다... 아마두

괜찮아

운영체제 기본 개념

  1. OS(운영체제)란?
  2. 커널이 무엇?
  3. 프로세스와 쓰레드의 차이
  4. 컨텍스트 스위칭이 무엇이며, 왜 필요한지 설명해주세요

 

 

  1. 운영체제(OS, Operating System)는 하드웨어와 소프트웨어를 관리하고, 사용자가 컴퓨터를 효율적으로 사용할 수 있도록 인터페이스를 제공하는 시스템 소프트웨어이다.
    주요 역할로는 프로세스 관리, 메모리 관리, 파일 시스템 관리, 디바이스 제어 등이 있다.

→ Windows, macOS, Linux와 같은 운영체제가 있으며, 사용자 프로그램이 하드웨어에 직접 접근하지 못하도록 보호하면서도, 효율적인 자원 관리를 가능하게 한다.

 

2. 커널(Kernel)은 운영체제의 핵심 구성 요소로, 하드웨어와 소프트웨어 간의 중재자 역할을 한다.

 

주요기능

- 프로세스 관리 : 여러 프로그램이 CPU를 번갈아 사용할 수 있도록 차례를 정리하고 관리 ( → 게임과 브라우저를 동시에 실행해도 컴퓨터가 멈추지 않는 이유) 
- 메모리 관리 : 프로그램이 필요한 메모리를 적당히 나눠주고, 쓴 메모리를 정리한다. ( → 앱이 실행될 때 메모리가 부족해지지 않도록 관리)
- 장치 제어 : 키보드, 마우스, 디스크 같은 하드웨어가 잘 작동하도록 명령을 내리고 통제한다. ( → 마우스 클릭이 제대로 작동하는 이유)
- 시스템 호출 처리 : 프로그램이 운영체제 기능을 요청할 때 다리를 놓아주는 역할을 한다. ( → 파일 저장, 네트워크 연결 같은 작업)
  1. 프로세스(Process)는 실행 중인 프로그램 하나를 독립된 단위로 생각하면 된다. 각각 자신만의 메모리 공간을 가지고 다른 프로세스와는 철저히 분리되어 있다. ( → 여러 개의 Word 파일을 각각 열면, 각 파일이 별도의 프로세스로 실행된다. )

쓰레드(Thread)는 프로세스 안에서 실행되는 작업의 흐름이다. 같은 프로세스 안에서는 메모리와 자원을 공유한다. ( → 웹 브라우저를 켰을 때, 하나의 창은 프로세스지만, 각 탭은 쓰레드로 실행된다. 이 덕분에 한 탭이 멈춰도 브라우저 전체가 멈추지 않는다.)

 

2. 컨텍스트 스위칭(Context Switching)는 CPU가 실행 중인 프로세스나 쓰레드의 상태를 저장하고, 새로운 프로세스의 상태를 불러와 실행하는 과정을 말한다.

왜 필요..?

→ 멀티태스킹! 여러 작업(프로세스/쓰레드)을 번갈아 가며 실행해야 하기 때문 (컴퓨터가 음악을 재새앟면서 동시에 문서를 편집하거나 파일을 다운로드하는 경우)

→ 공정성! 특정 작업이 CPU를 독점하지 않도록, CPU 시간을 모든 작업이 공평하게 나눠 쓰게 해준다. (게임도 하고 있는데, 백그라운드에서 바이러스 검사도 진행 중인 상황)

→ 응답성! 사용자 프로그램이 즉각적으로 반응하도록 빠르게 다른 작업으로 전환할 수 있다

 

컨텍스트 스위칭은 필수적이지만, 상태를 저장하고 불러오는 데 시간이 들기 때문에 오버헤드(비용)가 발생하므로 효율적인 스케줄링 알고리즘이 중요하다

 

 

메모리 관리

  1. 메모리의 구조를 영역별로 설명
  2. 힙 영역과 스택 영역의 차이
  3. 가상 메모리가 무엇인지
  4. 페이징과 세그멘테이션의 차이
  5. 내부 단편화와 외부 단편화의 차이
  6. 페이지 교체가 무엇이고, 교체 알고리즘의 예를 설명해주세요.

 

 

  1. 코드 영역, 데이터 영역, 힙 영역, 스택 영역
    코드 영역(Text Segment)은 프로그램의 실행 명령어(코드)가 저장되는 곳
  • 주로 읽기 전용이라 코드를 수정할 수 없고, CPU는 코드 영역에 저장된 명령어들을 하나씩 가져가서 실행한다.

데이터 영역(Data Segment)은 프로그램 실행 전부터 메모리에 올라가는 전역 변수와 정적 변수들이 저장된다.

  • 메인 함수 전에 선언되어 프로그램의 시작과 동시에 할당되고 프로그램이 종료돼야 메모리가 소멸된다.

힙 영역 (Heap Segment)은 해당 공간에 메모리 할당하는 것을 동적 할당이라고 부른다. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

스택 영역 (Stack Segment)은 함수 호출 시 생성되는 지역 변수, 매개변수, 함수 호출 정보들이 저장된다. 함수가 끝나면 해당 메모리가 자동으로 해제된다.

  • LIFO(Last In, First Out) 구조로, 가장 나중에 넣은 것이 가장 먼저 제거된다.

 

 

2. 힙은 동적 메모리 할당을 위한 공간으로, 런타임에 사용자가 명시적으로 메모리를 할당하고 해제해야 하며 유연하지만 속도가 느리고, 잘못 관리하면 메모리 누수가 발생할 수 있다. 반면, 스택은 함수 호출 시 자동으로 메모리가 할당되고, 함수가 끝나면 자동으로 해제되어 빠르고 효율적이지만, 크기가 고정되어 있고 동적 할당은 어렵다.

힙은 유연성이 장점이고, 스택은 속도와 관리 편리성이 강점이다.

 


 

3. 가상 메모리는 컴퓨터가 실제 물리적 메모리보다 더 큰 메모리를 사용하는 것처럼 보이게 만드는 기술로, 실제로 필요한 부분만 물리적 메모리에 올리고, 나머지는 디스크에 저장하여 메모리 부족 문제를 해결하고 여러 프로그램을 동시에 실행할 수 있게 한다.


 

프로세스 및 동기화

  1. 멀티 쓰레드 환경에서 주의해야 할 점을 설명
  2. Race Condition(경쟁 상태)과 이를 방지하기 위한 방법을 설명
  3. Deadlock(교착 상태)에 대해 설명하고, 해결 방법을 제시
  4. 뮤텍스(Mutex)와 세마포어(Semaphore)의 차이를 설명

스케줄링 및 성능

  1. CPU 스케줄링이 무엇인지
  2. 선점(Preemption)과 비선점(Non-preemption)의 차이를 설명
  3. 동시성(Concurrency)과 병렬성(Parallelism)의 차이를 설명

시스템 호출 및 인터럽트

  1. System Call이 무엇?
  2. Interrupt(인터럽트)가 무엇인지 설명

+추가

  1. 크롬 브라우저에서 각 탭이 오류가 나더라도 다른 탭에 영향을 끼치지 않는 이유를 설명
  2. '식사하는 철학자 문제'에서 교착 상태가 발생하는 조건과 해결 방법을 설명
 

HTTP와 HTTPS

  1. HTTP의 특징
  2. HTTP와 HTTPS의 차이점
  3. HTTP Method에는 어떤 것들이 있는지
  4. 멱등성에 대해 설명하고, HTTP 메소드에서는 어떤 메소드가 멱등성 메소드인지 설명
  5. HTTP의 Kepp-alive 헤더에 대해 설명
  6. HTTP 1.0 vs HTTP 1.1 vs HTTP 2.0을 각각 비교해서 설명
  1. HTTP는 world wide web에서 정보를 주고받을 수 있는 프로토콜, client-server간의 request-response 프로토콜, 주로 HTML 문서를 주고 받는데 사용함
  2. HTTP와 HTTPS의 차이점은 HTTP는 데이터를 평문으로 전송하여 보안에 취약하며, HTTPS는 SSL/TLS로 암호화하여 보안 강화
  3. HTTP는 클랄이언트가 서버에 요청할 때 다양한 메소드를 사용한다. GET은 데이터를 조회할 때 사용하며 서버의 자원을 변경하지 않는다. POST는 서버에 데이터를 생성하거나 전송할 때 사용, PUT은 기존 데이터를 완전히 대체하며, 데이터 생성에도 사용, PATCH는 데이터를 부분적으로 업데이터, DELETE는 서버의 데이터를 삭제
  4. 멱등성은 같은 요청을 여러 번 보내더라도 결과가 항상 동일한 특성을 말한다. 예를 들어, GET 요청은 데이터를 조회하는 데 사용되며, 몇 번 요청하더라도 서버 상태에 영향을 주지 않아 멱등성을 가진다. 또한 PUT, DELETE, HEAD, OPTIONS도 멱등성을 가지며, 여러 번 요청해도 서버 상태는 동일하게 유지된다.
    POST는 멱등성을 가지지 않는데, 동일 요청을 반복하면 데이터가 중복 생성될 수 있기 때문
  5. HTTP 1.1에서는 Keep-alive 헤더를 사용해 연결을 지속적으로 유지할 수 있다. keep-alive를 활성화하면 요청과 응답마다 연결을 끊지 않고, 여러 요청을 같은 연결로 처리할 수 있어 성능이 향상된다.
  6. HTTP 프로토콜은 성능 향상을 위해 발전해 왔다. HTTP 1.0에서는 요청당 하나의 연결만 사용해, 요청-응답 후 연결이 종료되었다, HTTP 1.1은 keep-alive를 통해 연결을 재사용할 수 있게 하였고, 여러 요청을 한 번에 처리할 수 있는 파이프라이닝을 도입, HTTP 2.0은 한 단계 더 발전해 멀티플렉싱을 도입하여 하나의 연결로 여러 요청을 동시에 처리할 수 있다. 또한, 헤더 압축으로 데이터를 더 효율적으로 전송하며, 웹 페이지 로딩 속도가 크게 개선

CORS와 REST API

  1. CORS가 무엇?
  2. REST API와 RESTful 하다는 것이 무엇인지
  1. CORS는 브라우저의 보안 정책으로, 다른 도메인에서 리소스를 요청할 때 이를 제어하는 메커니즘이다.
    한 도메인에서 다른 도메인의 API를 호출하면 기본적으로 차단되지만, 서버가 특정 도메인을 허용하면 요청이 가능해진다. 이를 통해 보안과 접근을 동시에 관리한다.
  1. REST API는 HTTP를 기반으로 자원을 URL로 표현하고, GET, POST, PUT, DELETE 같은 메소드로 자원에 접근하는 방식이다. RESTful은 REST의 원칙을 잘 준수하는 API를 말한다. 자원을 명확히 표현하고, HTTP 메소드를 적절히 사용하며, 상태를 저장하지 않는다는 점에서 RESTful이라고 한다.

쿠키와 세션, 인증 방식

  1. 쿠키와 세션이 왜 필요하고 어떻게 다른지
  2. session의 값을 가져오는 key를 "user"라고 할 때, 사용자 A와 B가 다른 값을 받을 수 있는 이유?
  3. session은 서버에 저장되고, Cookie는 클라이언트에 저장되는데, 쿠키가 안되는 상황에서 세션은 사용할 수 있을까?
  4. JWT Token이 무엇인지 설명
  5. 세션 기반 인증과 토큰 기반 인증은 각각 어느 경우에 적합한지 설명
  1. 쿠키와 세션은 클라이언트의 상태를 유지하기 위해 필요하다. 쿠키는 클라이언트 측에 저장되며, 브라우저가 서버에 자동으로 보내는 방식이다. 세션은 서버에 저장되며, 클라이언트는 세션 ID를 통해 서버의 데이터를 참조한다. 주요 차이는 저장 위치와 보안성으로, 세션은 서버에 저장되기 때문에 보안이 더 강하다.
  2. 세션은 각 사용자에게 고유한 세션 ID를 발급한다. 이 세션 ID는 쿠기를 통해 클라이언트와 서버 간에 전달되므로, 서버는 이 ID로 사용자를 구분하고 각각의 세션 데이터를 반환한다.
  1. 쿠키가 동작하지 않는다면, 세션 ID를 클라이언트와 서버 간에 전달할 다른 방법이 필요하다. 이 경우, URL 파라미터나 헤더를 통해 세션 ID를 전달하여 세션을 사용할 수 있다.
  1. JWT(JSON Web Token)는 정보를 JSON 형식으로 담아 서버와 클라이언트 간 인증에 사용하는 토큰이다. 토큰에는 헤더, 페이로드, 서명이 포함되며, 서명을 통해 데이터의 무결성을 보장한다. 서버는 토큰을 저장하지 않아도 되므로 무상태성을 유지한다.
  1. 세션 기반 인증은 서버가 상태를 유지하며, 보안성이 중요하고 클라이언트 수가 적은 환경에 적합하다, 토큰 기반 인증은 서버가 상태를 저장하지 않기 때문에 확장성이 뛰어나고, 분산 시스템이나 모바일 환경에서 적합하다.

URI, URL, HTTP 메소드

  1. URI와 URL이 무엇이 다른지
  2. GET과 POST가 다른점
  1. URI(Uniform Resource Identifier) -> 자원을 식별하는 모든 방법을 포함하는 개념, URL(Uniform Resource Locator) -> URI의 한 형태로, 자원의 위치를 나타내며 자원에 접근할 수 있는 방법을 포함한다.
    쉽게 말해, 모든 URL은 URI이지만, URI 중 위치를 나타내는 경우에만 URL이라고 부른다.
  1. GET은 데이터를 서버에서 가져올 때 사용하며, 요청 데이터가 URL에 포함된다, 주로 조회 작업에 사용되고, 브라우저 캐싱이 가능하다. POST는 데이터를 서버에 전송하거나 생성할 때 사용하며, 요청 데이터가 본문에 포함된다, 주로 생성 작업에 사용되며, 민감한 데이터를 보낼 대 적합하다.

GET은 데이터 조회, POST는 데이터 전송 및 생성에 적합하며, GET은 URL에 데이터를 노출하지만 POST는 본문에 데이터를 숨긴다.

네트워크 설정 및 기타

  1. Connection Timeout과 Read Timeout의 차이
  2. 공인 IP와 사설 IP의 차이에 대해 설명
  1. Connection Timeout은 서버와 연결을 시도할 때, 연결이 설정되지 않는 경우 기다리는 최대 시간을 설정 / Read Timeout은 연결은 성공했지만, 서버가 데이터를 보내지 않을 때 응답을 기다리는 최대 시간을 설정
  2. 공인 IP는 인터넷에서 고유하게 식별되는 IP 주소로, 전 세계적으로 유일하며 인터넷에 직접 연결, 사설 IP는 내부 네트워크에서만 사용되는 IP 주소로, 라우터가 NAT(Network Address Translation)를 통해 공인 IP와 연결한다.

공인 IP는 인터넷에서 유일한 주소, 사설 IP는 내부 네트워크용 주소로 외부에서 직접 접근할 수 없다.

OSI 7계층 관련

  1. OSI 7 계층의 각 계층에 대해 설명
  2. 전송계층과 데이터링크 계층 모두 신뢰성 관련 기능을 제공하는데, 어떤 차이가 있는지?
  1. OSI 7계층은 네트워크 통신을 단계적으로 나누어 설명하는 모델로, 각 계층은 특정한 역할을 담당

물리 계층 -> 데이터 전송을 위한 하드웨어적 연결과 신호 변환을 담당
데이터링크 계층 -> 프레임 단위로 데이터를 전송하며, 오류를 검출하고 수정하는 역할을 한다. 로컬 네트워크 환경에서 신뢰성을 보장
네트워크 계층 -> 데이터를 패킷 단위로 처리하며, 목적지까지 최적의 경로를 찾아 전달한다. IP 주소와 라우터가 이 계츠으이 주요 요소이다.
전송 계층 -> 데이터의 순서, 손실 여부를 확인하고, 흐름 제어나 재전송 등의 기능을 제공, 대표적인 프로토콜은 TCP와 UDP이다.
세션 계층 -> 통신 세션을 생성, 유지, 종료하며, 연결 상태를 관리, 데이터 교환을 위한 세션 관리 기능 제공
표현 계층 -> 데이터의 형식 변환, 암호화, 압축 등을 담당하고, 서로 다른 데이터 표현 방식을 통일해준다.
응용 계층 -> 사용자가 직접 접근하는 계층으로, 이메일, 웹 브라우저와 같은 애플리케이션이 사용하는 네트워크 서비스를 제공한다.

  1. 데이터링크 계층은 같은 네트워크 내에서 작동하며, 프레임 단위로 오류를 검출하고 수정한다. 주로 로컬 영역 네트워크(LAN)에서 신뢰성을 보장하며, 데이터 전송 중 충돌을 해결하거나 재전송을 처리한다.

전송 계층은 종단 간 통신에서 데이터를 관리한다. 데이터 세그먼트를 올바른 순서로 재조립하고, 손실된 데이터가 있으면 재전송을 요청한다. 또한 송신 측과 수신 측의 데이터 흐름을 조절하는 흐름 제어와 혼잡 제어 기능을 제공한다.

데이터링크 계층은 네트워크 내부에서의 신뢰성을, 전송 계층은 송신자와 수신자 간 통신 전체에서 신뢰성을 보장한다

전송계층 관련

  1. 전송계층이 데이터 분실을 확인하는 방법에 대해 설명
  2. 전송계층이 제공하는 신뢰성 관련 기능 중, 흐름제어에 대해 설명
  3. 전송계층이 제공하는 신뢰성 관련 기능 중, 오류제어(재전송 프로토콜)에 대해 설명
  4. 전송계층이 제공하는 신뢰성 관련 기능 중, 혼잡제어에 대해 설명
  1. 전송계층은 ACK(Acknowledgment)를 사용해 데이터 분실 여부를 확인한다. 송신자가 데이터를 보내면 수신자가 ACK를 보내고, 정해진 시간 안에 ACK가 도착하지 않으면 데이터가 손실된 것으로 판단하고 재전송한다.
  2. 흐름 제어는 송신자와 수신자의 처리 속도 차이를 조절하는 기능이다. 수신자가 처리할 수 있는 데이터 양을 알려주면, 송신자는 이를 기반으로 데이터를 전송해 버퍼 오버플로우(프로그램이 실행될 때 입력받는 값이 버퍼를 가득 채우다 못해 넘쳐흘러 버퍼 이후의 공간을 침범하는 현상)를 방지한다.
  3. 오류 제어는 데이터 전송 중 손실되거나 손상된 데이터를 재전송하는 기능이다. 수신자는 오류를 검출하면 송신자에게 NACK(Negative Acknowledgment) 또는 ACK 누락으로 이를 알리고, 송신자는 해당 데이터를 재전송한다.
  1. 혼잡 제어는 네트워크 혼잡을 완화하기 위해 데이터 전송 속도를 조절하는 기능이다. 송신자는 네트워크 상태를 모너링하고, 혼잡이 감지되면 전송 속도를 줄여 데이터 손실을 방지한다.

DNS와 도메인 처리 과정

  1. DNS가 무엇인지 설명
  2. www.google.com 도메인을 브라우저에 입력했을 때 일어나는 일을 순차적으로 설명
  1. DNS(Domain Name System)는 사람이 이해하기 쉬운 도메인 이름을 컴퓨터가 이해할 수 있는 IP주소로 변환하는 시스템이다. 인터넷의 전화번호부 역할을 하며, 사용자가 도메인 이름을 입력하면 IP 주소를 찾아 서버와 통신할 수 있도록 도와준다.
  2. 캐시 확인 : 브라우저, OS, 또는 로컬 DNS 서버에서 www.google.com의 IP 주소가 캐시되어있는지 확인, DNS 요청 : 캐시에 없으면, DNS 서버에 도메인 이름의 IP 주소를 요청한다, DNS 서버 탐색 (루트 DNS 서버 -> .com TLD DNS 서버 -> Google의 권한 DNS 서버 순으로 탐색해 IP 주소를 찾는다.), IP 주소 반환 : 찾은 IP 주소를 클라이언트로 반환, 서버 연결 : 브라우저가 반환된 IP 주소로 TCP 연결을 설정하고, HTTP 또는 HTTPS 요청을 보낸다.
    서버가 요청을 처리하고 HTML, CSS, JS 등의 데이터를 반환해 브라우저가 웹 페이지를 렌더링한다.

TCP와 연결 관리

  1. TCP Connection 시 3-way handshaking에 대해 설명
  2. TCP Connection을 해제하는 경우에 대해 설명
  3. 연결해제 시 4-way handshacking을 사용하는 이유
  4. server가 Client에게 FIN 플래그를 전송하기 전에 전송한 패킷이 지연이나 유실로 인해 FIN 패킷보다 늦게 도착하면 어떻게 처리 하는지
  1. TCP는 신뢰성 있는 연결을 위해 3-way Handshaking을 사용, SYN -> 클라이언트가 서버에 연결 요청을 보낸다, SYN-ACK -> 서버가 요청을 받고, 연결 확인 응답을 클라이언트로 보낸다, ACK -> 클라이언트가 응답을 확인하고 연결을 완료한다.
    이 과정으로 양측이 데이터를 전송할 준비가 되었음을 확인
  1. TCP 연결 해제는 4-way Handshaking을 사용, 클라이언트가 FIN 플래그를 보내 연결 종료를 요청 -> 서버가 ACK를 보내 요청을 확인 -> 서버가 처리 중인 데이터를 마무리한 뒤 FIN 플래그를 보낸다. -> 클라이언트가 ACK로 응답하여 연결이 종료된다.
  1. 연결해제는 데이터 손실을 방지하기 위해 양측이 각각 독립적으로 종료 과정을 처리한다. 서버가 아직 처리 중인 데이터가 있을 수 있으므로, 먼저 클라이언트의 FIN 요청을 확인한 후, 서버가 데이터를 모두 처리한 뒤 FIN을 전송해 종료를 완료한다.
  1. TCP는 시퀀스 번호를 사용해 패킷 순서를 관리, FIN 플래그 이후 도착한 데이터 패킷은 시퀀스 번호를 확인하여 정상적으로 수신된 데이터인지 판단, 만약 데이터가 유효하다면 서버는 데이터를 처리하고, 그렇지 않다면 무시한다. FIN 패킷 자체가 연결 종료의 신호일 뿐, 데이터의 순서를 관리하는 것은 시퀀스 번호가 담당한다.

포트와 소켓

  1. 포트? 소켓?
  1. 포트는 IP 주소 내에서 특정 서비를 구분하기 위한 숫자이고, 하나의 컴퓨터(또는 IP)에서 여러 애플리케이션이 네트워크를 사용할 수 있도록 구분하는 역할을 한다.
  2. 소켓은 IP 주소 + 포트 번호로 구성된 네트워크 통신의 엔드포인트이다, 클라이언트와 서버 간 데이터를 주고받기 위해 생성되며, 특정 연결을 식별한다.

TCP와 UDP 비교

  1. TCP와 UDP의 차이
  2. UDP가 TCP에 비해 갖는 장점
  3. UDP에 Checksum 필드가 있는 이유
  1. TCP는 연결 기반 프로토콜로, 데이터 전송의 신뢰성을 보장한다. (데이터 순서 보장, 재전송, 흐름 제어), UDP는 연결 없이 빠르게 데이터를 전송하는 프로토콜로, 신뢰성보다는 속도가 중요할 때 사용된다.
  2. UDP가 TCP에 비해 갖는 장점은 연결 설정 과정(3-way Handshaking)이 없어서 빠르고 가볍다. 데이터 전송에 지연이 적고, 실시간 통신에 적합하다.
  3. UDP에 Checksum 필드가 있는 이유는 데이터가 전송 중 손상되었는지 확인하기 위해 오류 검출 기능을 제공한다. Checksum은 데이터의 무결성을 검사하며, 손상된 데이터는 폐기된다. UDP는 신뢰성은 보장하지 않지만, 최소한의 오류 검출 기능은 갖추고 있다.

추가적인 SQL 활용

  1. JOIN의 종류와 차이점
  2. GROUP BY와 HAVING의 차이점
  3. UNION과 UNION ALL의 차이점
  4. 데이터 삭제 시 DELETE와 TRUNCATE의 차이점
  1. JOIN은 두 개 이상의 테이블을 결합하여 관련 데이터를 가져오는 데 사용된다.
  • INNER JOIN -> 두 테이블에서 조건을 만족하는 공통 데이터만 반환
  • LEFT JOIN -> 왼쪽 테이블의 모든 데이터와, 조건이 일치하는 오른쪽 테이블 데이터를 반환한다. 조건이 맞지 않는 경우 오른쪽 데이터는 null로 반환
  • RIGHT JOIN -> 오른쪽 테이블의 모든 데이터와, 조건이 일치하는 왼쪽 테이블 데이터를 반환, 조건이 맞지 않는 경우 왼쪽 데이터는 null로 반환
  • FULL JOIN -> 두 테이블의 모든 데이터를 가져오며, 조건이 맞지 않는 부분은 null로 채워진다.
    JOIN은 데이터베이스에서 테이블 간 관계를 활용하여 데이터를 효율적으로 추출하는데 사용된다.

2. GROUP BY는 데이터를 특정 열 기준으로

3. UNION과 UNION ALL은 두 개 이상의 SELECT 결과를 결합하는데 사용

 

UNION은 중복된 데이터를 제거한 결과를 반환, UNION ALL은 중복된 데이터를 포함하여 모든 결과를 반환

UNION은 중복 제거로 인해 추가적인 정렬 작업이 필요하므로 UNION ALL보다 속도가 느릴 수 있다. 중복 제거가 필요하지 않은 경우 UNION ALL을 사용하는 것이 효율적이다.

 

4. DELETE와 TRUNCATE는 데이터 삭제에 사용되지만, DELETE는 조건을 지정하여 특정 행만 삭제할 수 있고, 트랜잭션을 지원하므로 ROLLBACK으로 복구가 가능 / TRUNCATE는 테이블의 모든 데이터를 일괄 삭제하며, 롤백이 불가능, 테이블의 구조는 유지되며, 작업 속도가 DELETE보다 빠르다.

데이터베이스 키

  1. DB 키의 종류와 역할
  2. 외래 키를 사용하는 이유

 

  1. 데이터베이스 키는 테이블의 각 행을 고유하게 식별하거나, 테이블 간의 관계를 정의하는데 사용된다.
  • 기본키(Primary Key) : 각 행을 고유하게 식별하며, NULL 값을 허용하지 않는다.
  • 후보키(Candidate Key) : 기본키로 사용할 수 있는 후보 열의 집합으로, 테이블에서 유일성과 최소성을 만족하는 모든 열
  • 대체키(Alternate Key) : 후보키 중에서 기본키로 선택되지 않은 열
  • 외래키(Foreign Key) : 한 테이블에서 다른 테이블의 기본키를 참조하여 두 테이블 간의 관계를 정의
  • 슈퍼키(Super Key) : 테이블에서 유일성을 만족하는 열이나 열의 조합

2. 외래키는 한 테이블의 열이 다른 테이블의 기본키를 참조하도록 설정하여, 테이블 간의 관계를 정의하고 데이터의 무결성을 유지하는데 사용

+추가

  1. 데이터 중복이 발생하면 어떤 문제?
  2. NoSQL의 BASE 특성은 무엇인가
  3. RDBMS에서 성능 최적화를 위해 어떤 작업을 할 수 있는가
  4. 트랜잭션 격리 수준(Isolation Levels)의 종류와 차이점
  5. 데이터베이스 샤딩(Sharding)과 파티셔닝(Partitioning)의 차이점

 

  1. 데이터 중복은 데이터베이스의 효율성과 무결성을 저하시킬 수 있다. 데이터 불일치(동일한 데이터가 여러 위치에서 다르게 저장되면, 데이터의 신뢰성이 떨어진다.), 저장 공간 낭비(불필요한 데이터 중복으로 인해 저장 공간이 비효율적으로 사용), 갱신 이상 ( 중복 데이터 중 일부만 수정되면, 데이터 일관성이 깨질 수 있다.), 쿼리 성능 저하(중복 데이터로 인해 검색 및 집계 작업이 느려질 수 있다.) 정규화를 통해 데이터 중복을 최소화하여 이러한 문제를 방지
  2. BASE는 NoSQL 데이터베이스의 모델로 Basically Available (시스템이 항상 가용성을 유지해야 함), Soft State(데이터는 항상 일관성을 보장하지 않으며, 일정 시간 동안 변경될 수 있음), Eventual Consistency (데이터의 일관성은 시간이 지나면서 최종적으로 보장됨)
    BASE는 RDBMS의 ACID와는 대조적으로, 대규모 분산 시스템에서의 유연성과 확장성을 중시
  3. RDBMS에서 성능 최적화를 위해서는 인덱스 사용(필요한 열에 적절한 인덱스를 추가하여 검색 성능을 향상), 정규화와 역정규화(데이터 중복을 줄여 저장 효율을 높이거나, 역정규화를 통해 쿼리 성능을 최적화), 쿼리 최적화(쿼리 실행 계획 분석을 통해 비효율적인 쿼리를 개선), 파티셔닝(큰 테이블을 여러 작은 테이블로 나눠서 데이터 접근 시간을 줄임), 캐싱(자주 사용되는 데이터를 캐시에 저장하여 데이터베이스 부하를 줄임), 커넥션 풀링(데이터베이스 연결을 재사용하여 연결 비용을 절감), 하드웨어 업그레이드(빠른 디스크(I/O)와 메모리 증가로 성능 개선)

데이터베이스의 기본 개념

  1. 데이터베이스를 사용하는 이유?
  2. 트랜잭션이 무엇?
  3. RDBMS와 NoSQL의 차이점
  1. 데이터베이스는 데이터를 체계적으로 저장하고 관리하여 데이터 중복을 줄이고, 무결성을 보장하며, 빠르고 효율적인 검색과 처리가 가능하도록 도와줍니다. 또한, 동시성 제어를 통해 여러 사용자가 데이터를 안전하게 공유할 수 있으며, 백업과 복구 기능을 통해 데이터의 안정성을 제공한다. 이러한 이유로 데이터를 체계적으로 관리하고 활용해야 하는 시스템에서 데이터베이스가 필수적이다.
  2. 트랜잭션은 데이터베이스에서 수행되는 논리적 작업의 단위로, 데이터를 일관성 있게 관리하기 위해 사용된다. 트랜잭션은 반드시 ACID 특성을 만족해야 하는데, 이는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durablility)을 뜻한다.
    예를 들어, 은행 송금 시스템에서 돈을 보내는 작업이 완료되려면, 계좌 차감과 입금이 모두 성공적으로 수행되거나, 실패 시 이전 상태로 복구되어야 한다. 트랜잭션은 이러한 작업의 신뢰성을 보장한다.
  3. RDBMS(Relational Database Management System)는 데이터를 테이블 형태로 저장하며, 관계형 모델을 기반으로 정규화와 강력한 트랜잭션 관리를 지원한다. 대표적인 예로 MySQL, PostgreSQL 등이 있다.

NoSQL은 데이터를 유연한 구조로 저장하며, JSON, Key-Value와 같은 다양한 형식을 지원한다. NoSQL은 수평적 확장성과 빠른 읽기/쓰기가 필요한 대규모 데이터 처리에 적합하며, 대표적으로 MongoDB 등이 있다.

RDBMS는 관계형 데이터와 정형 데이터 관리에, NoSQL은 비정형 데이터나 실시간 확장성이 필요한 환경에 적합하다.

데이터베이스 언어

  1. DDL, DML, DCL의 차이점
  2. 자주 사용하는 SQL 명령어에 대해 설명
  1. DDL(Data Definition Language)은 데이터베이스의 구조를 정의하거나 변경하는 명령어로, 테이블 생성(CREATE), 수정(ALTER), 삭제(DROP)과 같은 작업에 사용된다. DML(Data Manipulation Language)은 데이터베이스의 데이터를 조회하거나 수정하는 명령어로, 데이터를 삽입(INSERT), 조회(SELECT), 갱신(UPDATE), 삭제(DELETE)하는 데 사용된다. DCL(Data Control Language)은 데이터베이스의 권한을 제어하는 명령어로, 사용자에게 권한은 부여(GRANT)하거나 회수(REVOKE)하는 작업에 사용된다.
    각각의 언어는 데이터베이스를 구성하고 데이터를 관리하며, 보안을 유지하는 데 중요한 역할을 한다.
  2. SQL 명령어는 데이터베이스와 상호작용하기 위해 사용되며, 주로 사용되는 명령어는 SELECT(데이터를 조회할 때 사용), WHERE (특정 조건에 맞는 데이터를 조회하거나 수정할때 사용), JOIN(여러 테이블에서 관련 데이터를 결합하여 가져옴), INSERT(데이터를 테이블에 추가할 때 사용), UPDATE(기존 데이터를 수정할 때 사용), DELETE(데이터를 삭제할 때 사용), GROUP BY(데이터를 그룹화하고 집계 함수와 함께 사용)
    이러한 명령어는 데이터를 효과적으로 조회, 분석, 관리하는 데 필수적

데이터 모델링 및 설계

  1. 정규화란 무엇? 왜 필요?
  2. 역정규화란 무엇? 언제 필요한가
  3. 테이블 설계를 잘못하면 어떤 문제가 발생할까
  1. 정규화는 테이블의 설계 과정에서 데이터 중복을 줄이고, 데이터 무결성을 보장하기 위해 데이터베이스를 구조화하는 방법이다. 이를 통해 데이터의 일관성을 유지하고, 저장 공간을 효율적으로 사용하며, 갱신 이상, 삭제 이상 같은 문제를 방지할 수 있다. 정규화는 대표적으로 1, 2, 3 정규형이 있다.
  2. 역정규화는 정규화를 통해 나누어진 테이블을 성능 최적화를 위해 다시 합치거나 데이터를 중복 저장하는 과정이다. 이는 조회 성능을 향상시키기 위해 사용되며, 특히 읽기 작업이 많고 쓰기 작업이 적은 시스템에서 효율적이다.
  3. 테이블 설계를 잘못하면 데이터 중복, 중복 데이터 중 일부만 수정되면 데이터의 무결성이 깨질 수 있음, 특정 데이터를 삭제하면서 관련 없는 중요한 정보도 함께 사라질 수 있음, 비효율적인 테이블 설계로 인해 쿼리 실행 속도가 느려지고, 인덱스 활용이 어려워 질 수 있음, 확장성 문제가 있을 수 있음

데이터베이스 성능 및 최적화

  1. 인덱스란 무엇? 왜 사용?
  2. DB Lock이 무엇?
  1. 인덱스는 데이터베이스에서 테이블의 특정 열에 대해 빠르게 데이터를 검색할 수 있도록 만들어진 데이터 구조이다. 인덱스를 사용하면 SELECT, WHERE, JOIN과 같은 쿼리의 실행 속도를 크게 향상시킬 수 있다.
    대표적인 인덱스의 종류로는 B-Tree 인덱스와 Hash 인덱스가 있다. 하지만 인덱스를 너무 많이 생성하면, 데이터 삽입/수정/삭제 시 인덱스를 갱신해야 하므로 쓰기 성능이 저하될 수 있다.

인덱스는 읽기 작업이 빈번하거나 대규모 데이터에서 성능 최적화가 필요한 경우에 주로 사용된다.

 

2. DB Lock은 여러 트랜잭션이 동시에 동일한 데이터에 접근할 때, 데이터의 일관성과 무결성을 유지하기 위해 데이터를 보호하는 메커니즘이다.

데이터베이스 설계와 운영

  1. 데이터의 특성에 따라 RDBMS와 NoSQL 중 어느 것을 선택?
  2. ORM이란 무엇?
  1. RDBMS는 데이터가 정형화되어 있고, 명확한 관계가 있는 경우 적합하다. NoSQL은 데이터 구조가 비정형적이거나, 유연한 스키마가 필요하며, 수평적 확장이 중요한 경우 적합하다. (소셜 미디어 데이터, 실시간 로그 처리와 같은)
  2. ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어의 객체와 관계형 데이터베이스의 테이블을 매핑하여, SQL을 작성하지 않고도 데이터베이스를 조작할 수 있게 하는 기술이다. ORM을 사용하면 생산성과 코드의 가독성이 향상되며, 데이터베이스 독립성을 확보할 수 있다. 하지만 복잡한 쿼리가 필요한 경우 SQL에 비해 성능이 떨어질 수 있으며, 데이터베이스의 동작 방식을 정확히 이해해야 한다.

우선순위 큐

  1. 우선순위 큐와 일반 큐의 차이
  2. 우선순위 큐는 내부적으로 어떤 자료구조를 사용해 구현할 수 있는지
  3. 우선순위 큐를 사용해야 하는 상황을 예로 들어 설명

 

  1. 일반 큐는 데이터를 삽입된 순서대로 처리하는 FIFO 방식의 자료구조입니다. 예를들어, 프린터 작업 큐에서는 요청된 순서대로 출력 작업을 처리합니다. 반면, 우선순위 큐는 데이터에 우선순위를 부여하여 우선순위가 높은 데이터가 먼저 처리되도록 합니다.

우선순위 큐는 데이터의 중요도에 따라 처리 순서를 결정해야 하는 문제에 매우 유용하다. 예를들어, 병원 응급실에서는 환자의 긴급도를 기준으로 치료 순서를 정하고, 네트워크에서는 실시간 패킷이 먼저 전송되도록 처리합니다.

 

  1. 우선순위 큐는 내부적으로 Heap을 가장 많이 사용합니다. 힙은 삽입과 삭제가 모두 O(log n)으로 효율적이기 때문입니다. 그러나 문제의 특성에 따라 정렬된 배열이나 Binary Search Tree(BST) 같은 자료구조를 사용할 수 도 있다. 예를 들어, 삽입 속도가 중요하면 배열이나 리스트를 사용하고, 탐색 속도가 중요하면 힙이나 BST를 선택한다.
  2. 우선순위 큐는 데이터를 단순히 순서대로 처리하는 것이 아니라, 중요도나 우선순위에 따라 처리해야 할 때 사용됩니다. 예를 들어 병원 응급실에서는 긴급한 환자를 먼저 치료하고, 운영체제에서는 중요한 작업을 먼저 처리한다. 이러한 상황에서 우선순위 큐는 효율적이고 적합한 해결책을 제공한다.

해시 테이블

  1. 해시 함수는 무엇이고, 좋은 해시 함수의 조건은 무엇인지
  2. 해시 테이블에서 충돌을 해결하는 방법에 대해 설명
  3. 해시 테이블의 시간 복잡도는 어떤 상황에서 최악?
  4. 키-값 구조를 사용하는 해시 테이블을 직접 구현하는 방법

이진 탐색 트리

  1. 이진 탐색 트리의 삽입, 삭제, 탐색의 시간 복잡도는 어떻게 되나요?
  2. 이진 탐색 트리가 불균형해질 때의 문제점은?
  3. AVL 트리와 Red-Black 트리는 이 문제를 어떻게 해결?

자료구조 선택 논리

  1. 데이터를 빠르게 삽입/삭제해야 할 경우 어떤 자료구조를 사용?
  2. 대량의 데이터에서 중복을 제거하려면 어떤 자료구조를 사용?
  3. 정렬된 데이터를 빠르게 탐색하려면 어떤 자료구조를 선택?
  4. 네트워크 패킷 처리처럼 실시간 데이터 처리에 적합한 자료구조는?

심화 질문

  1. Trie(트라이)의 구조를 설명하고, 활용사례를 말해보세요.
  2. 그래프의 DFS(깊이 우선 탐색)와 BFS(너비 우선 탐색)의 차이를 설명하고, 구현 방법을 설명
  3. LRU 캐싱(LRU Cache)을 자료 구조로 구현하려면 어떻게?
  1. 정렬된 데이터와 정렬되지 않은 데이터가 섞여 있다면, 데이터를 효율적으로 저장하고 검색하는 방법?
  2. 데이터가 너무 커서 메모리에 다 들어가지 않을 경우, 어떻게 처리?
  3. API 요청을 제한하는 스로틀링(Throttling)을 구현하려면 어떤 자료구조를 사용?

 

참고사이트

Array, ArrayList, LinkedList

  1. Array와 ArrayList의 차이?
  2. ArrayList와 LinkedList 중 삽입/삭제와 검색이 더 효율적인 자료구조는 무엇? 이유?
  3. LinkedList에서 특정 인덱스에 접근할 때 시간 복잡도는 어떻게?
  4. 배열을 사용해 ArrayList를 구현하는 방법을 설명

 

  1. Array는 고정된 크기와 간단한 데이터 구조를 제공하며 성능이 중요한 경우 유리하고, Array List는 크기가 동적으로 변경 가능한 데이터 구조이다.
    크기가 고정되어 있어 선언 후 크기를 변경할 수 없다. 데이터를 더 추가하려면 새 배열을 생성하고 복사해야 한다. ArrayList 크기가 자동으로 조정, 데이터가 추가되거나 삭제될 때 내부적으로 크기를 관리하므로 더 유연하다.
  2. 삽입과 삭제가 자주 일어나는 경우는 LinkedList가 더 효율적이고, 특정 요소를 검색하거나 데이터 접근이 빈번한 경우는 ArrayList가 더 효율적이다. 자료구조를 선택할 때는 작업의 유형과 데이터 크기를 고려하는 것이 중요
    LinkedList는 중간 삽입/삭제가 효율적이나, 끝에서 삽입/삭제만 필요한 경우에는 ArrayList도 효율적이다.(O(1))
  3. LinkedList는 특정 인덱스에 접근할 때 순차 탐색이 필요하므로 시간 복잡도가 O(n)이다. 이는 ArrayList의 O(1) 접근 시간에 비해 비효율적이다. 따라서 검색 작업이 빈번한 경우에는 LinkedList보다 ArrayList가 더 적합
  4. ArrayList는 내부적으로 고정 크기 배열을 사용해 데이터를 저장하며, 배열의 크기가 부족하면 요소를 복사해 크기를 동적으로 확장하는 방식으로 구현된다.

Stack과 Queue

 

  1. 스택과 큐는 어디에서 주로 사용?
  2. Deque(Double-Ended Queue)란 무엇? 어디에 사용?
  3. 스택을 단일 배열로 구현할 때 주의해야 할 점?
  4. Queue를 LinkedList로 구현하려면 어떤 메서드가 필요?

 

 

  1. 스택과 큐는 다양한 알고리즘과 문제를 해결되는 데 사용되는 기본 자료구조이며, 스택은 삽입과 삭제가 한 쪽 끝에서만 이루어지는 데이터 구조로 후입 선출(LIFO, Last In First Out) 방식으로 웹 브라우저 뒤로 가기 (가장 나중에 열린 페이지부터 뒤로 가기를 실행), 문서작업에서 Ctrl+Z (가장 나중에 수정한 내역부터 되돌림) 으로 활용가능하며, 큐는 한 쪽에서 삽입이, 다른 한쪽에서는 삭제가 이루어지는데 선입 선출(FIFO, First In First Out) 방식으로 주로 데이터가 입력된 순서대로 처리하는 상황에 사용된다. ( 우선순위 예약, 프로세스 관리 )
  2. Deque는 양방향에서 데이터를 처리할 수 있는 queue형 자료구조로, 양쪽 끝에서 삽입과 삭제가 가능한 유연한 자료구조로, 슬라이딩 윈도우, 캐싱, 이중 방향탐색 등 다양한 상황에 사용된다.
  3. 스택을 단일 배열로 구현할 때 주의해야 할 점은 LIFO (Last In, First Out) 배열은 선언 시 크기가 고정되므로, 스택에 너무 많은 데이터를 삽입하면 오버플로우가 발생, 스택에 데이터가 없는 상태에서 꺼내려고하면 언더플로우가 발생할 수 있다.
  4. Queue를 LinkedList로 구현하려면 요소를 끝에 추가하는 enqueue, 앞에서 제거하는 dequeue, 가장 앞 요소를 조회하는 peek, 비어있는지 확인하는 isEmpty와 같은 메서드가 필요하다.

 

Tree와 Heap

 

  1. 이진 트리(Binary Tree)와 이진 탐색 트리(BST, Binary Search Tree)의 차이?
  2. Heap과 Priority Queue의 차이
  3. 트리의 균형을 유지해야 하는 이유

 

 

  1. 이진 트리는 각 노드가 최대 두 개의 자식을 가질 수 있는 트리 구조로, 값의 크기와 관련된 규칙은 없다. 반면, 이진 탐색 트리(BST)는 이진 트리의 일종으로, 왼쪽 자식 노드의 값은 부모보다 작고, 오른쪽 자식 노드의 값은 부모보다 큰 규칙을 따른다. 이 차이로 인해 이진 탐색 트리는 데이터 탐색, 삽입, 삭제가 더 효율적이며, 정렬된 데이터를 관리하는 데 적합하다.
  2. Heap은 완전 이진 트리 형태로 구성된 자료구조로, 각 노드의 값이 특정 규칙(최대값 또는 최소값 우선)에 따라 정렬된다. 반면, Priority Queue는 내부적으로 Heap을 사용해 구현되는 경우가 많지만, Heap 외에도 배열이나 링크드 리스트로도 구현할 수 있다. 즉, Heap은 자료를 저장하는 구조 자체를 의미하고, Priority Queue는 우선순위에 따라 자료를 처리하는 개념을 포함한 자료구조이다.
  3. 트리의 균형을 유지하지 않으면 트리가 한쪽으로 치우친 형태가 되어, 최악의 경우 선형 구조처럼 작동하게 된다. 이로 인해 탐색, 삽입, 삭제와 같은 주요 연산의 시간 복잡도가 O(log n)에서 O(n)으로 증가해 효율성이 떨어진다. 균형 잡힌 트리는 높이를 최소화하여 이러한 연산을 평균적으로 빠르게 수행할 수 있도록 보장하므로, 균형 유지가 중요하다.

 

트리 순회

 

  1. 트리의 전위, 중위, 후위 순회를 차례대로 설명, 순서의 차이가 왜 중요한지
  2. 트리의 레벨 순회(Level Order Traversal)는 어떤 방식으로 구현?
  3. 재귀를 사용하지 않고 트리 순회를 구현하려면 어떻게?

 

  1. 트리의 순회 방식은 데이터를 탐색하거나 처리하는 순서를 결정하는 방법이다. 전위, 중위, 후위 순회는 각기 다른 순서를 따르며, 목적에 따라 적합한 순회 방식을 선택한다. 예를들어, 전위는 트리 구조를 복사하거나 루트 중심 처리가 필요할 때, 중위는 이진 탐색 트리에서 정렬된 데이터를 얻고자 할 때, 후위는 자식을 모두 처리한 후 루트를 방문해야할 때 사용된다.
  2. 레벨 순회는 트리의 노드들을 루트 노드부터 시작해, 각 레벨별로 왼쪽에서 오르쪽 순서로 하는 탐색 방식이다. 즉, 트리의 계층 구조를 따라서 노드를 하나씩 처리한다. 레벨 순회는 큐 자료구조를 사용해 구현한다. 큐는 FIFO(First In, First Out) 특성을 가지며, 노드를 방문한 순서대로 다음 레벨의 노드를 처리할 수 있게 한다.

레벨 순회는 트리의 각 레벨을 차례로 처리해야 하기 때문에 선입선출(FIFO) 방식인 큐가 적합하다. 큐는 먼저 들어온 노드를 먼저 처리하므로, 트리의 레벨별 순서를 자연스럽게 유지할 수 있다.

 

3. 트리 순회를 재귀 없이 구현하려면 스택이나 큐를 사용해 함수 호출을 수동으로 관리해야 한다. 전위, 중위, 후위 순회는 스택으로, 레벨 순회는 큐를 이용해 간단히 구현할 수 있다. 이는 재귀 호출 없이 순회를 효율적으로 수행할 수 있는 방법이다.

+ Recent posts