C++ 코리아 세미나는 저번에 간 이후 두어번정도 빠졌다고 생각했는데 블로그에 올려놓은거 보니까 그새 3번이나 더 했었던걸 보고 좀 쇼크였습니다. 일단 이번에는 저번처럼 듣고 싶은 강연도 빼먹고 스탭 일을 하진 않았는데 다른 일(회사 일...)로 좀 바빠서 3, 4번째 세션은 못들었고 1, 2, 5번째 세션만 들었습니다. 오래간만에 만난 사람들도 있고 세미나 내용도 알차고 좋았지만 전부 듣지 못한게 좀 아쉬웠네요. 이번에는 케이터링 없이 도시락으로 점심이 제공되었는데 먹는 사람 입장에서는 깔끔하게 먹고 정리할 수 있어서 맘이 편했습니다. 끝나고 정리 조금 돕고 구의 사는 친구좀 만나서 저녁 같이 먹고 집에 돌아왔습니다. 별로 뭐 한것도 없으면서 다리가 아프네요.
[세미나 시간표]
아래는 세미나 내용을 들으면서 대강 정리한 노트입니다. 잘못된 내용이 있을 수 있습니다.
Session 1. Strong Type in C++ (박재영)
침팬지와 인간의 차이 : 기억력 vs 추상력 ( 은하수를 여행하는 히치하이커를 위한 안내서 )
과한 추상의 문제. 컴파일러는 sec이나 msec이나 int 형태의 데이터로만 구별 가능하다. 따로 태그를 붙여주지 않는 이상. 이를 해결하기 위한 방법으로 새로운 Strong Type을 구현할 수 있음. (struct 선언 등. 대표적으로 std::chrono) sec/msec을 단순 단위가 아니라 각각의 타입으로 만드는 것이나 isExists(std::string)이 아닌 isExists(File), isExists(Directory)로 만드는 것을 대표적으로 예시로 들 수 있음.
장점
Type Safety : 문법적 문제가 없던 잘못된 사용을 컴파일러가 문법적인 문제를 찾을 수 있도록 만들어 줌
Readability : 함수 명을 바꿔가며 여러 함수를 맞출 필요 없이 함수 오버로딩을 통해 간결하고 가독성있는 코드를 작성 가능.
Testability : Partial{isExists(std::string)}한 함수를 Total한 함수{isExists(File)}로 만들 수 있음. (std::string 속에는 파일명이 아닌 다른 데이터도 들어갈 수 있음). 덕분에 테스트 시 std::string의 모든 데이터를 테스트하지 않아도 되고 File 타입만 신경쓰면 되므로 Testability의 향상도 기대 가능.
Reusability : std::variant, std::visit 함수 등을 사용 가능해짐. 이부분은 공부 필요.
std::get, std::apply 등 미리 정의된 라이브러리 함수(ToolBox라고 표현하심)를 꺼내 쓰기 편해짐
한계(단점)
수 많은 타입을 다 설계해야 한다
컴파일 에러, 디버깅의 어려움. 바이너리가 쉽게 깨짐.
std::variant에는 담을 수 있는 타입에 최대 50개정도의 한계가 있음.
Over Abstraction과 Under Abstraction 사이에서 올바른 추상화를 찾아가야 함.
Session 2. 천하제일 C++ 최적화 퀴즈대회 (주준량)
iterator에서는 ++iter이 iter++보다 성능 면에서 효율적이다. iter++의 경우 operator++에서 값을 복사한 후 리턴하기 때문에 괜히 iterator의 복사가 한번 더 일어나기 때문.
iterator에서 순차적 접근 시 List 보다 Vector가 더 빠름. vector의 iterator는 List의 iterator와는 달리 다음 객체를 참조할 필요 없이 바로 데이터의 포인터를 증가시켜 접근하기 때문.
inline 함수는 일반 함수보다 성능이 훨씬 뛰어나질 수 있다. inline 함수는 call을 만들지 않고 함수의 몸통을 그대로 복사, 붙여넣기하는 함수. 인라인 함수의 경우 함수의 몸통이 합쳐지면서 컴파일러가 그 내부에 들어 있는 상수 변수를 최적화할 수 있게 해주기 때문에 최적화 결과가 더욱 좋게 나온다. (함수 프롤로그 및 에필로그가 발생하지 않는 장점은 덤)
|(Bitwise) 와 ||(Logical) 연산자의 차이. Logical은 비교의 순서가 매우 중요하기 때문에 하나하나 비교를 진행하지만 Bitwise 연산자의 경우 한번에 벡터라이징하여 비교가 가능하기 때문에 비교 초반에 True가 나오는 케이스가 아닌 이상 대부분의 경우 Bitwise가 훨씬 더 빠름.
std::move를 통해 객체를 새로 만들어서 리턴할 경우 기존에 있던 객체와 다른 객체가 새로 만들어져 리턴되기 때문에 std::move를 사용하지 않고 바로 리턴하는 방식이 더 빠르다(?)
Session 5. 채팅 서버 개발로 알아보는 C++의 기능들 (최흥배)
C++ 네트워크 프로그래밍 학습 시 IOCP를 적극 추천함. 비동기 IO, 멀티스레드 프로그래밍 공부하기 매우 좋음. 실제로 국내 게임서버 대다수는 C++과 IOCP를 이용하여 개발되어있을 것. 나온 지 20년 가까이 된 기술이기 때문에 한글로 정리된 자료도 많음.
IOCP의 특징
비동기 I/O 네트워크 프로그래밍이 가능
함수 7여가지만 가지고도 간단한 개발이 가능할 정도로 쉬움 (함수 개수가 적은 만큼 막상 쓰려면 복잡할 수 있음)
이외의 내용들은 대부분 모던 C++의 기능들(std::mutex, std::lock_guard, lambda 등)이나 STL을 이용하여 Multi-Thread 처리, 안정적인 메모리 관리 등을 하는 방법에 대한 내용이었음.