C++ 언매니지드 프로그래밍
실제 업계에서 쓰이는 C++ 프로그래밍의 기본기
배울 내용
- C++ 언어 사용법
- 올바른 프로그래밍 습관
- C++ 언어가 내부적으로 어떻게 도는지에 대한 이해
요구 사항
- "C 언매니지드 프로그래밍" 수료
- "개체지향 프로그래밍 및 설계" 수료
설명
본 비디오 강좌는 포큐아카데미에서 진행하는 COMP3200 수업의 비디오 강좌입니다.
C++은 C와 더불어 가장 널리 사용되는 언매니지드 언어일 뿐만 아니라 2018년 7월 기준 전세계에서 3번째로 많이 쓰이는 언어입니다. (출처: TIOBE) 그리고 언매니지드 언어라는 특수성 때문에 한동안 사용률이 떨어지지 않을 전망입니다.
현존하는 프로그래밍 언어를 크게 둘로 나누면 매니지드(Managed) 언어와 언매니지드(Unmanaged) 언어가 있습니다. 이 둘의 차이는 프로그래머가 컴퓨터 하드웨어를 직접 제어할 수 있는지 여부입니다. (예: 프로그래머가 직접 메모리를 관리하는가?)
프로그램의 성능보다 제품을 빨리 개발하는 것이 중요한 분야에서는 C#, Java와 같은 매니지드 언어를 널리 사용합니다. 하지만 운영체제, 비디오 게임, 가상현실, 주식거래소, 머신 러닝 코어, 블록체인 등 성능이 더 중요한 분야에서는 여전히 언매니지드 언어를 사용할 수밖에 없습니다. 따라서 본 강좌는 실제 업계에서 쓰이는 C++ 프로그래밍 기법에 중점을 맞춰 진행합니다.
언매니지드 언어의 장점은 여기서 그치지 않습니다. 프로그래머의 지속적인 성장에 반드시 필요한 지식 중 하나가 컴퓨터 하드웨어에 대한 이해입니다. 탑 레이서라면 자동차의 동작 원리를 잘 알아야 하듯이 탑 프로그래머는 하드웨어의 동작 원리를 잘 이해해야 합니다. 이걸 돕는 언어가 바로 언매니지드 언어입니다.
'COMP2500: Java 개체지향 프로그래밍 및 설계'와 마찬가지로 이 강좌에서도 개체지향 프로그래밍(OOP)에 대해 배웁니다. 하지만 이 코스를 성공적으로 마무리한 분들은 하드웨어 수준에서 개체지향 프로그래밍이 어떻게 작동하는지까지 자세히 이해하실 수 있을 겁니다.
본 강좌는 다음과 같이 크게 세 부분으로 나뉘며, 강의 진행도 이 순서를 따릅니다.
- 코어 C++: 참조, 클래스, 상속 등 C++의 기본이 되는 내용. C++98 표준 ( ~ 5주 차)
- 모던 C++: STL 등 C++03 표준에서 추가된 기능 중 업계에서 쓰이는 내용들 (6주 차 ~ 9주 차)
- C++1x: C++11/14/17 표준에서 추가된 최신 기능 중 업계에서 쓰이는 내용들 (10주 차 ~ )
위와 같이 강의를 세 부분으로 나눈 이유는 회사에 따라 사용하는 C++ 표준이 다르고, 성능 상의 이유로 일부러 과거의 표준을 여전히 사용하는 곳도 많기 때문입니다. 따라서 최신의 C++ 표준만을 사용하는 프로그래머는 업계에서 원하는 프로그래머가 아닌 경우가 많습니다.
이 강좌의 대상
- 컴퓨터 공학의 기본기를 배우고 싶은 분들
- 프로그래머로서 평생 커리어를 꿈꾸는 분들
강좌 콘텐츠
- OOP란? (15:19)
- OOP가 복잡해졌다! (9:07)
- 접근 제어자(Access Modifier) (6:00)
- 복습 퀴즈
- 개체 생성, 스택/힙 (17:11)
- 개체 배열 생성, 개체 소멸 (8:39)
- 멤버 변수 초기화 (5:59)
- 복습 퀴즈
- 생각할 거리: new/delete와 malloc()/free()의 차이 (1:07)
- 생성자(Constructor), 초기화 리스트(Initializer List) (8:34)
- 코드보기: Vector 클래스의 헤더 및 cpp 파일 (3:06)
- 기본 생성자, 컴파일러가 하는 일 (3:01)
- 영상 퀴즈: 둘 중 컴파일 안 되는 코드는?
- 둘 중 컴파일 안 되는 코드는? (1:27)
- 영상 퀴즈: 둘 중 컴파일 안 되는 코드는?
- 생성자 오버로딩(Overloading), 소멸자(Destructor) (9:40)
- 복습 퀴즈
- const 멤버 함수 (6:02)
- 코드보기: Vector 클래스 (2:14)
- 구조체(Struct) vs 클래스(Class) (10:46)
- 복사(Copy) 생성자 (15:26)
- 코드보기: char 배열과 복사 생성자 (2:23)
- 함수 오버로딩(overloading) (2:07)
- 영상 퀴즈
- 함수 오버로딩 매칭하기 (2:58)
- 영상 퀴즈
- 함수 매칭 순서 (4:12)
- 코드보기: 함수 오버로딩과 Vector 클래스 (4:13)
- 연산자(operator) 오버로딩 (13:18)
- friend 키워드 (13:55)
- 연산자 오버로딩과 const (14:42)
- 코드보기: Vector 클래스에서 연산자 오버로딩하기 (3:20)
- 복습 퀴즈
- 연산자 오버로딩을 남용하지 말 것 (6:45)
- 암시적 함수들을 제거하는 법 (5:17)
- 복습 퀴즈
- 정리 (2:04)
- 상속 (18:32)
- 생성자 호출 순서, 소멸자 호출 순서 (5:22)
- 코드보기: Animal, Cat, Dog 클래스 (2:54)
- 복습 퀴즈
- 정리 (1:29)
- 다형성(Polymorphism) (14:45)
- 정적 바인딩 (2:52)
- 동적 바인딩 (12:00)
- 복습 퀴즈
- 가상 소멸자 (7:21)
- 코드보기: Animal, Cat, Dog의 가상함수 (4:47)
- 복습 퀴즈
- 정리 (5:55)
- 다중(multiple) 상속 (10:16)
- 추상(abstract) 클래스 (5:38)
- 영상 퀴즈
- "인터페이스" (6:18)
- 코드보기: IFlyable, IWalkable, Bat, Cat 클래스 (1:45)
- 정리 (1:41)
- auto 키워드: 포인터 및 참조 받기 (10:59)
- auto 키워드: const 받기, 함수 반환값 저장하기 (5:16)
- auto 키워드: 반복자 대체하기, 템플릿형 받기 (6:18)
- 코드보기: auto 키워드 (3:01)
- 복습 퀴즈
- static_assert 키워드 (11:41)
- 코드보기: static_assert 키워드 (2:04)
- 복습 퀴즈
- default와 delete 키워드 (6:43)
- 복습 퀴즈
- final 키워드 (6:00)
- 복습 퀴즈
- override 키워드 (3:19)
- 영상 퀴즈
- override 키워드 2 (1:20)
- 코드보기: override 키워드 (5:12)
- 복습 퀴즈
- 보너스: offsetof 매크로 (4:05)
- 기존 포인터의 문제점 (6:41)
- 유니크(Unique) 포인터 만들기 (C++11) (7:02)
- 유니크 포인터를 사용하기 적합한 경우 (4:23)
- 유니크 포인터 만들기 (C++14 이후) (8:20)
- 유니크 포인터 재설정, 원시 포인터 가져오기, 원시 포인터 소유권 박탈하기 (6:38)
- 유니크 포인터: 소유권 이전하기 (10:29)
- 유니크 포인터: 베스트 프랙티스 (4:21)
- 코드보기: 유니크 포인터 사용하기 (5:14)
- 복습 퀴즈
- 가비지 콜렉션 1 (10:12)
- 가비지 콜렉션 2 (8:49)
- 참조 카운팅 1 (9:28)
- 참조 카운팅 2 (9:09)
- 공유(Shared) 포인터 (11:14)
- 코드보기: 공유 포인터와 단순 연결 리스트 (6:47)
- 복습 퀴즈
- 약한(Weak) 포인터 만들기 (6:04)
- 약한 포인터로 공유 포인터 만들기 (7:42)
- 약한 포인터로 순환 참조를 해결해보자 (9:56)
- 코드보기: 간단한 캐시(Cache) (8:10)
- 복습 퀴즈
- 정리 (6:41)
- 쓰레드 개체 만들기 (9:02)
- 쓰레드 기다리기 (7:13)
- 쓰레드 ID 구하기 (5:26)
- 쓰레드 떼어 내기 (4:07)
- 람다와 쓰레딩 (3:48)
- 도우미 함수들 (std::this_thread) (6:37)
- 복습 퀴즈
- 뮤텍스(Mutex): 쓰레딩의 문제를 해결해보자 (7:12)
- 흔히 하는 실수와 해결법 (6:06)
- 코드보기: 멀티쓰레딩 (3:59)
- 복습 퀴즈
- 조건 변수(Conditional Variables) (5:04)
- 흠...이렇게 쓰는거 아니에요? (7:07)
- 올바른 wait() 사용법 (7:50)
- 코드보기: 자동 재설정 타이머 (3:24)
- 정리 (3:11)