
2025.03.17
WEEK01 :
배열, 문자열, 반복문과 재귀 함수, 복잡도(BigO,시간,공간), 정렬, 완전 탐색, 정수론
자료구조와 함계 배우는 알고리즘 입문 책을 읽었다.
문제에 직접 적용해보고 어려웠던 문제들을 적어보자.
시작하기에 앞 서 오전에 깃허브 사용법을 간단하게 배웠다.
git clone (remote repository(깃허브 레포지토리 주소)) : 깃헙에서 레포 클론 해오기
git branch : 브랜치 목록 확인
git checkout -b (주차)/(깃헙 아이디) : -b 브랜치 생성 및 이동 / 각 주차별로 잘생성하자
code . : vscode 열기
git branch : 다시 브랜치 잘 생성되었는지 확인
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일차에 못한 정리를 해보자
컴퓨터는 모든 정보를 0과 1(비트)로 표현
같은 비트라도 해석하는 맥락(context)에 따라 의미가 달라짐
우리가 직접 사용 하는 고급 언어를 기계(컴퓨터)가 이해할 수 있는 언어로 바꿔 주어야 한다.
소스파일 -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 기계어
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
🔧 프로그램 성능 최적화
컴파일 단계에서 생기는 불필요한 코드, 중복 포함 등을 줄일 수 있음
-O2, -O3 같은 최적화 옵션 이해에 도움
🚫 링크 에러 이해 & 해결
링커가 못 찾는 함수, 중복 정의 문제 등
→ "undefined reference", "multiple definition" 에러의 원인을 알 수 있음
🔐 보안 약점 방지
잘못된 외부 코드 링크 → 취약점 포함 가능
정적/동적 링크 방식 이해로 라이브러리 관리 가능
위 과정에서 기계어로 번역된 명령은 어떤 식으로 컴퓨터가 읽어내고 처리해서 다시 사용자에게 보여줄까?
이 질문에 답을 하기 위해 시스템의 하드웨어 조직부터 알아보자
[입출력 장치] [메인 메모리]
│ │
└─────[버스]─────────┘
│
[프로세서]
위와 같은 구조를 가지고 있다
1️⃣ 프로세서 (Processor, CPU)
👉 컴퓨터의 "두뇌"
역할:
| 명령 | 설명 | 방향 |
|---|---|---|
| LOAD | 메모리 → 레지스터 | 읽기 |
| STORE | 레지스터 → 메모리 | 쓰기 |
| OPERATE | 레지스터끼리 연산 | 계산 |
| JUMP | 흐름 이동 (PC 조작) | 제어 |
2️⃣ 메인 메모리 (Main Memory, RAM)
👉 작업 중 데이터를 저장하는 "책상"
역할:
3️⃣ 입출력 장치 (I/O Device)
👉 컴퓨터의 "손발"
역할:
4️⃣ 버스 (Bus)
👉 컴퓨터 내부의 "도로망"
역할:
사용자 입력 -> CPU(레지스터) -> 메모리 -> CPU(레지스터) -> 출력
사용자 입력
→ [프로그램 실행 요청]
→ CPU(레지스터에서 명령어 처리)
→ 메인 메모리에서 데이터(문자열 등) 로드
→ 다시 CPU가 처리 (레지스터 연산)
→ 결과를 출력장치로 보냄