현 상황
프로젝트 진행 중 취업 및 인턴 준비를 하는 인원이 생기고, 공부하는 시간과 개발하는 시간을 잘 배분하지 못해 진행을 못하고 있었다.
그러던 와중 취업준비를 하며 C# 보단 C++가 더 업계에 자주 쓰인다는 걸 알게되어 다시금 프로젝트 계획을 수정하기로 하였다..!
-
C# 보다 아직 주류인 언어 C++을 이용해 서버를 구축하자
-
현재 서버 구조를 전부 배우고 이를 실행하려 하니까 진행이 더딘 것 같아 이를 새롭게 분배하자
( 프로젝트에 진행도에 따라 주제를 정해 자료 조사 및 정리 -> 정리된 자료들을 토대로 프로젝트 적용 )
첫 번째 주제
일단 C++을 이용해 서버를 구축하기로 하였으므로 언어에 대한 특징과 JavaScript와의 차이점 등을 조사하기로 하였다.
추가로 C++을 활용한 코딩 테스트를 통해 문법에 친해질 수 있도록 풀이를 정리하기로 했다!
특징
- 저수준과 고수준 언어의 중간성
- C++는 C에서 파생된 언어로, 메모리에 직접 접근하는 포인터, 수동 메모리 관리가 가능
- 동시에 객체지향 프로그래밍(OOP), 제네릭 프로그래밍(템플릿), 예외 처리 등 고수준 프로그래밍 기법 지원
- 하드웨어 제어와 시스템 프로그래밍, 성능이 중요한 애플리케이션에 적합
- 정적 타입 및 컴파일 언어
- 변수와 함수 등의 타입을 컴파일 시에 엄격히 지정
- 타입 오류 대부분 컴파일 단계에서 발견, 런타임 오류 감소
- 컴파일러가 최적화를 수행해 매우 빠른 실행 속도 보장
- 객체지향 프로그래밍 지원
- 클래스, 상속, 다형성(가상 함수), 캡슐화, 추상화 등을 명확히 지원
- C++ 표준 라이브러리(STL)는 템플릿과 컨테이너 등 모던 프로그래밍 요소 포함
- 수동 메모리 관리
- 개발자가 직접 메모리를 할당(new) 및 해제(delete)
- 높은 자유도와 효율성을 주지만, 메모리 누수 및 오류 위험 존재
- 최근에는 스마트 포인터 같은 안전 장치 도입
- 저수준 시스템 접근 가능
- 하드웨어 레지스터 조작, 임베디드 프로그래밍 등 가능
- OS, 드라이버 개발 등에 광범위하게 쓰임
Js와의 차이점
구분 | C++ | JavaScript (JS) |
---|---|---|
유형 | 정적 타입, 컴파일 언어 | 동적 타입, 인터프리터 또는 JIT 컴파일러 기반 실행 |
메모리 관리 | 수동 메모리 할당 및 해제 | 자동 가비지 컬렉션 |
실행 환경 | 운영체제에 직접 컴파일 후 실행(네이티브 코드) | 웹 브라우저, Node.js 같은 JS 엔진 위에서 실행 |
병렬 처리 | 멀티스레딩, 병렬 프로그래밍 지원 | 기본적으로 단일 스레드, 비동기(이벤트 루프) 프로그래밍 위주 |
타입 시스템 | 엄격한 타입 지정 | 타입 유연, 동적 타입 |
객체 모델 | 클래스 기반, 강한 OOP 지원 | 프로토타입 기반 객체 지향 |
주요 용도 | 시스템/임베디드 프로그래밍, 고성능 애플리케이션 | 웹 프론트엔드, 서버 비즈니스 로직, 빠른 개발 사이클 |
빌드 및 배포 | 별도 컴파일 + 링킹 필요 | 즉시 실행 가능, 추가 빌드 필요 시도 있지만 필요조건 낮음 |
빌드 및 배포에 있는 컴파일과 링킹에 대해 아래와 같은 설명을 추가 하겠다!
- 컴파일(compilation) 단계에서는 소스 코드가 각각 기계어 코드가 들어있는 오브젝트 파일로 변환됨.( 각 파일은 독립적인 코드 조각! )
- 링킹(linking) 단계에서는 여러 오브젝트 파일을 하나로 모아 프로그램 전체를 완성
- 링커(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 | 람다 반환 타입 명시 |
한줄 평 + 개선점
- 처음부터 조금씩 시도할 껄 한 꺼번에 하려했던 게 너무 오만했던 것 같다.