Journey to CS 96

GDB에서 x 명령어로 메모리 분석하기

C 언어에서 문자와 문자열이 메모리에 어떻게 저장되는지 이해하는 것은 시스템 프로그래밍의 기초다.특히 디버거(GDB)를 통해 실제 메모리 주소에 접근하여 바이너리 데이터를 확인하면, 추상적으로 알고 있던 변수들이 물리적으로 어떻게 배치되는지 시각적으로 파악할 수 있다. 오늘 수업에서는 C언어로 프로그램을 작성하고, GDB를 활용해 메모리 구조를 분석하는 것을 배웠다.1. 소스 코드 작성먼저 문자와 문자열 배열을 포함하는 간단한 C 소스 코드를 작성한다.단일 문자 변수와 두 개의 서로 다른 문자열 배열을 선언하고 출력하는 코드다.소스 코드 (gdbchar.c)#include int main(){ char ch1 = 'A'; char message1[] = "ABCDE"; char mess..

필수 암기 아스키(ASCII) 코드

1. 제어 문자 및 공백 (Control Characters & Space)0x00 (NUL): Null Character. 문자열의 끝을 표시한다. C언어 등에서 문자열이 어디서 끝나는지 판단하는 기준이 된다.0x20 (SP): Space. 우리가 흔히 누르는 공백(스페이스바) 한 칸이다.0x0a (LF): Line Feed. 줄바꿈(엔터)을 의미한다. 리눅스 등 유닉스 계열 시스템에서 주로 사용되는 개행 문자다.2. 숫자 문자 (Numbers 0-9)주의할 점은 숫자 값 자체가 아니라, 화면에 출력되는 '문자로서의 숫자'라는 점이다.0x30 (48): 문자 '0'0x39 (57): 문자 '9'특징: 0부터 9까지 순차적으로 배치되어 있어, 현재값 - 0x30을 하면 실제 정수 값을 얻을 수 있다.3...

C언어 필수 디버깅 도구 gdb 기본 사용법과 16진수 표현 이해하기

리눅스 환경에서 C 언어를 개발할 때 필수 도구 중 하나는 바로 gdb(GNU Debugger)이다.gdb는 메모리 내부를 들여다보고 프로그램 로직 오류의 원인을 파악하는 데 필요하다. gdb의 설치 방법과 기초 사용법을 알아보자.1. gdb란?gdb(GNU Debugger)는 GNU 소프트웨어 시스템을 위한 기본 디버거이다.작성한 소스 코드가 실행되는 동안 내부적으로 어떤 일이 벌어지는지 추적하거나, 프로그램이 비정상적으로 종료되었을 때의 상태를 분석하는 용도로 사용된다.gdb의 기능특정 행(Line)이나 조건에서 프로그램 실행을 중단시킨다.프로그램이 멈췄을 때, 현재 변수의 값이나 메모리 상태를 확인한다.코드의 흐름을 한 단계씩(Step-by-step) 따라가며 로직 오류를 찾는다.VS Code 디버..

C언어 char 배열의 메모리 할당 및 문자열 초기화 메커니즘 (feat. VS Code 디버거)

C언어에서 문자열 배열을 다룰 때, 선언과 동시에 값을 대입하는 것과 선언 후 별도로 대입하는 것은 메모리 관점에서 차이가 있다.VS Code의 디버거를 통해 각 케이스별로 메모리 내부의 쓰레기값과 데이터 배치 과정을 확인해볼 수 있다. 1. 테스트 코드 작성비교를 위해 두 가지 케이스를 구성했다. CASE 1은 선언과 동시에 초기화하는 방식이고, CASE 2는 선언 후 strcpy 함수를 사용하여 값을 대입하는 방식이다.디버거의 변화를 관찰하기 위해 message1[10] 배열 초기화 부분에 중단점(Breakpoint)을 걸어주고 F5로 디버깅을 실행한다.#include #include int main() { // [CASE 1] 선언과 동시에 초기화 char message1[10] = "H..

VSCode로 C 코드 디버깅하기

1. 디버그 기능의 필요성프로그램이 의도대로 동작하지 않을 때 소스 코드에 출력 함수(printf)를 삽입하여 값을 확인하는 방식은 한계가 있다.프로젝트 규모가 커질수록 출력 코드를 일일이 추가하고 삭제하는 과정에서 시간이 낭비되며, 코드의 전체적인 실행 흐름을 파악하기 어렵기 때문이다.VSCode의 디버그 기능을 사용하면 다음과 같은 이점이 있다.실행 일시 정지: 특정 지점에서 실행을 멈추고 메모리 상태를 점검할 수 있다.단계별 실행: 코드를 한 줄씩 실행하며 로직의 변화를 추적할 수 있다.데이터 모니터링: 변수에 저장된 값의 변화를 실시간으로 확인할 수 있다.런타임 수정: 실행 중에 변수 값을 임의로 변경하여 가상 시나리오를 테스트할 수 있다.2. C 언어 디버깅 환경 설정VSCode에서 C 코드를 ..

APT 저장소 방식으로 VS Code 설치하기 (작동 원리)

리눅스에서 VS Code를 설치하는 방법은 크게 Snap과 공식 APT 저장소 방식으로 나뉜다.Snap은 간편하지만, 샌드박스(Sandbox) 내에서 실행되기 때문에 시스템의 컴파일러나 디버거와의 연동이 까다롭고 실행 속도가 상대적으로 느리다는 단점이 있다. 반면, 공식 저장소를 등록하는 방식은 시스템 자원에 직접 접근하기 쉬워서 개발 도구 간의 호환성이 뛰어나고, apt upgrade 명령어로 다른 패키지들과 함께 일괄 업데이트가 가능하기 때문에 더 효율적이다. 1. 필수 유틸리티 설치sudo apt install -y wget gpg작동 원리: 시스템에 패키지를 다운로드할 wget과 보안 검증을 위한 gpg 도구가 있는지 확인하고 설치한다.패키지 역할: wget은 웹에서 파일을 가져오는 통신 도구이며..

C/C++ 개발 환경 세팅: GCC, G++ 설치 및 build-essential

리눅스 환경에서 C 또는 C++ 프로그램을 개발하기 위해서는 컴파일러 설치가 필수적이다.우분투에서 C 개발 환경을 구축하는 방법과 주요 도구들의 차이점을 알아보자.1. GCC vs G++GCC와 G++ 둘 다 GNU 컴파일러 모음(GCC)에 포함되어 있지만, 처리 방식에 차이가 있다.구분GCC (gcc)G++ (g++)주요 대상C 언어 컴파일러C++ 언어 컴파일러확장자 인식.c는 C로, .cpp는 C++로 인식모든 파일을 C++로 간주라이브러리 링크C++ 표준 라이브러리를 자동 링크하지 않음**C++ 표준 라이브러리(STL)**를 자동 링크 C 코드를 짤 때는 gcc, C++ 코드를 짤 때는 g++를 사용하는 것이 표준이다.C++ 파일을 gcc로 컴파일하면 라이브러리 링크 오류가 발생할 수 있으므로 주의..

C언어 개발 환경 비교: Visual Studio vs VSCode

1. Visual Studio vs VSCode: 무엇이 다른가?가장 큰 차이는 '통합 개발 환경(IDE)'이냐, '코드 에디터'냐 하는 점이다.Visual Studio (통합 개발 환경, IDE)장점: C언어 학습에 필요한 컴파일러(MSVC), 디버거, 라이브러리 관리 도구가 모두 내장되어 있다. 설치 한 번으로 즉시 코딩과 실행이 가능하다. 디버깅 성능이 좋고 대규모 프로젝트 관리 기능이 있다.단점: 프로그램이 무겁고 설치 용량이 수십 GB이다. 실행 속도가 상대적으로 느리며 윈도우 환경에 최적화되어 있다.용도: 윈도우 전용 애플리케이션 개발, 복잡한 대규모 프로젝트, 초보자가 환경 설정 없이 바로 학습을 시작하고 싶을 때 적합하다.VSCode (코드 에디터)장점: 가볍고 빠르며 UI가 편리하다. 확..

Jenkins와 Kubernetes를 조합한 CI/CD 파이프라인

1. Jenkins의 작동 메커니즘과 생태계Jenkins는 다양한 외부 서비스들을 하나로 묶어주는 오케스트레이터(Orchestrator) 역할을 수행한다.젠킨스의 전체적인 CI/CD 흐름은 다음과 같다. SCM(Source Code Management) 연동: 젠킨스 파이프라인에서 SCM은 자동화의 트리거(Trigger) 역할을 한다. Webhook을 통해 코드 변경을 실시간으로 감지하고 작업 공간(Workspace)으로 소스를 가져온다.(Checkout)CI(지속적 통합): 빌드 도구와 테스트 프레임워크를 통해 코드 품질을 검증하고 실행 가능한 아티팩트*를 생성한다.CD(지속적 배포): 생성된 아티팩트를 레지스트리에 저장하고 최종 목적지인 서버나 클러스터에 배포한다.💡아티팩트(artifact)란?소스..

Journey to CS/웹 2026.01.24

[Java] 래퍼 클래스(Wrapper Class)와 오토 박싱

자바는 객체 지향 언어지만 성능을 위해 비객체형인 기본형(Primitive)을 지원한다.하지만 제네릭이나 컬렉션 프레임워크처럼 객체만 다룰 수 있는 상황에서는 기본형을 객체로 감싸야 하는데, 이때 사용하는 것이 래퍼 클래스(Wrapper Class) 다.박싱(Boxing)과 언박싱(Unboxing)Boxing: 기본형 → 래퍼 클래스 (int → Integer)Unboxing: 래퍼 클래스 → 기본형 (Integer → int)JDK 1.5부터는 컴파일러가 이를 자동으로 처리해주는 Auto-boxing/Auto-unboxing을 지원한다.덕분에 개발자는 기본형과 래퍼 클래스를 혼용해서 사용할 수 있다.📌코드 예시 : null 처리와 유틸리티 활용래퍼 클래스는 null을 담을 수 있어 DB 연동 시 유용..