CS/C++

C++ 공부 섹션20 : 홍정모의 따배씨쁠쁠 <완강>

샤아이인 2022. 1. 18.

내돈내고 내가 공부한것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼겸 상세히 기록하고 얕은부분들은 가겹게 포스팅 하겠습니다.

1) 섹션20

드디어 마지막 시간이다. 이번시간에는 C++ 내용 위주라기보다는 알고 있어야할 상식에 대하여 알려주셨다. 정리는 간단이 할 예정이다.

20-1 비쥬얼 스튜디오로 프로파일링 하기

디버그 모드에서 사용하는 진단모드에서 CPU사용량과 메모리 사용량에 대하여 배웠고, 릴리즈 모드에서 프로파일링 하면서 가장 연산량을 많이 먹는 코드를 찾아가는 법을 배웠다.

 

8:2의 법칙 : 연산량의 80%를 전체 코드의 20%가 차지하는 것 이 일반적이다. 가장 느린부분을 하나 찾아서 거기에 80%의 노력을 들여서 맞추면 전체적으로 빨리지는 경향이 있다.

 

20-2 깃, 깃헙 시작하기 Git, Github

github는 이미 사용하고 있었고, 노마드코더에서 무료강의로 얻어서 공부해본적이 있기에 기본기는 알고있었다.

 

- gitignore

우선 github에서 repository를 생성할때 gitignore이 무엇인지 오늘 처음알았다. 항상 None으로만 두고 사용했던지라 어떤 용도지는 몰랐느데 오늘 알수있어 좋았다. gitignore은 코드를 compile하다보면 부산물로 obj파일들이 생기는데 이러한 obj파일들은 compiler가 코드를 보고 만들어내는 것 이기 때문에 서버에 따로 backup을 할필요가 없다. 부산물들을 무시하겠다라는 의미로 사용한다.

 

- README

readme파일은 해당 repository에 대한 설명을 추가해주는 파일이다.

 

- Commit

내가 이걸 바꿧다라고 공개적으로 의사를 밝히는 행동이다. 어떠한 부분을 바꿧다라고 명시해두면 몇일이 지난후 다시 코드를 봐야할 때 유용하다. 사람은 모든 변경사항들을 기억할 수 없다.

 

- branch

내가 코딩을 하다보면 이부분을 다르게 바꿔보면 어떨까? 라고 생각하기 마련인데, 이렇게 생각의 가지를 펼처나가는 것을 branch라고 한다. 또한 원래 중심으로 진행해오던 것을 master branch라고 한다.

 

 

1) 계정 연동

우선 git config --global user.name "본인유저이름" 를 사용하여 나의 계정과 연동하였다.

 

2) 서버에 있는 내용 불러오기 (command: git clone 주소 )

 

결과로 서버의 파일을 복사해온것을 알 수 있다.

 

3) 폴더안에 새로운 txt를 추가해보자.

위의 사진과 같이 txt파일을 하나 추가해 주고 내용을 간단히 적어주었다.

이제 변경사항을 서버로 다시 전송해주어야 한다.

add를 통하여 add해주고 있다.

 

4) commit해주기

이번에는 commit해주기 위해서 git commit라고 command를 치면 vim에디터로 넘어가게 된다.

간단한 설명을 부가하는 부분이다.

VIM

나름 시스템 프로그래밍 한학기동안 vim만 써왔기 때문에 기본사용법은 다 숙지하고 있었다.

블로그 주인장인 내가 직접 정리해둔 vim 사용설명서가 있으니 필요한 분들은 한번씩 확인해보길 추천한다.

은근 적응하면 편한 에디터이다.

혹 vim 사용이 어려운 분이라면 일단 :q!를 입력하여 종료한후 다른방법을 통해 commit해보자.

이렇게 commit하면 아직 나의 local 컴퓨터 안에서만 commit된 것 이다.

서버에서는 변경사항을 모르고 있다. push를 해줘야 한다.

 

5) push 해주기 (서버로 보내기)

git push를 타이핑해주면 인증창이 뜬다. 인증을 완료하면 push가 성공적으로 되고, 서버에서 또한 내용이 변경된것을 확인할 수 있다.

 

6) 서버에서 변경후 가져오기

내 컴퓨터 에서 변경후 push 하는 행동의 반대되는, 서버에서 변경후 내 컴퓨터에 적용하려면 pull을 사용하면 된다.

 

7) 파일 제거

git rm 파일명 을 해주면된다.

20-3 비쥬얼 스튜디오에서 깃헙 사용하기

계정을 연동하면 비쥬얼 스튜디오 안에서도 사용할수가 있다.

그다음 밑에서 Solution Explorer을 눌러주면 다음과 같은 창이 뜬다.

그다음으로 새로운 project를 생성하면 된다. 이후 commit All and push 또는 commit All and sync를 누르면되는 sync까지 하는것을 권장하셨다.

sync까지 적용하면 commit을 한후 push해준후 다른 사람이 변경한 점이 있다면 그점을 pull까지 해주는 것 이다.

 

20-4 Vcpkg 설치 방법

개발시간을 아끼거나 외부 라이브러리를 사용하고싶은경우 open source를 많이 사용한다.

C++ 를 사용할경우 Vcpkg를 사용하면 외부 라이브러리를 사용하기가 매우 쉽다.

위의 주소로 들어가 Readme파일에 보면 빠르게 시작하기를 읽으면서 사용하면 된다.

강의에서는 boost 라이브러리를 설치하였는데 시간 진짜 오래걸리니 다른일 하면서 기다려보시길....

 

20-5 TCP IP 네트워킹 맛보기 - Boost.Asio Socket IOStream

간단한 서버 클라이언트 모델을 예시로 알려주셨다. 네트워크를 관리하는 서버가 존제하고, 우리의 컴퓨터에서 작동하는 클라이언트는 서버와 통신한다.

 

Server.cpp

#include <iostream>
#include <ctime>
#include <string>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

int main()
{
	try
	{
		boost::asio::io_service io_service;

		tcp::endpoint endpoint(tcp::v4(), 13);			// 통신용 양쪽 끝을 endpoint. 13은 port_number
		tcp::acceptor acceptor(io_service, endpoint);	// endpoint에서 io_service를 accept할 acceptor를 생성
		// acceptor와 endpoint가 연결되어있다.
		std::cout << "Server started" << std::endl;

		for (;;) // 무한루프
		{
			const std::string message_to_send = "Hello From Server"; // 서버가 클라이언트 에게 보여줄문장

			boost::asio::ip::tcp::iostream stream;	// 일반 iostream아님. overloading된 iostream

			std::cout << "check 1" << std::endl;

			boost::system::error_code ec;
			acceptor.accept(*stream.rdbuf(), ec);	// 클라이언트 접속해오면, rdbuf를 읽겠다.

			std::cout << "check 2" << std::endl;

			if (!ec) //TODO: How to take care of multiple clients? Multi-threading?
			{	// 클라이언트가 정상 접속
				// receive message from client 
				std::string line;
				std::getline(stream, line);			// 입출력 스트림에서 클라이언트로부터 메세지를 받는다.
				std::cout << line << std::endl;

				// send message to client
				stream << message_to_send;			// message를 stream으로 보냄
				stream << std::endl;				// 클라이언트 입장에서는 여기서 데이터를 읽어야 서버가 보낸다.
			}
		}
	}
	catch (std::exception& e)						// 예외처리
	{
		std::cout << e.what() << std::endl;
	}
 }
 

 

client.cpp

#include <iostream>
#include <string>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

int main(int argc, char* argv[]) // server의 주소를 입력받고있다.
{
	try
	{
		if (argc != 2)
		{
			std::cerr << "Usage : Client <host>" << std::endl;
			return 1;
		}

		tcp::iostream stream(argv[1], std::to_string(int(13))); // 인자[1] = ip주소
		if (!stream)
		{
			std::cout << "Unable to connect: " << stream.error().message() << std::endl;
			return 1;
		}

		// send message to server
		stream << "Hello from client";
		stream << std::endl; // send new-line to end receiver'stream getline

		// receive message from server
		std::string line;
		std::getline(stream, line);
		std::cout << line << std::endl; // 받은내용 출력
	}
	catch (std::exception& e)
	{
		std::cout << "Exception: " << e.what() << std::endl;
	}

	return 0;
}
 

20-6 외부 라이브러리 설치, 프로젝트 템플릿

이번시간에는 vcpkg같은 자동화된 라이브러리가 아닌, 직접 라이브러리를 설치하는 방법에 대하여 배웠다.


2) 나의 현황

● 후 완강!! 완강한 후기는 따로 게시물을 만들어 후기를 작성할 예정이다.

마지막에 조금 집중력이 풀리기는 했는데, C++이론 내용에서는 집중하여 공부했었고, 20강 처럼 그밖으 기술 맛보기 강좌들은 조금은 교양공부한다는 마음으로 간단히 공부하였다.

이글의 모든 사진과 내용의 출처는 홍정모 교수님께 있습니다.

홍정모 교수님 블로그:

 

홍정모 연구소 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

 

댓글