[TIL/크래프톤 정글] DAY 8

배재준·2025년 3월 17일

크래프톤 정글 - TIL

목록 보기
4/93
post-thumbnail

2025.03.17

TIL(TODAY I LEARN)


WEEK01 :
배열, 문자열, 반복문과 재귀 함수, 복잡도(BigO,시간,공간), 정렬, 완전 탐색, 정수론

자료구조와 함계 배우는 알고리즘 입문 책을 읽었다.
문제에 직접 적용해보고 어려웠던 문제들을 적어보자.
시작하기에 앞 서 오전에 깃허브 사용법을 간단하게 배웠다.

📖 알고리즘 테스트를 위한 깃허브 사용법

git clone (remote repository(깃허브 레포지토리 주소)) : 깃헙에서 레포 클론 해오기
git branch : 브랜치 목록 확인
git checkout -b (주차)/(깃헙 아이디) : -b 브랜치 생성 및 이동 / 각 주차별로 잘생성하자

code . : vscode 열기

git branch : 다시 브랜치 잘 생성되었는지 확인
  • main 브랜치에 올리지 말고 꼭 브랜치**를 새로 파라
git add . :  stage로 올린다 ( . = 현재 폴더)
git commit -m '(커밋 메시지)' : local로 커밋메시지와 함께 올린다


git push -u origin (브랜치 명) : 깃허브에 Exercise/BaeJaejun 브랜치를 올려라
orgin : remote repository를 의미 / 클론해왔기 때문에 자동으로 연결되어 있음
  • 깃허브에서
    pull requests > new Pull request > compare에서 자신이 올린 브랜치로 변경
    pr 요청 후
    title : (이름 - 주차)
    우측 리뷰어 추가
    그리고 pr 생성

  • 내가 리뷰해야하는 코드를 확인 후 코멘트 남기기 Add a comment

  • 코멘트 확인후 본인이 직접 merge pull request 해서 직접 merge 하기 - 본인 브랜치 본인이 merge하기
    merge 후 본인이 만든 브랜치를 삭제


📖 컴퓨터 시스템

5일차에 못한 정리를 해보자

1.1 정보는 비트와 컨텍스트로 이루어진다.

컴퓨터는 모든 정보를 0과 1(비트)로 표현
같은 비트라도 해석하는 맥락(context)에 따라 의미가 달라짐


1.2 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다.

우리가 직접 사용 하는 고급 언어를 기계(컴퓨터)가 이해할 수 있는 언어로 바꿔 주어야 한다.

소스파일 -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 기계어

hello.c 출발

  • 전처리기(Pre-processor) : #include와 같은 지시문을 먼저 처리
    #include <stdio.h> -> 헤더파일을 그대로 코드에 복붙
    ex) printf함수의 선언을 끌어오는 것

    -> printf라는 함수가 있다고만 알려주는 것

    hello.i

  • 컴파일러(compiler) : 소스코드를 한단계 낮은 단계의 어셈블리어로 번역해줌
    hello.s

  • 어셈블러(assembler) : 어셈블리어 프로그램을 기계어로 번역해줌
    hello.o

  • 링커(linker) : 여러 개의 코드와 라이브러리를 하나로 묶어 실행 가능한 파일을 만듦
    링커는 main.o에서 "printf 어디 있음?" 하고 찾음
    시스템의 라이브러리(libc.a, libc.so) 안에서 printf() 정의를 찾아서 붙임
    최종 실행 파일(a.out, main.exe)이 만들어짐
    hello


1.3 컴파일 시스템이 어떻게 동작하는지 이해하는 것은 중요하다.

  • 🔧 프로그램 성능 최적화
    컴파일 단계에서 생기는 불필요한 코드, 중복 포함 등을 줄일 수 있음
    -O2, -O3 같은 최적화 옵션 이해에 도움

  • 🚫 링크 에러 이해 & 해결
    링커가 못 찾는 함수, 중복 정의 문제 등
    → "undefined reference", "multiple definition" 에러의 원인을 알 수 있음

  • 🔐 보안 약점 방지
    잘못된 외부 코드 링크 → 취약점 포함 가능
    정적/동적 링크 방식 이해로 라이브러리 관리 가능


1.4 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다.

위 과정에서 기계어로 번역된 명령은 어떤 식으로 컴퓨터가 읽어내고 처리해서 다시 사용자에게 보여줄까?
이 질문에 답을 하기 위해 시스템의 하드웨어 조직부터 알아보자

1.4.1 시스템의 하드웨어 조직

[입출력 장치]      [메인 메모리]
     │                   │
     └─────[버스]─────────┘
              │
          [프로세서]

위와 같은 구조를 가지고 있다


1️⃣ 프로세서 (Processor, CPU)
👉 컴퓨터의 "두뇌"

  • 명령어 해석 & 실행
  • 레지스터, 연산 장치, 제어 장치 포함
  • PC, ALU, 레지스터 등으로 구성됨

역할:

  • 명령어를 메모리에서 가져와 실행 (fetch-decode-execute 사이클)
명령설명방향
LOAD메모리 → 레지스터읽기
STORE레지스터 → 메모리쓰기
OPERATE레지스터끼리 연산계산
JUMP흐름 이동 (PC 조작)제어

2️⃣ 메인 메모리 (Main Memory, RAM)
👉 작업 중 데이터를 저장하는 "책상"

  • 프로그램 실행 중 사용되는 데이터와 코드가 저장됨
  • 휘발성(전원 꺼지면 내용 사라짐)

역할:

  • CPU가 바로 접근할 수 있는 저장소
  • 실행 중인 프로그램과 데이터를 임시로 저장

3️⃣ 입출력 장치 (I/O Device)
👉 컴퓨터의 "손발"

  • 사용자와 상호작용하는 장치들 (키보드, 마우스, 모니터, 프린터 등)

역할:

  • 외부 세계 ↔ 컴퓨터 간 정보 교환
  • I/O 명령을 통해 데이터 전송

4️⃣ 버스 (Bus)
👉 컴퓨터 내부의 "도로망"

  • 모든 부품을 연결하는 통로
  • 데이터 버스, 주소 버스, 제어 버스로 나뉨

역할:

  • CPU, 메모리, I/O 사이에 데이터, 주소, 제어 신호를 전달함

1.4.2 hello 프로그램의 실행

사용자 입력 -> CPU(레지스터) -> 메모리 -> CPU(레지스터) -> 출력

사용자 입력
 → [프로그램 실행 요청]
 → CPU(레지스터에서 명령어 처리)
 → 메인 메모리에서 데이터(문자열 등) 로드
 → 다시 CPU가 처리 (레지스터 연산)
 → 결과를 출력장치로 보냄
  • 기본적으로 위의 과정을 통해 프로그램 명령이 수행된다.
  • 각 구성요소 간의 연결(->)은 bus를 의미

0개의 댓글