본문 바로가기

전체 글25

C언어로 CSV 파싱 구현하기 (토큰, 상태기계, 오류 처리) CSV(Comma-Separated Values)는 데이터를 표 형태로 저장하는 가장 단순한 형식 중 하나이지만, 실제 파싱 과정에서는 단순히 쉼표로 구분하는 수준을 넘어 복잡한 예외 처리가 필요합니다. 문자열 내부의 쉼표, 따옴표로 감싼 필드, 다양한 개행 문자 등은 단순 split() 함수로 처리할 수 없습니다. 이 글에서는 C언어로 CSV 파일을 안정적으로 파싱하는 방법을 다루며, 토큰 분리, 상태기계(State Machine) 기반의 파싱, 그리고 예외 상황에서의 에러 처리 방법을 단계별로 설명합니다.CSV 파싱의 기본 구조와 토큰 분리 로직CSV 파일의 각 줄은 하나의 레코드이고, 쉼표(,)는 필드를 구분합니다. 그러나 따옴표로 감싸진 문자열 안에 쉼표가 포함될 수 있고, 필드 내에서 개행이 허.. 2025. 10. 20.
Java 스트림 튜닝방법 (GC, 메모리, 스루풋) Java 8부터 도입된 Stream API는 코드 가독성을 높이고 함수형 프로그래밍 스타일을 제공하지만, 대용량 데이터 처리에서는 오히려 성능 병목의 원인이 될 수 있습니다. 불필요한 객체 생성, 박싱·언박싱, 병렬 스트림 남용 등은 GC 부하를 증가시키고 전체 스루풋을 떨어뜨립니다. 이 글은 GC 부담을 줄이고, 메모리 효율을 개선하며, 스루풋(throughput)을 높이는 실전 스트림 튜닝 방법을 다룹니다.GC 부하 줄이기: 객체 생성과 박싱 최소화Stream의 가장 큰 함정 중 하나는 불필요한 객체 생성입니다. 특히 Stream와 같은 래퍼 타입 스트림은 매번 Integer 객체를 만들어 메모리를 낭비합니다. 기본형 스트림(IntStream, LongStream, DoubleStream)을 사용하면.. 2025. 10. 20.
C언어로 HTTP 서버구현하기 (소켓 통신, 요청, 응답) 웹 개발에서 HTTP는 기본 중의 기본이지만, 이를 가장 낮은 수준인 소켓(Socket)으로 직접 구현해 보는 경험은 네트워크 프로그래밍의 본질을 이해하는 데 매우 유익합니다. 특히 C언어로 HTTP 서버를 직접 구현해 보면, 브라우저와 서버가 실제로 어떤 식으로 요청(Request)과 응답(Response)을 주고받는지, TCP 연결은 어떻게 맺어지는지를 명확히 체감할 수 있습니다. 이 글에서는 운영체제의 소켓 API를 사용해 간단한 HTTP 서버를 만드는 과정을 단계별로 살펴보고, TCP 통신 구조와 HTTP 프로토콜의 핵심을 함께 이해해봅니다.소켓 통신의 기본 개념 이해HTTP 서버를 직접 만든다는 것은 결국 TCP 기반 소켓 통신을 구현한다는 의미입니다. C언어의 소켓 프로그래밍은 리눅스 시스템 .. 2025. 10. 20.
자바 멀티스레딩 사례 (락, CAS, AQS) 자바에서 멀티스레딩은 단순히 속도를 높이기 위한 보너스가 아니라, 서버·백엔드·배치·게임·금융 등 여러 도메인에서 필수 역량이다. 특히 동기화 전략을 제대로 고르지 못하면 교착상태, 기아, 스루풋 저하, 예측 불가능한 지연 같은 문제가 즉시 드러난다. 이 글은 실무 시나리오를 통해 락(lock) 기반 설계, CAS(Compare-And-Set) 중심의 락-프리 패턴, 그리고 AQS(AbstractQueuedSynchronizer) 계열 동기화 도구의 실제 사용을 비교하고, 언제 무엇을 선택해야 하는지 판단 기준을 제시한다.락: 재진입 락과 조건 대기로 푸는 실무 동시성 문제락은 가장 이해하기 쉬운 동기화 도구다. 웹 주문 처리, 금융 거래처럼 “정합성이 절대적”인 구간에서는 락으로 임계 구역을 간명하게 .. 2025. 10. 20.
C 언어 LED 제어 (임베디드, GPIO, 튜토리얼) 운영체제(OS)가 없는 환경에서 하드웨어를 직접 제어하는 것은 임베디드 시스템 프로그래밍의 핵심입니다. 이 글에서는 C언어를 사용하여 LED를 제어하는 기본적인 방법을 다룹니다. GPIO 포트의 개념, 마이크로컨트롤러 레지스터 접근 방식, 그리고 코드 예제까지 단계별로 정리하여 초보자도 LED 제어의 기본 원리를 이해할 수 있도록 설명합니다.운영체제 없이 LED를 제어한다는 의미임베디드 시스템에서는 일반적인 컴퓨터처럼 Windows나 Linux 같은 운영체제가 없습니다. 대신 CPU, 메모리, 입출력 장치가 직접 연결되어 있고, 개발자가 하드웨어 레벨에서 제어 코드를 작성해야 합니다. GPIO란? (General Purpose Input/Output)GPIO는 말 그대로 범용 입출력 포트를 의미합니다.마.. 2025. 10. 20.
20년 된 C 코드 개선하기 (리팩터링, 모듈화, 유지보수) 소프트웨어는 시간이 지남에 따라 새로운 기능이 추가되고 버그가 수정되며, 운영 환경도 바뀝니다. 특히 C언어로 작성된 코드는 시스템 프로그래밍, 임베디드 장비, 통신 장비, 금융 시스템 등에서 여전히 중요한 역할을 하고 있습니다. 하지만 20년 이상 된 C언어 코드를 유지보수하려면 많은 어려움이 따릅니다. 최신 표준을 따르지 않고, 문서화가 부족하며, 당시 개발자의 습관에 의존해 작성된 경우가 많아 이해하기 어렵습니다. 이번 글에서는 실제로 오래된 C언어 코드를 리팩터링하면서 어디서부터 시작해야 하고 어떤 과정을 거쳐야 하는지 경험을 중심으로 정리해 보겠습니다.레거시 코드 진단: 문제의 뿌리를 파악하기리팩터링은 무작정 코드를 바꾸는 것이 아니라 현재 상태를 진단하는 것에서 시작합니다. 오래된 코드에서 공.. 2025. 10. 4.