Inflearn brand logo image
Inflearn brand logo image
채널톡 아이콘

readable_code::CMake - Fancy하게 C++ Project 만들기

C++의 가장 큰 장벽이 무엇일까요? 제가 생각했을 때는 CMake가 아닐까 싶습니다. 처음 C++을 시작했을 때, 소스 파일 하나 빌드 하기도 어렵게 만들었던 CMake… 저와 함께 부숴볼까요? 이 강의와 함께라면 당신도 CMake Master!

Thumbnail

초급자를 위해 준비한
[프로그래밍 언어, 개발 도구] 강의입니다.

이런 걸 배울 수 있어요

  • CMake 기초 문법

  • Modern CMake 문법

  • CMake를 사용한 외부 종속성(별도 CMake project, 3rd party library) 관리

  • CMake를 사용한 C++ project 구축

readable_code

cpp::build_system::modular_project_with_cmake - OS/Platform 종속성 없이 fancy하게 C++ project 만들기

C++ 프로젝트 생성에 필수적인 CMake에 대해서 배워요!

  • CMake는 어렵지요?

  • 하지만 이 강의에서는 어떤 프로젝트 구성에도 사용이 가능한 CMake template을 알려드립니다.

  • 10년 넘게 CMake로 쌩 고생하며 알게된 엑기스 전부 알려드립니다!

이런 내용을 배워요

CMake의 기초 문법

  • CMake를 보다 잘 활용할 수 있게 해주는 기초 문법을 알려드려요.

  • 변수, 메시지, 함수, 제어문 등 CMake 기초 문법을 통해 프로그래밍 언어처럼 사용해보아요!

Modern CMake의 문법

  • C → C++로 프로그래밍 패러다임이 바뀐 것처럼 이젠 모던 CMake가 대세랍니다!

  • CMake를 통해 라이브러리와 실행 파일을 만들 때, 예전 방법을 쓰지 않도록 해요.

CMake를 사용한 외부 종속성 관리

  • 아직도 외부 종속성을 PC에 설치해서 관리하세요?

  • CMake 프로젝트와 외부 종속성을 통합해서 관리해보아요.

  • 이젠 프로젝트를 빌드하기 위해 별도 라이브러리 설치과정을 없앨 수 있습니다!

CMake를 사용한 재사용 가능한 C++ project 구축

  • 10년 넘는 개발 경력의 정수를 담았습니다.

  • 최소한의 수정으로 최대한의 효율을 뽑을 수 있는 CMake 구조를 전달해드립니다.

  • 이런 프로젝트 구조는 어디서도 본 적 없으실 걸요?!

무엇을 얻을 수 있을까요?

  • 프로그래밍 언어처럼 CMake를 사용할 수 있는 능력

  • CMake를 사용한 C++ project 구축의 best practice

    • CMake를 외부 종속성 관리

    • CMake를 사용한 개발 프로세스 자동화

    • CMake를 사용한 재사용 가능한 구조화된 C++ project 구축

Keywords

  • Build System

  • CMake

  • Morden CMake

  • Project Architecture

  • Modular System

  • Thirdparty library

수강 전 참고 사항

실습 환경

  • 운영 체제 및 버전(OS): macOS, Ubuntu

  • 사용 도구: Clang, CMake, Visual Studio Code(VSCode)

  • PC 사양: C++ 빌드가 가능한 모든 PC

선수 지식 및 유의사항

readable_code

왜 readable_code 일까요?

대학원 연구실에 처음 들어가서 구현되어 있는 소스 코드를 보며 들었던 자괴감이 아직도 기억납니다. ‘아… 왜 아무리 봐도 이해가 안되지?’ 그 당시에는 제가 부족해서 그런 줄 알았습니다. 그 때부터 10년이 넘는 시간이 지났습니다. 이제야 알게 됐습니다. 내가 문제가 아니라 코드가 문제였구나.

많은 개발자들이 코드라는 이름의 암호를 작성하며 ‘일단 돌아가야 해!’라고 외치고 있습니다. 하지만 그 코드들은 머지않아 옥죄는 목줄이 되어 나에게로 돌아옵니다. 빠른 구현을 위해 컨벤션을 맞추지 않고 구현한 코드와 남발한 주석은 코드를 읽는데 혼란을 야기하고, 큰 생각 없이 만들어 놓은 인터페이스는 나중에는 어떤 데이터를 주고 받기 위함인지조차 희미해집니다. 이렇게 짜여진 코드들은 시간이 지남에 따라 잘못된 결과 값이 발산하는 것처럼 아무도 읽을 수 없는 코드가 되어갑니다. 심지어는 그 코드를 작성한 본인도 코드를 보지 않고 일주일 지나면 그 암호를 디버깅이라는 코드북을 펴놓고 해석해야만 합니다.

우리는 소스 코드를 언어라고 부릅니다. 언어는 어떤 존재와 대화하기 위해 존재하는 것입니다. 여기서 많은 사람들은 그 어떤 존재를 컴퓨터라고 생각합니다. 이 착각으로 부터 야기되는 코드라고 부르는 많은 암호들이 생겨나는 것이겠죠.(코드의 뜻이 암호라는 것이 재미있지 않나요?)

하지만 앞서 이야기한 대로, 코드는 컴퓨터가 읽는 것이 아니라, 우리가 읽는 것입니다. 그렇기에 소스 코드를 작성하는 것은 글짓기와도 같습니다. 그 중에서도 기술 문서를 작성하는 것과 비슷합니다. 간결하고 명확하게 사람이 이해할 수 있게 코드를 작성해야 하는 것이죠. 이렇게 작성된 코드는 언제 누가 보아도 편하게 읽고 이해할 수 있습니다. 불행하게도 제가 겪어온 현업에서는 그런 사소하고 자잘한 것을 고려해서 구현할 시간이 없다고 합니다. 하지만 제가 느낀 것은 ‘시간이 없어서 못하는 것’이 아닌 ‘할 수 없어서 못하는 것’이였습니다.

사람이 읽기에 좋은 코드(readable_code)는 대부분의 경우 컴퓨터가 읽기에도 좋습니다. 불필요한 변수, 함수, 변환 및 프로세스를 구현하지 않기 때문이죠. 또한 이것은 협업과 코드 유지 관리의 퍼포먼스를 비약적으로 상승시켜 줍니다. 실제적으로 저는 제가 있던 회사에서 기존의 프레임워크를 버리고 새로운 프레임워크를 설계하여 구현하였고, 기존 프레임워크에서 2주가 걸려서도 진행하기 어려웠던 코드 통합작업을 3일만에 가능하게 단축시켰습니다. 또한 기존 프레임워크에서 3달정도 걸렸을 모듈 구현이 1달도 안 걸리는 시간에 가능하게 되었죠. 이렇게 사람이 읽기에 좋은 코드는 구현을 못해서 문제인 것이지, 할 수만 있다면 안할 이유가 없는, 말도 안되게 개발 효율을 향상시킬 수 있는 놀라운 것이죠.

아직까지는 성숙한 개발 문화와 협업, 사람이 읽기에 좋은 코드는 많은 경우 있으면 좋은 것, 없어도 큰 상관 없는 것 정도로 치부되는 경우가 많은 것 같습니다. 하지만 저는 사람이 읽기에 좋은 코드의 능력을 보았고 그것의 실제를 경험했습니다. 제가 이것을 지엽적으로 제가 있는 회사와 팀에 적용할 수도 있겠지만, 저는 그 정도로 만족하고 싶지 않습니다. 한국의 SW 생산성 자체를 키우고 싶습니다. 엔지니어 분들이 더 좋은 환경에서 개발을 하기를 원합니다. 좋은 개발 문화가 한국의 회사들 안에 자리잡기를 원합니다.

저는 이제부터 제가 가졌던 경험, 성공과 실패, 그 과정을 통해 알게 된 모든 노하우들을 여러분과 함께 나누려고 합니다. 이것들은 매우 소중한 것이며, 여러분께서 갈 그 길에 탄탄한 기반이 되어줄 것입니다. 함께 하시겠습니까?(y/n) …-y

readable_code의 차별점

  • Software architect 경험을 가진 강사가 현업에서 동작을 검증한 software 내용을 바탕으로 강의함

  • 실제 업무/개발에 적용 가능한 내용을 다룸

  • 책을 읽어서 알 수 있는 이론적인 내용이 아니라 실제 개발 경험을 바탕으로 습득한 노하우와 개념을 전달함

  • 각 강의들 간의 종속성을 최대한 없애서 하나의 강의만 들어도 이해 가능한 구조를 구현

강의명 읽는 법

  • C++에서 변수와 namespace를 기술 할 때 사용하는 snake_case 기술로 강의명 기술

  • 마치 C++에서 namespace를 사용하는 방식으로 강의의 계층 구조를 나눔

  • readable_code::language_name::xx::yy::zz::해당_강의명 - 부제

    • language_name : 어떤 프로그래밍 언어의 강의인지 기술(ex. cpp, c, python, etc…)

    • xx, yy, zz : 각 강의의 세부 계층, 강의의 속성을 표현(ex. 설계, 검증, etc…)

    • 해당_강의명 : 가장 아래 계층 이름은 강의의 본 이름을 기술

    • 부제 : 강의에 대한 부연 설명


이런 분들께
추천드려요!

학습 대상은
누구일까요?

  • C++ 개발을 처음 시작하는 분

  • 체계적으로 잘 구현된 CMake 프로젝트를 얻기 원하는 분

  • 여러 OS를 오가며 C++을 개발하셔야 하는 분

  • 돌아가는 CMake 파일을 조금씩 수정해가며 프로젝트를 관리해오셨던 분

  • 외부 종속성을 간단하게 관리하고 싶은 분

  • 프로젝트의 구조를 효율적으로 관리하고 싶은 분

선수 지식,
필요할까요?

  • C++

  • 개발 환경 설정 (Ubuntu, VSCode)

안녕하세요
개발 대장입니다.

528

수강생

12

수강평

4

답변

4.7

강의 평점

2

강의

About Me

안녕하세요. 개발 대장 양은성입니다.

 

저는 한때 배송 로봇과 자율주행 소프트웨어를 열정적으로 개발하던 사람이었습니다. 설계하고 개발하는 일을 누구보다 사랑했지만, 결국 업계를 떠난 지 벌써 1년이 지났습니다. 제가 그토록 좋아하던 일을 뒤로하고 떠날 수밖에 없었던 이유는 단 하나였습니다.

 

“더 많은 사람을 도와주고 싶다.”

 


 

로봇과 함께한 어린 시절

어릴 적, 부모님이 사주신 프로그래머블 레고로 처음 자동차를 만들어 보며 프로그래밍에 입문했습니다. 중학생 시절에는 마인드스톰으로 국내 로봇 대회에서 입상하며 국가대표로 선발되어 세계 대회에도 출전했습니다.

 

그리고 대학원에서 로봇공학을 전공하면서 다시 로봇을 접하게 되었는데, 제가 예상했던 로봇과는 많이 달랐습니다. 단순한 알고리즘을 구현하는 수준이 아니라, C++ 프로그래밍과 수많은 수식을 이해해야 했습니다. 특히 변수가 무엇이고 함수가 무엇인지조차 모르는 상태에서 복잡한 로봇 소스 코드를 읽고 수정하며 연구와 논문 작성까지 해야 한다는 점이 큰 도전이었습니다.

 

다행스럽게도 ROS(로보틱스 오퍼레이팅 시스템) 덕분에 소스 코드를 크게 수정하지 않고 로봇 파라미터만 조정하는 방식으로 연구를 이어갈 수 있었습니다. (이 경험이 훗날 또 다른 시련이 될 줄은 몰랐습니다.) 좋은 연구실과 환경 덕분에 여러 로봇·자율주행 과제를 진행할 수 있었고, 이를 계기로 좋은 회사에 입사할 기회도 얻게 되었습니다.

 


 

현업에서의 시행착오와 성장

현업은 대학원 연구와 매우 달랐습니다. 개발 로직뿐 아니라 소프트웨어 라이선스, 개발 프로세스, 협업 방식 등 모든 것이 처음 접하는 환경이었습니다. 같은 분야의 선배조차 없던 상황에서 스스로 수많은 시행착오를 거치며 프로그래밍을 익혀야 했고, 한 달~두 달에 한 번씩은 코드 리팩토링을 해야 했습니다. 또한 상용화를 목표로 하는 프로젝트에서는 오픈소스를 마음대로 사용할 수 없다는 현실도 마주해야 했습니다.

 

이후 자율주행 회사로 이직하며 자율주행 소프트웨어 설계와 개발을 총괄하는 소프트웨어 아키텍트가 되었습니다. 팀의 규모가 커지면서 알고리즘 엔지니어 가이드, 소프트웨어 설계, 유지 보수, 협업 프로세스 개선 등을 총체적으로 담당했습니다. 그 결과 팀의 생산성이 크게 향상되었고, 기존 프로그램을 개선해 1달 걸리던 작업을 1주일로 단축시키는 큰 성과를 거두었습니다. 바닥부터 소프트웨어를 직접 설계하고 구현해본 경험은 저에게 또 다른 세계를 열어주었고, 문제 해결 능력과 개발 효율성이 비약적으로 상승했습니다.

 


 

더 많은 사람을 돕고 싶은 마음

저는 이러한 지식과 노하우를 더 많은 사람들에게 나누고 싶었습니다. 이미 많은 개발 강의와 서적이 있지만, 실제 프로젝트에서 얻을 수 있는 ‘경험과 실전 적용’이라는 측면은 부족하다고 느꼈습니다. 물론 제 경험이 정답은 아닙니다. 하지만 비슷한 분야에서 개발하고자 하는 분들에게는 크게 도움이 될 것이라 확신합니다.

 

오픈소스를 사용하는 것과 제로베이스부터 처음부터 모든 것을 직접 개발해보는 것은 전혀 다른 경험입니다. 특히 실무를 목표로 하는 엔지니어라면, 처음부터 개발해보는 경험이 성장과 능력 향상에 얼마나 큰 영향을 미치는지 체감할 것입니다. 저 역시 회사에서 일하던 중 “회사 안에서의 개발 설계·가이드만으로는 100명도 채 도울 수 없겠구나. 교육을 통해 훨씬 더 많은 사람에게 개발 생산성을 높이고 잘못된 방향으로 시간 낭비하는 것을 줄여줄 수 있지 않을까?”라는 생각을 하게 되었습니다.

 

그렇게 회사를 떠나 1년간 여러 시행착오를 거친 끝에, 이제 여러분 앞에 서게 되었습니다.

 


 

함께 만들어가는 좋은 개발 환경

좋은 개발 환경을 만들기 위해서는, 좋은 것을 이미 갖고 있는 사람이 그것을 널리 공유하고 전수해야 합니다. 저는 현업에서 실무 개발과 개발 가이드를 직접 경험하면서 노하우를 쌓았습니다. 이제 이 모든 것을 공개하여, 여러분이 원하는 프로그램을 개발할 수 있도록 도와드리고 싶습니다. 저는 더 이상 경쟁자가 아닌, 여러분을 응원하는 사람입니다. 숨길 노하우도 저만의 킥도 없습니다. 제가 아는 모든 것을 알려드릴 테니, 개발 과정에서 어려운 점이 있다면 언제든 ‘개발 대장’에게 물어봐 주세요.

 

앞으로 여러분이 좋은 프로그램을 개발하는 방법을 알려드릴 수 있길 바랍니다. 함께 즐거운 개발 생활을 이어가길 기대하며, 이만 인사를 마칩니다.

 

감사합니다.

개발 대장 양은성 드림


PROFESSIONAL EXPERIENCE


2023.06 - Present

Chief Executive Officer | HolyGround

2021.12 - 2023.05

Visual SLAM Software Architect | Visual Positioning Team | StradVision

  • 자동 주차 위치 인식을 위한 Visual SLAM(vSLAM) 소프트웨어 개발/소프트웨어 아키텍트

    • 산업 표준(MISRA C++ 2008) 준수하는 C++ 프레임워크를 제로 베이스에서 설계 및 개발

    • 팀 내 생산성 4배 이상 향상 (기능 개발 기간: 2개월 → 2주 이하)

    • 개발 스타일, 설계, 협업 가이드 문서 작성 및 팀 내 적용

2019.01 - 2021.12

Perception Part Tech-Lead | LMDR Algorithm Team | Robotis

  • 배송 로봇을 위한 인지 소프트웨어 개발/Tech-lead

    • Embedded Platform(Nvidia Jetson)에서 CUDA를 사용하여 병렬 가속화 개발

    • ROS를 사용하지 않고, C++ 멀티 스레드 시스템 프레임워크를 설계 및 개발

    • 높은 수준의 자동화 스크립트를 통한 개발환경 셋업 자동화 적용

LECTURING EXPERIENCE


2023 - Present

readable_code::cpp::코어_개발환경_설정 - 따라하면 끝나있는 C++ 개발환경 설정의 A to Z

readable_code | Inflearn

2023 - Present

readable_code::cpp::build_system::modular_project_with_cmake - OS/Platform 종속성 없이 fancy하게 C++ project 만들기

readable_code | Inflearn

2023.08 - 2023.09

Python Basic Grammar 교육

서울ICT이노베이션 특성화고등학교 AI교육 | 한국디지털융합진흥원

2023.12

프로처럼 개발하기 - C++ 개발 process

[2기] K-Digital Training: 프로그래머스 자율주행 데브코스 (Planning&Control) | Programmers

2023.01 - 2023.09

C++ Coding Guideline 특강

[3기] K-Digital Training: 프로그래머스 자율주행 데브코스 (Perception) | Programmers

[5기] K-Digital Training: 프로그래머스 자율주행 데브코스 (Perception) | Programmers

[1기] K-Digital Training: 프로그래머스 자율주행 데브코스 (Planning&Control) | Programmers

2023.09

개발환경 설정/Build System/Code Quality Improvement 특강

[1기] K-Digital Training: 프로그래머스 자율주행 데브코스 (Planning&Control) | Programmers

2023.09

Development environment setting for C++ 특강

[6기] K-Digital Training: 프로그래머스 자율주행 데브코스 (Perception) | Programmers

2023.09

Build System for C++ Modular Project 특강

[6기] K-Digital Training: 프로그래머스 자율주행 데브코스 (Perception) | Programmers

2024.03

포트폴리오 작성 특강

SSAFY(Samsung Software Academy For Youth) | Samsung

EDUCATION


2017.03 – 2019.02

Ph.D. candidate in Engineering | Control and robot engineering | Chungbuk National University

2014.03 – 2017.02

Master of Engineering | Control and robot engineering | Chungbuk National University

2009.03 – 2014.02

Bachelor of Engineering | Information and Communication Engineering | Chungbuk National University

COMMUNITY


Readable Code | 방장 | 카카오톡 오픈채팅

더보기

커리큘럼

전체

16개 ∙ (4시간 51분)

해당 강의에서 제공:

수업자료
강의 게시일: 
마지막 업데이트일: 

수강평

아직 충분한 평가를 받지 못한 강의입니다.
모두에게 도움이 되는 수강평의 주인공이 되어주세요!