현 상황

프로젝트 진행 중 취업 및 인턴 준비를 하는 인원이 생기고, 공부하는 시간개발하는 시간을 잘 배분하지 못해 진행을 못하고 있었다.
그러던 와중 취업준비를 하며 C# 보단 C++가 더 업계에 자주 쓰인다는 걸 알게되어 다시금 프로젝트 계획을 수정하기로 하였다..!

  • C# 보다 아직 주류인 언어 C++을 이용해 서버를 구축하자

  • 현재 서버 구조를 전부 배우고 이를 실행하려 하니까 진행이 더딘 것 같아 이를 새롭게 분배하자
    ( 프로젝트에 진행도에 따라 주제를 정해 자료 조사 및 정리 -> 정리된 자료들을 토대로 프로젝트 적용 )

첫 번째 주제

일단 C++을 이용해 서버를 구축하기로 하였으므로 언어에 대한 특징JavaScript와의 차이점 등을 조사하기로 하였다.
추가로 C++을 활용한 코딩 테스트를 통해 문법에 친해질 수 있도록 풀이를 정리하기로 했다!

특징

  • 저수준과 고수준 언어의 중간성
    • C++는 C에서 파생된 언어로, 메모리에 직접 접근하는 포인터, 수동 메모리 관리가 가능
    • 동시에 객체지향 프로그래밍(OOP), 제네릭 프로그래밍(템플릿), 예외 처리 등 고수준 프로그래밍 기법 지원
    • 하드웨어 제어와 시스템 프로그래밍, 성능이 중요한 애플리케이션에 적합
  • 정적 타입 및 컴파일 언어
    • 변수와 함수 등의 타입을 컴파일 시에 엄격히 지정
    • 타입 오류 대부분 컴파일 단계에서 발견, 런타임 오류 감소
    • 컴파일러가 최적화를 수행매우 빠른 실행 속도 보장
  • 객체지향 프로그래밍 지원
    • 클래스, 상속, 다형성(가상 함수), 캡슐화, 추상화 등을 명확히 지원
    • C++ 표준 라이브러리(STL)는 템플릿과 컨테이너 등 모던 프로그래밍 요소 포함
  • 수동 메모리 관리
    • 개발자가 직접 메모리할당(new) 및 해제(delete)
    • 높은 자유도와 효율성을 주지만, 메모리 누수 및 오류 위험 존재
    • 최근에는 스마트 포인터 같은 안전 장치 도입
  • 저수준 시스템 접근 가능
    • 하드웨어 레지스터 조작, 임베디드 프로그래밍 등 가능
    • OS, 드라이버 개발 등에 광범위하게 쓰임

Js와의 차이점

구분 C++ JavaScript (JS)
유형 정적 타입, 컴파일 언어 동적 타입, 인터프리터 또는 JIT 컴파일러 기반 실행
메모리 관리 수동 메모리 할당 및 해제 자동 가비지 컬렉션
실행 환경 운영체제에 직접 컴파일 후 실행(네이티브 코드) 웹 브라우저, Node.js 같은 JS 엔진 위에서 실행
병렬 처리 멀티스레딩, 병렬 프로그래밍 지원 기본적으로 단일 스레드, 비동기(이벤트 루프) 프로그래밍 위주
타입 시스템 엄격한 타입 지정 타입 유연, 동적 타입
객체 모델 클래스 기반, 강한 OOP 지원 프로토타입 기반 객체 지향
주요 용도 시스템/임베디드 프로그래밍, 고성능 애플리케이션 웹 프론트엔드, 서버 비즈니스 로직, 빠른 개발 사이클
빌드 및 배포 별도 컴파일 + 링킹 필요 즉시 실행 가능, 추가 빌드 필요 시도 있지만 필요조건 낮음

빌드 및 배포에 있는 컴파일과 링킹에 대해 아래와 같은 설명을 추가 하겠다!

  1. 컴파일(compilation) 단계에서는 소스 코드가 각각 기계어 코드가 들어있는 오브젝트 파일로 변환됨.( 각 파일은 독립적인 코드 조각! )
  2. 링킹(linking) 단계에서는 여러 오브젝트 파일을 하나로 모아 프로그램 전체를 완성
  3. 링커(linker)는 함수나 변수에 대한 참조가 어느 오브젝트 파일에 있는지 찾아 연결해 주고, 필요한 라이브러리 함수도 포함함

위와 같은 과정을 거쳐 최종 실행 파일(.exe, ELF 등)이 만들어짐

서버 언어

C++을 이용해 서버를 구축하면 어떠한 이점이 생기는지 정리해두었다!

  • 초고성능과 낮은 지연시간
    • 네트워크 서버, 게임 서버처럼 성능과 지연시간이 중요한 환경에 최적
    • 컴파일러 최적화와 직접 메모리 제어 덕분에 매우 빠른 응답 가능
  • 리소스 제어 및 최적화 가능
    • 메모리, CPU 자원을 세밀하게 관리 가능
    • 대용량 데이터 처리, 멀티 스레딩 프로그래밍에 유리
  • 다양한 시스템 레벨 인터페이스 지원
    • OS API, 네트워크 소켓, 하드웨어 장치 접근이 자유로움
    • 복잡한 서버 시스템 혹은 맞춤형 고성능 네트워크 솔루션 구축에 적합
  • 안정성 및 강력한 타입 시스템
    • 컴파일 시점에서 오류를 잡아 안정적이고 견고한 서버 개발 가능
    • 타입 명확성과 엄격한 문법 덕분에 버그 예방 가능
  • 넓은 생태계와 라이브러리 지원
    • Boost, POCO, ASIO 같은 네트워킹, 멀티쓰레드, 비동기 프로그래밍 지원 라이브러리 다수 존재
    • 다양한 플랫폼에서 사용 가능하며 대형 서비스 서버에도 활용됨

코딩 테스트

코딩 테스트 깃허브

문제와 풀이한 코드는 위에 적혀있고, 코딩테스트를 풀면서 새로 배운 것들을 정리한다!

  • <algorithm> 내의 find_if 함수는 반복자(주소로 이루어진)를 반환하기에 auto로 처리하는게 깔끔하다!
    (물론 std::vector<std::vector<int»::iterator 처럼 직접 명시해줄 수도 있다..)

  • vector를 사용할 때 !vector.empty()를 통해 while문을 쉽게 시작할 수 있다.

  • 람다 함수 식에서 시작 부분의 [] 내부는 외부 변수 참조 형태를 지정하는 것이었다!

문법 의미
[&] 람다 안에서 모든 외부 변수 참조로 캡처
[=] 람다 안에서 모든 외부 변수 값을 복사해서 캡처
-> type 람다 반환 타입 명시

한줄 평 + 개선점

  • 처음부터 조금씩 시도할 껄 한 꺼번에 하려했던 게 너무 오만했던 것 같다.