> For the complete documentation index, see [llms.txt](https://wnsgml972.gitbook.io/midas_log/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wnsgml972.gitbook.io/midas_log/contents/2018.10/10.md).

# MIDAS LOG

## go home! [:house\_with\_garden:](https://github.com/wnsgml972/midas_log)

## 10.01

### C++ 공부

#### 익명 함수 문법(Lambda)

```
  auto bar = []() -> float { return 3.14f; }; // arrow function을 이용하면 타입 명시 가능
  [a,&b] a를 복사로 캡처, b를 참조로 캡처.
  [this] 현재 객체를 참조로 캡처.
  [&] 몸통에서 쓰이는 모든 변수나 상수를 참조로 캡처하고 현재 객체를 참조로 캡처.
  [=] 몸통에서 쓰이는 모든 변수나 상수를 복사로 캡처하고 현재 객체를 참조로 캡처.
  [] 아무것도 캡처하지 않음.
```

#### vector,  `push_back vs emplace_back`

※ 실제 사용예 필자가 전에 push\_back으로 작성했던 코드이다. 이 코드는 CStationObj 임시 객체를 생성하고 그것을 push\_back에 전달하는 걸 알 수 있으며 성능을 따져봤을때 비효율적이다.(내부적으로 CStationObj의 임시 객체가 생성되고 생성자와 소멸자도 호출되기 때문)

```
void CStationObj()
{
  m_vecStationObjs.push_back(CStationObj(3, 4));
}
```

emplace\_back은 함수 원형에서 본 거와 같이 가변 인자를 받을 수 있어서 아래와 같이 인자를 넣을 수 있으며, 받은 인자를 std::vector안에서 직접 CStationObj를 생성하므로 push\_back보다 성능상 낫다.

```
void CStationObj()
{
  m_vecStationObjs.push_back(3, 4);
}
```

※ 참고 사항

* push\_back으로 하여도 컴파일러 내부적으로 최적화 하기 때문에 emplace\_back으로 하는 것과 별차이가 없을 수 있다. 고로 개인 프로젝트가 아니라면 호환성이 더 좋은 push\_back 사용이 더 나을 수도 있다.
* push\_back함수로 할 수 있는 모든 것을 emplace\_back으로 할 수 있다.
* push\_back함수보다 emplace\_back 함수가 대체로 효율적이다.

### 해야 할 것

* Feature 툴 사용, 모델링 해보기 (4)
* mday ppt 제작
* shared\_ptr 공부할 것

### 해결한 것

* Solid 기능 구현 약간

## 10.02

### 해결한 것

* MDay 발표 준비

### 해야 할 것

* Feature 툴 사용, 모델링 해보기 (4)
* mday ppt 제작
* shared\_ptr 공부할 것
* Feature Solid

## 10.04

### 해결한 것

* Feature 툴 사용, 모델링 해보기 (4)

### 해야 할 것

* Feature 툴 사용, 모델링 해보기 (4)
* shared\_ptr 공부할 것
* Feature Solid

## 10.05

### 해결한 것

* Feature Solid 하는 중

### 해야 할 것

* C++, C# ??
* shared\_ptr 공부할 것
* Feature Solid

## 10.08

### C++ 공부

#### 교차 포함 (형식 지정자가 필요합니다)

분명히 클래스를 Include 하였음에도 불구하고 오류가 난다. \
&#x20;program once에 의해 Include가 한번만 불려지기 때문, 아니면 포함하지 않았지만 간접적으로 서로를 포함한 경우 에러가 발생

```
#pragma once
class A; // class A가 존재한다고만 알려줍니다.
class B
{
public:
 A* a; // 포인터로 바꾸었습니다.
};
```

```
#pragma once
class B; // class B가 존재한다고만 알려줍니다.
class A
{
public:
 B* b;
};
```

다음과 같이 참조하는 클래스를 포인터로 선언하고, **클래스를 나중에 구현할 것이다!** 하고 선언만 해 놓으면 간단히 오류를 해결할 수 있다.

#### C++, C#, Java

* 다양한 언어가 나와서 각자의 영역을 조금씩 마련했다.
* 각각 장단점이 있고 분야에 맞게 사용하는 것이 좋다.
* 하지만 범용적으로 쓰이는 언어는 자바가 맞다.

#### Inline 함수

* 최적화에 사용
* Stack에서 컴파일러가 함수를 호출하는 대신, 그에 대응하는 함수 코드 자체를 넣는다는 것을 의미. 주소를 왔다갔다 하며 되돌아오지 않기 때문에 어떤 연산을 많이하는 함수 같은 경우에 유리.
* 컴파일러에 의해 처리가 되기 때문에 디버깅에 용이
* 근데 지금은 컴파일러가  오히려 성능에 해가된다고 판단하면 무시하기도 하고(재귀함수이거나 덩치가 큰 함수) 도움이 된다고 생각하면 일부 함수들을 임의로 인라인 처리를 하기도 함.
* 즉 인라인 자동화로 요새는 많이 사용하지는 않지만 퍼포먼스에 중요한 프로그램일 경우 생각하며 리팩토링 하는게 좋을 듯?

#### Interface

* 순수가상함수로 짜면 된다.
* 문법으로도 따로 `__interface` 라는 것이 있다.

### 해결한 것

* Feature Solid 완성!

### 해야 할 것

* shared\_ptr 공부할 것
* Feature Solid 테스트 코드 작성할 것 (구글의 gtest)

## 10.10

### gtest

#### 특징

* Google에서 개발된 C++ 테스트 프레임 워크
* Git에서 다운받아서 헤더파일 추가해서 사용
* 간단한 사용 방식은 다운 받아서, 검증해야할 부분을 검증하면 됨
* 사용하기 편하게 라이브러리를 덮어서 만들면 더 좋음, Test Fixture
* 구글에서도 실제로 사용 중 (Chrom)
* 항상 맞다고 생각하는 부분은 꼭 테스트 코드를 작성해야 함 (DB, Socket 통신 등등)
* 테스트 코드를 다 통과하더라도 버그가 없는 건 아니다.
* 사실 상 및에 참고 자료 정독하면 다 이해 됨

#### 참고 자료

* <https://www.slideshare.net/jinhwason/ss-69528881>
* <https://www.slideshare.net/zone0000/c-7522148?next_slideshow=1>
* Interior Program 구조 개선 중

### 해야 할 것

* shared\_ptr 공부할 것
* Feature Solid 테스트 코드 작성할 것 (구글의 gtest)

## 10.11

### 해결한 것

* MFC-InteriorProgram 리팩토링

### 해야 할 것

* shared\_ptr 공부할 것
* Feature Solid 테스트 코드 작성할 것 (구글의 gtest)

## 10.12

### 전체 구조 변경... 너무 안 좋은 구조 개선

![Magnetic](https://4041703324-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LczQ5sDwXTyA6y83Msj%2Fsync%2Fa1ca801b02553fa808251691a76430cdf731a43f.png?generation=1593336565728520\&alt=media)

### 해결한 것

* MFC-InteriorProgram 리팩토링
* Feature Solid 끝

### 해야 할 것

* shared\_ptr 공부할 것

## 10.15

### 전체 구조 변경

| 기존 구조                                                                                                                                                                                                            |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![structure](https://4041703324-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LczQ5sDwXTyA6y83Msj%2Fsync%2F65c37f4caaa0e1ed7204d2d389d12b81e39b93a3.png?generation=1593336573694887\&alt=media) |

| 변경된 구조                                                                                                                                                                                                           |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![structure](https://4041703324-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LczQ5sDwXTyA6y83Msj%2Fsync%2Fa48850b8c83bb42a6bbabf3a65e7445b27ea8be5.png?generation=1593336568025446\&alt=media) |

### 해결한 것

* MFC-InteriorProgram 리팩토링 중

### 해야 할 것

* shared\_ptr 공부할 것
* 개발 제품 수업

## 10.16

### 해결한 것

* MFC-InteriorProgram 리팩토링 끝!
* CIM 수업 끝!, 간단한 정리 파트 공유 폴더

### 해야 할 것

#### Interior Program 남은 기능

* Redo, Undo ( 딜리트 시 스택에 담으면 됨 )
  * 키보드 단축기
    * ctrl+z : undo ( 이벤트 처리기 리스너만 만들어놈 )
    * ctrl+y : redo ( 리스너 만들었는데 안 불림ㅠ )
* Save Load As JSon ( 저장 로드 )
  * 키보드 단축기
    * ctrl+s : 저장 ( 리스너 만들었는데 딴 거 불림 )
    * ctrl+o : 불러오기 ( 리스너 만들어야 함 )
* 마우스 우클릭 메뉴
  * Rotate ( 이벤트 처리기 리스너만 만들어놈 )
* ObjectShape
  * 추 후 Room 그룹화 고민해 볼 것
  * 이미지 크기 변환 (Wheel, Edit)
  * 사용자 추가 기능
* Group Mode??
* 재질 바꾸기
* Magnetic 보완

## 10.17

* MIDAS DB 수업

### 해야 할 것

* 수업 정리
* InteriorProgram 각종 Issues

## 10.18

* MIDAS DB 수업 (member)
* 대형 과제 첫 기획자와 회의... (예상 기간 1년...?)

### 해야 할 것

* 수업 정리
* 당분간 또 InteriorProgram 못 할듯ㅠㅠ

## 10.22

* MIDAS DB 보완 업무 80% 완성

### 해야 할 것

* MIDAS DB 보완
* Analytics Line

## 10.23

* MIDAS DB 보완 완성
* 고등 알고리즘 시험... 개망...  (알고리즘 한 문제씩 풀기 긴급...)

### 해야 할 것

* MIDAS DB 보완
* Analytics Line

## 10.24

* Clean Code
* 각종 DB 배운 것 정리

### 해야 할 것

* Analytics Line

## 10.25

* Clean Code
* SolidPhase 다시 정리

### 해야 할 것

* Analytics Line
* 사내 Doc

## 10.26

* Clean Code
* SolidPhase 다시 정리
* 사내 Doc

### 해야 할 것

* Analytics Line

## 10.29

* Clean Code
* 사내 Doc

#### TODO Comment (작업목록)

TODO 주석을 통해 앞으로의 할 일을 주석해놓고 `Ctrl + \, Ctrl + T -> (Ctrl + F, Ctrl + T)`를 이용해 작업 목록을 조회할 수 있다.

### 해야 할 것

* Analytics Line
* IFC Geometry Converter

## 10.30

* IFC Geometry Converter

### 해야 할 것

* Analytics Line
* IFC Geometry Converter
* Clean Code
* 사내 Doc

## 10.31

* IFC Geometry Converter
* MDay 준비

### 해야 할 것

* Analytics Line
* IFC Geometry Converter
* Clean Code
* 사내 Doc
