[크래프톤] 너만 그런 것은 아니다.

민구입니다·2026년 9월 10일

is_krafton_jungle

목록 보기
4/7
post-thumbnail

정글에서의 시간은 늘 부족하고 학습량은 많다. 단, 너만 그런 것은 아니다.

정글에 들어와 3주가 지났다.
이번 주는 정말 시간이 느리게 흐르는 느낌이었다.

하루 종일 해도 모르는게 있고, 공부할게 많았다.
"나만 공부할게 많나?" 라고 생각했지만,
모두가 공부할게 많은 한 주라고 생각했다.

Algorithm_Learning

이번 주는 알고리즘에 대한 생각을 바꾸는 한 주가 되었다.

문제의 종류는 베이직과 같이 8종류를 풀었고,
더하여 LeetCode, 프로그래머스 라는 사이트에서 추가로 풀었다.

basic

  • 트리
  • 이진 검색 트리
  • 그래프(vertex, edge, node, arc)
  • BFS
  • DFS
  • 위상정렬
  • 동적 계획법(Dynamic Programming, DP)
  • 탐욕 알고리즘(Greedy Algorithm)

alpa

  • DFS BFS 총 14문제
  • 이진탐색 5문제
  • 투포인터 4문제
  • 기타 3문제

CS_Learning

CS 지식을 간단하게 설명하고 싶다.

정글에 들어오면 공부해야 할 키워드를 알려준다.
난 이 키워드들을 전부 설명하고 싶어 직접 타이핑하며 설명해보았다.

아래는 내가 정리한 키워드 들이다.
넘어가도 괜찮지만 한번 읽어 준다면 행복할 예정입니다.

  • 32 Bit / 64 Bit 차이
    - 32비트에서 64비트로 넘어오면서 달라진 핵심은 포인터(주소) 크기가 4바이트→8바이트로 커진 것이다.
    - 32비트 시절엔 주소가 4바이트라 최대 4GB 주소 공간이었고, 64비트에선 8바이트가 되면서 훨씬 넓은 주소 공간을 쓸 수 있게 됐다.
    - 4바이트가 "비는" 게 아니라 주소 표현 자체가 커진 거다.
    - 참고로 int 크기는 언어/플랫폼마다 다르고, C에서도 64비트 시스템에서 int가 여전히 4바이트인 경우가 많다.

  • 실수 표현법 (부동 소수점, 고정 소수점)
    - 소수를 이진수로 표현하면 무한히 반복되는 수가 존재한다.
    - 그래서 0.1 + 0.2 != 0.3이 되는 것이다. IEEE 754 double(64비트) 기준 유효숫자 약 15~17자리를 보장한다.
    - "소수점 뒤 15자리"가 아니라 앞에서부터 유효숫자 15자리다. float(32비트)는 약 7자리.
    - 5자리가 넘어가면? 10의 N승을 곱해서 정수로 바꾸고 계산한 뒤 다시 나누는 방법이 있다.
    - 실제로 금융권에서 센트 단위 정수 연산(금액 × 100)하는 패턴이 이거다. 더 정확한 해법은 decimal(십진 기반 표현)이다.
    - Java에선 BigDecimal, Python에선 decimal.Decimal. 이진 부동소수점 대신 십진 기반으로 표현해서 0.1 + 0.2 == 0.3이 성립하게 만든다.
    - Python에서 Decimal('0.1')처럼 문자열로 넣어야 정확하다
    - 숫자로 넣으면 이미 이진 부동소수점 오차가 들어간 상태니까.

  • Stack과 Heap, 메모리 구조
    - 스택은 휘발성 메모리, 힙은 공유 메모리다.
    - 스택은 함수가 호출되면 프레임이 생기고, 리턴하면 사라진다(LIFO).
    - 그 안의 지역변수들은 해당 함수 내에서만 쓰이고 함수 끝나면 날아간다.
    - 힙은 여러 곳에서 접근 가능한 영역이다.
    - CPU 내부를 보면 코어 안에 레지스터, L1/L2 캐시가 있고 코어 밖에 L3 캐시가 있다.
    - CPU에 스케줄링되는 단위는 프로세스가 아니라 스레드다.
    - 레지스터에 올라가는 건 스레드의 실행 컨텍스트(PC, SP, 범용 레지스터 값)이고, 컨텍스트 스위칭 때 이 값들을 저장/복원한다.
    - 프로세스는 가상 주소 공간을 갖는다.
    - 위에서부터 커널 영역, 스택(위→아래로 자람), 빈 공간, 힙(아래→위로 자람), 데이터, 텍스트 순이다.
    - 스택과 힙은 같은 가상 주소 공간 안에 있지만 별도 영역이다.
    - 스택이 힙을 "공유"하는 게 아니라, 스택에 있는 변수가 힙 객체의 주소를 참조하는 것이다.
    - 자료 타입으로 보면 기본 타입(int, float 등)은 값 자체가 스택에 저장되고,
    - 레퍼런스 타입(List, Set 등)은 힙에 객체가 만들어지고 스택엔 그 주소(참조)만 들어간다.
    - String도 레퍼런스 타입이라 힙에 할당된다.

  • 컨텍스트 스위칭
    - 컨텍스트란?
    - 프로세스가 현재 어떤 상태에서 수행되고 있는지에 대한 정보를 담고있다.
    - 프로그램 카운터, 레지스터 값, 스택 포인터 등을 가지고 있고
    - 컨텍스트 스위칭이란 CPU 코어에 있는 레지스터에 올라간 프로세스의 문맥 정보를 저장했다가 바꾸는 것이다.
    - 이것을 알기위해서 내부 구조 먼저 알아야 한다.
    - CPU 에는 코어가 각각 존재하고 코어 내부엔 레지스터 TLB L1 L2 캐시 이렇게 존재한다. (L3) 캐시는 공용 캐시공간이다
    - RAM에는 커널이랑 각각의 프로세스가 올라간다
    - 디스크엔 프로그램이 존재한다.
    - 컴퓨터를 키면 RAM에 커널이 올라가고 컴퓨터가 꺼질 때까지 적재되어 있다.
    - 커널이란 OS 운영체제가 SW랑 하드웨어를 관리해주는 내부 시스템이다.
    - 프로그램을 켜면 디스크의 프로그램이 램의 프로세스로 올라가 실행 대기 상태가 된다.
    - 실행 대기상태에서 타이머 인터럽트(~10ms마다 하드웨어가 강제로) 또는 시스템 콜(프로세스가 I/O 요청 등으로 자발적으로)이 발생하면
    - 커널모드로 전환되고, 커널이 현재 프로세스의 레지스터 정보를 PCB에 저장한다.
    - 커널은 프로세스 각각의 정보인 PCB를 가지고 있고 그 PCB가 램의 프로세스를 가르킨다.
    - 그다음 스케줄러가 "다음 누구?"를 결정하고, 다음 프로세스의 PCB에서 레지스터 값을 꺼내 CPU에 올린다.
    - CPU 레지스터로 올라가면 실행중인 프로세스가 되고
    - 프로세스는 가상주소 공간을 가지고 있기 때문에, 실제 물리주소랑 연동하는 페이지까지 교체를 해줘야 한다.
    - 프로세스가 바뀌면 가상주소가 같아도 가르키는 물리주소가 달라지기 때문에 TLB라는 주소변환 하드웨어가 비워졌다가 다시 채워져야 한다
    - 사실상 이게 가장 큰 변환 비용이다.
    - 이렇게 프로세스가 올라가고 페이지까지 교체되면 다시 유저모드로 바꾸고 프로세스를 실행중인 상태로 실행하는 것이다.

  • 가상 메모리
    - 가상메모리란 프로세스가 개별적으로 가지는 자신만의 주소 공간이다.
    - 실제 물리메모리(RAM)나 디스크와 별개로, 그곳을 가리키는 가상 주소 공간이 프로세스마다 존재한다.
    - 가상 주소 공간은 위에서부터 OS 커널 > 스택 > (빈 공간) > 힙 > 데이터 > 코드 > 널 영역 순으로 낮아지는 구조다.
    - 스택은 아래로, 힙은 위로 자라면서 가운데 빈 공간을 채워나간다.
    - 가상 메모리와 물리 메모리를 4KB 단위로 나눠서 관리하는데, 이 단위를 페이지(가상)와 프레임(물리)이라 한다.
    - 64비트 기준 가상 주소 공간은 CPU 아키텍처가 지원하는 주소 비트 수에 의해 결정되며, 현재는 보통 48비트(256TB)다.
    - 프로그램이 RAM으로 올라가며 프로세스가 될 때 OS가 가상 주소 공간을 만들어준다.
    - 이때 처음부터 다 올리지 않고 필요할 때 페이지를 할당하는 것이 디맨드 페이징이다.
    - 가상 주소의 페이지는 페이지 테이블을 통해 실제 물리 주소(RAM 프레임)를 가리키는데,
    - RAM에 올라와 있을 수도, 디스크에 있을 수도, 아직 아무것도 안 가리킬 수도 있다.
    - 접근한 페이지가 RAM에 없으면 페이지 폴트가 발생한다.
    - 그러면 OS가 디스크에서 해당 페이지를 RAM으로 올리고, RAM이 꽉 차 있으면
    - 페이지 교체 알고리즘(LRU 등)으로 희생 페이지를 디스크로 내보내고 그 자리에 올린 뒤, 페이지 테이블의 매핑을 갱신한다.
    - 가상 주소 공간이 중요한 이유는 프로세스마다 격리된 주소 공간을 가지기 때문이다.
    - 프로세스끼리 메모리가 겹치지 않고, 각 프로세스가 동일한 주소 체계(0x0부터)를 쓸 수 있어서 개발자가 물리 주소를 직접 관리할 필요가 없다.

주절 주절

알고리즘에 대한 생각을 바꾼 한 주다.

난 알고리즘을 보면 왜 안풀리지? 왜 안되지? 라고 생각하고 계속 고민하고 생각해서 풀어보려고 했다.
하지만 힌트를 보거나 정답을 알게 되면 "왜 이걸 몰랐지?" 라는 생각이 가득했다.

어떤 해외 유튜버의 영상을 참고했는데 이 영상을 보고 마음을 바꾸게 되었다.

영상입니다

요약하자면.
어릴 때부터 해온 수학으로 돈 계산 하는 것은 쉽지만,
며칠 동안 알고리즘을 공부하고 일주일 뒤에 푼다면 대부분 까먹을 것이다.

즉. 꾸준히 해야 한다는 말이다.
쉬운 문제부터 풀면서 이 알고리즘이 왜 필요한지,
어디서 어떻게 사용되는지 원리 자체를 알아야 한다.

문제를 마주하면 어떻게 풀어야 하는지 생각을 해야 하는데 경험이 없다면 생각할 수 없기 때문이다.

그래서 난 꾸준한 알고리즘 공부를 하기로 정했다.
매일 한두 문제여도 다양하게 꾸준히 풀다 보면 나도 잘하지 않을까? 라고 생각한다.

CS 에 대한 공부도 좀 아쉬운 한 주 였다.
이론에 대해 깊게 파고 정리하는 것도 좋았지만,
실제 어떻게 사용되는지 잘 모르고 공부했던 것 같다.

다음 주 부턴 좀 더 꾸준히 깊게 공부하는 것을 목표로 하겠다.


다들 좋은 하루 되세요~

profile
#경험한_개발자_희망 #AI_함께하기

2개의 댓글

comment-user-thumbnail
2026년 9월 10일

저만 그런거면 어떡하죠ㅠ

1개의 답글