Study/TIL(Today I Learned)

24.07.02 면접

에린_1 2024. 7. 2. 23:25
728x90

면접

하염없이 소리지르고 싶다.

진짜 하염없이 모자르다.

우째 이렇게 망칠 수 있지ㅣㅣㅣㅣㅣㅣㅣㅣㅣㅣㅣㅣㅣㅣㅣㅣ

크아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ아아아아앙유유ㅠㅠㅠㅠㅜㅠㅜㅠㅜㅠㅜㅠㅠㅠㅠ

긴장은 긴장이고 아는거나 모르는거나 왜케 다 못했니 증말로 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 어ㅏ어ㅏ어나머완뫙너망ㄴ머ㅏㅇㄴㅁ렁ㄴ미그냥 왜케 못했어 그ㅑㄴㅇ 어캐 그렇게 못해썽넘안머ㅏㅇ너마언마어나

우떠케 온 기회인데ㅔㅔㅔㅔㅔ

ㅠㅜㅠㅜㅜㅠㅜㅠㅜㅠㅜㅠ

딱 오늘까지만 슬퍼하고, 다시 정리하고 해야겠다.

그래도 그럼에도 진짜 개개개개개개개개 못한 면접이였지만 부족한 점을 발견할 수 있었고, 더 발전할 ㅅ ㅜ있느이나이나ㅣ가ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 그치.. 발전할 수 있다. ㅠㅜㅠㅜㅠㅠㅠㅠㅜㅜ퓨ㅜ 그렇지만 ㅠㅜㅜㅜㅡㅡ 더 잘할 수 있었는데ㅠㅔㅠㅜ 아니..정말 열심히한 프로젝트들인데 제대로 말 못하고 해서 아쉽다.. 크흑 우리 자식같은 프로젝트들 울지말고 있워.. 더 연습해서 잘 소개해줄게

아 너무 너무 아쉽네 정말..

더 발전합시다. 할수 있으요.. 잘 적고 피드ㅡ백 잘합시다.

실수한 것은 다시 안하도록 노력합시당.

서버 버퍼 관리

  • 버퍼 관리는 서버의 성능, 안정성, 효율성을 높이는 중요한 요소이다.
  • 효과적인 버퍼 관리는 데이터 처리 속도를 높이고 시스템의 응답성을 개선할 수 있다.

1. 네트워크 버퍼

  • 송신 버퍼(Send Buffer)
    • 데이터를 네트워크를 통해 전송하기 전에 임시로 저장하는 버퍼이다. 네트워크가 준비되면 데이터를 전송한다.
  • 수신 버퍼(Receive Buffer)
    • 네트워크를 통해 수신된 데이터를 일시적으로 저장하는 버퍼이다. 애플리케이션이 데이터를 처리할 준비가 될 때까지 데이터를 보관한다.

2. 파일 I/O 버퍼

  • 디스크 버퍼(Disk Buffer)
    • 디스크에서 데이터를 읽거나 쓸 때 사용되는 버퍼이다. 디스크 입출력 속도를 최적화하고 디스크에 대한 접근을 최소화한다.
  • 페이지 캐시(Page Cache)
    • 운영체제가 파일 시스템의 데이터를 메모리에 캐시하여 디스크 I/O를 줄이는 데 사용하는 버퍼이다.

3. 메모리 버퍼

  • 메시지 버퍼(Message Buffer)
    • 서버 간 통신이나 프로세스 간 통신에서 메시지를 일시적으로 저장하는 버퍼이다.
  • 로그 버퍼(Log Buffer)
    • 서버의 로그 데이터를 일시적을 저장하여 디스크에 기록하기 전에 일괄 처리할 수 있도록 하는 버퍼이다.

4. 데이터베이스 버퍼

  • 버퍼 캐시(Buffer Cache)
    • 데이터베이스가 자주 접근하는 데이터를 메모리에 캐시하여 데이터베이스의 입출력 성능을 향상시키는 버퍼이다.
  • 리두 로그 버퍼(Redo Log Buffer)
    • 트랜잭션 로그를 임시로 저장하는 버퍼로, 데이터베이스의 트랜잭션 무결성을 유지한다.

5. 애플리케이션 레벨 버퍼

  • 큐 버퍼(Queue Buffer)
    • 비동기 작업을 처리하기 위해 사용되는 버퍼이다. 작업을 대기열에 넣고 순차적으로 처리한다.
  • 캐시 버퍼(Cache Buffer)
    • 애플리케이션의 성능을 높이기 위해자주 사용하는 데이터를 메모리에 캐시하는 버퍼이다.

유니티 C#, C#

공통점

  • 둘 다 C# 언어를 사용한다.
  • 기본적인 문법, 데이터 타입, 제어 구조 등은 동일하다.

차이점

  1. 개발 환경
    • Unity C#
      • 엔진 :Unity 게임 엔진에서 동작하는 스크립트를 작성한다.
      • IDE : Unity는 기본적으로 Visual Studio나 Rider와 같은 IDE를 사용하지만, Unity Editor 내에서 스크립트를 관리한다.
      • 컴포넌트 기반 아키텍처 : Unity는 게임 오브젝트와 컴포넌트 기반 아키텍처를 사용한다. 스크립트는 MonoBehaviour 클래스를 상속받아 작성하며, 게임 오브젝트에 컴포넌트로 부착된다.
    • 일반 C#
      • 플랫폼 : .NET 또는 .NET Core 런타임을 사용하여 콘솔 애플리케이션, 데스크톱 애플리케이션, 웹 애플리케이션 등 다양한 타입의 애플리케이션을 개발한다.
      • IDE : Visual Studio, Rider, Visual Studio Code 등을 사용한다.
      • 프로그래밍 패러다임 : 일반적으로 객체 지향 프로그래밍(OOP)을 따르며, 다양한 디자인 패턴을 사용한다.
  2. API 및 라이브러리
    • Unity C#
      • Unity API : UnityEngine, UnityEditor 등의 네임스페이스를 통해 제공되는 다양한 기능을 사용한다. 물리 엔진, 렌더링, 오디오, 입력 처리 등을 Unity API로 관리한다.
      • 게임 개발에 특화된 라이브러리 : Unity는 게임 개발에 필요한 많은 기능을 내장하고 있으며, 이를 통해 물리 시뮬레이션, 애니메이션, 네트워킹 등을 손쉽게 구현할 수 있다.
    • 일반 C#
      • .NET 표준 라이브러리 : System, System.Collections.Generic, System.Linq, System.Threading.Tasks 등 다양한 라이브러리를 사용하여 일반적인 애플리케이션 기능을 구현한다.
      • 플랫폼 특화 라이브러리 : WPF, WinForms, ASP.NET, Entity Framework 등 다양한 플랫폼과 기술 스택을 지원하는 라이브러리를 사용할 수 있다.
  3. 실행 및 배포
    • Unity C#
      • 플랫폼 독립성 : Unity는 한 번 작성한 코드를 여러 플랫폼(Windows, macOS, iOS, Android, WebGL, 콘솔 등)에서 실행할 수 있도록 지원한다.
      • 빌드 시스템 : Unity Editor에서 제공하는 빌드 시스템을 통해 다양한 플랫폼용으로 쉽게 빌드할 수 있다.
    • 일반 C#
      • 플랫폼 종속성 : 작성된 애플리케이션은 주로 Windows, Linux, macOS 등의 특정 플랫폼에서 실행된다. .NET Core/.NET 5 이상을 사용하면 크로스 플랫폼 개발이 가능하지만, Unity만큼 다양한 플랫폼을 한 번에 지원하지는 않는다.
      • 배포 방식 : 배포는 주로 콘솔 애플리케이션, 데스크톱 애플리케이션, 웹 애플리케이션 등 각 애플리케이션 타입에 맞는 방식으로 이루어진다.
  4. 프레임워크와 패턴
    • Unity C#
      • MonoBehavior : Unity 스크립트는 대부분 MonoBehaviour 클래스를 상속받아 작성된다. Start(), Update(), FixedUpdate() 등 Unity의 이벤트 메서드를 오버라이드하여 동작한다.
      • 씬과 게임 오브젝트 : 개발은 씬(Scene) 단위로 이루어지며, 게임 오브젝트와 그에 부착된 컴포넌트를 중심으로 동작한다.
    • 일반 C#
      • 일반적인 클래스와 메서드 : 클래스와 메서드를 직접 정의하여 사용한다. 이벤트 기반 프로그래밍을 사용할 수 있지만, Unity의 이벤트 시스템과는 다르다.
      • 디자인 패턴 : 다양한 소프트웨어 디자인 패턴을 적용할 수 있다.

힙(Heap), 스택(Stack)

  • 힙과 스택은 컴퓨터 메모리에서 데이터가 저장되고 관리되는 두 가지 주요 방식이다.

스택(Stack)

  • LiFO 구조를 따르는 메모리 영역이다.
  • 함수 호출, 지역 변수, 임시 데이터 저장에 주로 사용된다.
  • 스택은 메모리의 고정된 크기 블록으로 관리되며, 함수 호출 시 할당되고 함수 종료 시 해제된다.
  • 특징
    1. 자동 관리 : 함수가 호출될 대 스택 프레임이 자동으로 할당되고, 함수가 반환될 때 자동으로 해제된다.
    2. 고속 접근 : 스택 메모리는 연속된 메모리 블록으로, 접근 속도가 매우 빠르다.
    3. 고정 크기 : 스택은 일반적으로 고정된 크기를 가지며, 메모리 제한이 있다
    4. 지역 변수 저장 : 함수 내에서 선언된 지역 변수와 매개변수는 스택에 저장된다.
  • 크기 특성
    1. 고정 크기 : 대부분의 시스템에서 스택은 고정된 크기를 가진다. 이 크기는 프로그램 시작 시 정해지며, 운영체제나 런타임 환경에 따라 다를 수 있다.
    2. 크기 제한 : 스택의 크기는 일반적으로 메가바이트(MB) 단위로 제한된다. 예를 들어, 많은 시스템에서 기본 스택 크기는 1MB에서 8MB 사이일 수 있다. 이는 프로그램이 실행되는 동안 할당될 수 있는 스택 메모리의 최대 크기를 의미한다.(Windows의 기본 스택 크기는 1MB이)
  • 스택 오버 플로우
    • 스택 오버 플로우(Stack Overflow)는 스택 메모리의 할당 가능한 크기를 초과할 때 발생한다. 이는 주로 무한 재귀 호출이나 지나치게 큰 지역 변수 할당으로 인해 발생한다.

힙(Heap)

  • 동적으로 할당되는 메모리 영역이다.
  • 런타임 시에 메모리를 할당하고, 개발자가 필요할 때 해제할 수 있다.
  • 힙은 주로 객체, 데이터 구조, 배열과 같은 크기가 가변적인 데이터를 저장하는 데 사용된다.
  • 특징
    1. 동적 관리 : 메모리는 런타임 시에 동적으로 할당되고, 명시적으로 해제해야 한다.
    2. 크기 제한 없음 : 힙은 스택보다 큰 메모리 공간을 가질 수 있으며, 크기가 가변적이다.
    3. 속도 저하 : 동적 할당과 해제 작업으로 인해 스택보다 접근 속도가 느리다.
    4. 전역 접근 : 힙에 저장된 데이터는 프로그램 내에서 전역적으로 접근할 수 있다.
  • 크기 특성
    1. 가변 크기 : 힙의 크기는 동적으로 증가하거나 감소할 수 있다. 프로그램이 실행되는 동안 메모리가 필요할 때마다 할당되고, 메모리가 더 이상 필요하지 않으면 해제될 수 있다.
    2. 큰 메모리 공간 : 힙은 일반적으로 스택보다 훨씬 큰 메모리 공간을 가질 수 있다. 힙의 크기는 시스템의 가용 메모리와 운영체제의 메모리 관리 정책에 의해 제한된다.(64비트 시스템에서는 128GB 이상의 힙 메모리를 사용할 수 있다.)

C# 자료구조 배열과 리스트

배열(Array)

  • 동일한 타입의 고정된 크기 요소들을 연속적으로 저장하는 자료구조이다.
  • 배열은 인덱스를 사용하여 요소에 접근할 수 있다.
  • 특징
    1. 고정 크기 : 배열 크기는 생성 시 고정되며, 이후에는 변경할 수 없다.
    2. 연속된 메모리 할당 : 배열은 메모리상에 연속된 공간에 할당된다.
    3. 빠른 접근 속도 : 인덱스를 사용하여 배열 요소에 빠르게 접근할 수 있다.
    4. 간단한 구조 : 배열은 구조가 간단하여 메모리 오버헤드가 적다.

리스트(List)

  • 리스트는 크기가 동적으로 변경될 수 있는 배열과 유사한 자료구조이다.
  • 리스트는 ‘System.Collections.Generic’ 네임스페이스의 ‘List<T>’ 클래스로 제공된다.
  • 특징
    1. 동적 크기 : 리스트는 요소를 추가하거나 제거할 때 크기가 자동으로 조정된다.
    2. 다양한 메서드 제공 : 요소 추가(Add), 제거(Remove), 검색(Contains), 정렬(Sort) 등 다양한 기능을 제공한다.
    3. 성능 오버헤드 : 크기 변경과 메모리 관리로 인해 배열보다 약간의 성능 오버헤드가 있다.
    4. 유연성 : 크기 조정이 가능하므로 배열보다 유연하게 사용할 수 있다.

TCP 연결과정

  1. 클라이언트 소켓 생성
  2. 클라이언트와 서버 소켓 연결
  3. 데이터 송수신
  4. 소켓 연결 종료

소켓 생성

  1. 클라이언트가 특정 서버와 통신을 하기 위해서 운영체제에 socket() 시스템콜을 통해 소켓을 생성한다.
  2. 운영체제 내부 프로토콜 스택은 소켓의 정보를 저장하기 위해 메모리 영역을 할당하고 그곳에 소켓 제어 정보를 저장한다.
  3. 운영체제는 생성된 소켓의 정보를 파일 디스크립터를 사용자 프로그램에게 반환해준다.

소켓 연결 설정

  • connect() 시스템콜을 호출하여 서버와 커넥션을 맺어야 한다. 운영체제는 데이터 송수신을 하기 위해서 사용자 프로그램에 도달하기 전에 일시적으로 데이터를 저장하기 위해서 버퍼 메모리 영역을 할당을 하고 데이터 송수신을 할 준비를 마치게 된다.
  • 이 연결을 맺는 단계를 Three way handshake라고 한다.
  • Three way handshake
    1. 클라이언트는 서버에게 연결 요청의 SYN이라는 비트를 1을 만들어 TCP 헤더 정보를 설정하고 패킷을 생성하여 보낸다.
    2. 서버는 받은 패킷을 기반으로 수신처 포트 번호에 해당하는 소켓을 찾고 거기에 해당 클라이언트에 대한 정보를 저장한다.
    3. 서버는 마찬가지로 SYN 비트를 만들고 정상적으로 처리했다는 걸 알리기 위해 ACK 비트를 1로 해서 클라이언트에게 패킷을 보낸다.
    4. 클라이언트는 받은 패킷 정보를 기반으로 서버 측의 접속 동작이 성공했는지 확인한다.
    5. 클라이언트는 서버가 정상적으로 처리됐다는 것을 인지하고 자신도 패킷을 제대로 받았다는 것을 알리기 위해 ACK 비트를 1로 만들어 패킷을 만들어 서버에게 전송을 한다.
    6. 소켓은 데이터를 송수신할 수 있는 상태가 된다.

데이터 송수신

  • 데이터 송수신은 write(), read() 시스템 콜로 실행할 수 있다.
  • 프로토콜 스택은 받은 데이터에 내용을 바로 송신하는 것이 아니라 일단 자체 송신용 버퍼 메모리 영역에 저장하고, 애플리케이션 다음 데이터를 건네주기를 기다린다. 각 애플리케이션마다 송신 의뢰하는 데이터양 등이 적으면 너무 빈번하게 송신이 일어나면 네트워크의 이용 효율이 좋지 않기 때문에 한 번에 모아서 전송할 수도 있다.

MySQL 프로시저

저장 프로시저(Stored Procedure)

  • 일련의 SQL 문장을 선언해서 MySQL에 저장하고, 해당 SQL문을 함수처럼 사용하는 것으로 만들어 두기만 하면 함수처럼 호출하여 편하게 사용할 수 있다.

장점

  1. 하나의 프로시저로 여러 SQL문의 실행이 가능하다.(모듈화)
  2. 호스팅언어와 SQL문이 분리되어 보수가 용이하다.
  3. 네트워크 소요 시간을 줄일 수 있다.(구문 분석 및 코드 변환을 미리 진행하여 처리 시간이 단축된다.)

단점

  1. 재사용성이 낮다.(DB 버전 별 구문 규칙과 호환성이 다르다.)
  2. 처리 성능이 좋지않다.(MySQL 스토어드의 프로그램 처리 성능이 낮다.).

SQL에서 인덱스의 의미

  • SQL에서 인덱스(Index)는 데이터베이스 테이블의 열에 대한 검색 성능을 향상시키기 위해 사용되는 데이터 구조이다.
  • 인덱스는 테이블의 특정 열 또는 열들의 조합에 대해 생성되며, 해당 열의 값을 기반으로 데이터를 빠르게 조회할 수 있게 해준다.

인덱스의 기능과 목적

  1. 빠른 검색
    • 인덱스는 데이터 검색 속도를 크게 향상시킨다. 인덱스가 없는 경우 데이터베이스는 테이블의 모든 행을 순차적으로 검색(풀 테이블 스캔)해야 한다. 그러나 인덱스가 있는 경우 특정 값을 빠르게 찾을 수 있다.
  2. 성능 향상
    • 인덱스를 사용하면 검색, 정렬, 조인 등의 쿼리 성능이 향상된다.
    • 인덱스는 데이터베이스가 적절한 행을 신속하게 찾고 액세스할 수 있도록 도와준다.
  3. 고유성 보장
    • 고유 인덱스(Unique Index)를 사용하면 특정 열이 고유한 값을 가지도록 보장할 수 있다.
    • 중복된 값이 입력되는 것을 방지할 수 있다.

인덱스의 종류

  1. 단일 열 인덱스 : 하나의 열에 대해 생성되는 인덱스이다.
  2. 다중 열 인덱스 : 두 개 이상의 열을 조합하여 생성되는 인덱스이다.
  3. 고유 인덱스 : 인덱스가 적용된 열의 값이 고유해야 하는 인덱스이다.
  4. 클러스터드 인덱스 : 테이블의 데이터 행 자체가 인덱스의 순서에 따라 정렬되는 인덱스이다. 일반적으로 테이블당 하나만 생성할 수 있다.
  5. 비클러스터드 인덱스 : 클러스터드 인덱스와는 달리, 인덱스와 데이터가 분리되어 저장되는 인덱스이다. 하나의 테이블에 여러개의 비클러스터드 인덱스를 생성할 수 있다.

인덱스의 작동 방식

  • B-트리 인덱스
    • 가장 일반적인 인덱스 유형이다.
    • B-트리 구조는 균형 잡힌 트리 구조로, 검색, 삽입, 삭제 작업이 모두 효율적으로 수행된다.
  • 해시 인덱스
    • 해시 함수를 사용하여 인덱스를 생성한다.
    • 특정 값을 신속하게 찾는 데 유리하지만, 범위 검색에는 적합하지 않다.
  • 비트맵 인덱스
    • 비트맵을 사용하여 인덱스를 생성한다.
    • 값의 종류가 적고, 값이 반복되는경우에 유용하다.

인덱스 사용의 장단점

  • 장점
    • 빠른 데이터 검색 : 인덱스는 검색 성능을 크게 향상시켜 쿼리 실행 속도를 줄인다.
    • 고유성 보장 : 고유 인덱스를 통해 데이터의 무결성을 유지할 수 있다.
    • 정렬 및 그룹화 성능 향상 : 인덱스를 사용하면 정렬과 그룹화 성능이 향상된다.
  • 단점
    • 디스크 공간 사용 : 인덱스는 추가적인 디스크 공간을 차지한다.
    • 쓰기 성능 저하 : 데이터 삽입, 업데이트, 삭제 시 인덱스도 업데이트해야 하므로 쓰기 작업의 성능이 저하될 수 있다.
    • 복잡성 증가 : 많은 인덱스를 사용하면 데이터베이스 관리가 복잡해질 수 있다.
728x90

'Study > TIL(Today I Learned)' 카테고리의 다른 글

24.07.04 합격,CS  (0) 2024.07.04
24.07.03 그래픽스, CS  (0) 2024.07.03
24.07.01 CS, 그래픽스  (0) 2024.07.01
24.06.28 CS  (0) 2024.06.28
24.06.27 CS  (0) 2024.06.27