검색결과 리스트
분류 전체보기 에 해당되는 글 580건
- 2020.11.20 리팩토링 원칙
- 2020.11.19 C++ 11 항목
- 2020.11.19 인다이렉션
- 2020.11.19 리팩토링을 해야 할 때
- 2020.11.19 리팩토링의 정의
- 2020.11.19 서버 프로그램 흐름 만들기
- 2020.11.19 3. 데이터 통신하기
- 2020.11.19 소켓에 연결하기
- 2020.11.19 네트워크 프로그램의 흐름
- 2020.11.18 3. 만들어진 진실 - 핵터 맥도널드
- 2020.11.17 윈도우 클래스
- 2020.11.17 윈도우의 정의
- 2020.11.17 Controller Test
- 2020.11.12 Team Viewer 고정 암호 사용
- 2020.11.11 PROCESS_INFORMATIN 구조체
변수를 사용하는 부분에 있어서 가능하면 const를 사용하라
int i = 10;
for(int j = 0; j < i; ++j)
{
++i;
}
무한 루프로 돌아 논리 상의 버그이다
하지만 const int i = 10; 으로 선언하면 코드 오류이기 때문에 컴파일러가
잡아낸다
따라서 가능한 많은 경우에 const를 사용하자
explicit Annotation(const string text)
: value(move(text))
{
}
위의 코드는 에러가 난다
value에 text를 넣는데 text를 넣고 move를 하면 text에는 nullptr이 들어가는데
const로 되어 있기 때문에 변경이 안 된다
위와 같은 경우는 const를 삭제해야 한다
template <typename T>
void swap(T& a, T& b) {
T tmp(a);
a = b;
b = tmp;
}
위의 코드보다는 아래의 코드가 훨씬 효율적이다
template <typename T>
void swap(T& a, T& b) {
T tmp(std::move(a));
a = std::move(b);
b = std::move(tmp);
}
auto
변수의 자료형을 컴파일 시간에 자동으로 추론
선언시 추론된 형은 종료시까지 사용됨
대입시 자료현 변경이 안 됨
auto a = 10; // int
auto b = 1.0f; // float
auto c = 1.0; // double
auto d = "abc"; // char*
auto e = {1, 2, 3}; // std::initializer_list
auto f = { 10 }; // c++ 14까지는 std::initializer_list, c++17 부터는 int
auto g { 10 }; // int
g = 12.34; // warning C4244: '=' 데이터 손실
string h = { "abc" };
auto i = h.begin( ); // std::string::iterator
vector<int> v = {1,2,3,4,5};
//auto 키워드를 사용한 전 vector를 순회하는 반복자의 선언
for (intVector::iterator it = v.begin(); it != v.end(); ++it) {
cout << *it << endl;
}
//auto 키워드를 사용한 후 vector를 순회하는 반복자 선언
for (auto it = v.begin(); it != v.end(); ++it) {
cout << *it << endl;
}
//auto 키워드를 이용한 for loop
for (auto& value : v) {
cout << value << endl;
}
value category ( 값 유형 )
값의 분류 기준
값이 식별성을 갖고 있는가?
값이 메모리에서 이동할 수 있는가?
(gl-value, pr-value, x-value, l-value, r-value)
값 유형 값이 메모리에서 이동 값이 메모리에서 이동 X
값이 식별성을 가질 때 x - value l - value gl-value
값이 식별성이 없을 때 pr-value
(임시 변수)
r-value
int && c = 10;
r-value를 참조하는 연산자
decltype
현재 변수나 표현식의 타입을 알아낼 수 있는 명령어
int a = 10;
decltype(a) b = 2; // int b = 2;
int& x = a;
decltype(x) c = b; // int& c = b;
const int i = 4;
auto j = i; // int j = i;
decltype(i) k = i; // const int k = i;
int arr1[10];
auto arr2 = arr1; // int* arr2 = arr1;
decltype(arr1) arr3 = arr1; // int arr3[10] 으로 선언
decltype 키워드
템플릿 함수에서 어떤 객체의 타입이 템플릿 인자들에 의해서 결정되는 경우
template <typename T, typename U>
void add(T t, U u, decltype(t + u)* result) {
*result = t + u;
}
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
return t + u;
}
vector의 emplace_back( )과 push_back( )의 차이
push_back( ) 메서드
- 일반적으로 '객체' 삽입
- 객체가 없이 삽입하려면 임시 객체(rvalue) 가 있어야 함
- 암시적 형 변환이 가능하다면 인자로도 삽입
- 이는 인자를 통해 임시객체를 암시적으로 생성한 후 삽입
std::vector<myString> vecString;
myString str = "hello1";
vecString.push_back(str); // str 객체 소멸
vecString.push_back(myString("hello2")); // 임시 객체 소멸
vecString.push_back("hello3"); // 임시 객체 소멸
vecString.push_back(std::move(myString("hello4")); // 해제 안 됨
대입에 관한 이동 연산자
myString& operator=(myString&& right);
인다이렉션의 정의
- 어떤 기능을 수행하는 코드가 직접 들어 있는 것이 아니라 기능 별로 분리되어 있는 다른 메서드를 참조하는 방식
- 값 자체가 아니라 이름, 참조, 컨테이너 등을 사용해서 대상을 참조
- C 언어의 포인터, C++ 템플릿
인다이렉션의 장점
- 로직의 공유 : 두 위치에서 호출되는 하위 메서드나 모든 하위 클래스가 공유하는 상위 클래스의 메서드 등
의도와 구현을 따로 나타냄 :
리팩토링을 할 때의 문제
- 데이터 베이스
- 인터페이스 변경
- 언제 리팩토링을 하지 말아야 하는가?
마감일이 얼마 남지 않았을 때
코드를 처음부터 다시 작성해야 할 때
리팩토링과 디자인
리팩토링은 디자인을 보완
단순한 디자인을 변경하는 것은 비용이 너무 크다
100 가지 중에서 실제 문제가 발생하는 부분은
찾아서 수정 필요
1. 삼진 규칙 (세 번째로 비슷한 것을 할 때)
2. 새로운 기능을 추가할 때
3. 버그를 수정할 때
4. 코드 리뷰를 할 때
5. 깊이 있는 이해라를 위한 리팩토링
- 개발자로서 코드 기반을 더 깊이 이해하면, 보다 효과적으로 자신의 코드를 보충하거나 코드 개선 방법을 제시
품질을 고려하는 사람이면 리팩토링이 버그를 줄이고 개발 속도롤 빠르게 한다고 설득
bind 함수
소켓을 인터넷 주소에 묶어주기 위해서 사용
서버 프로그램은 어떤 포트에서 기다릴지 명시해야 함
그래야 클라이언트 프로그램은 그 포트로 찾아갈 수 있음
int bind(int sockfd, struct sockaddr* my_addr, socklen_t addrlen);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); // 어떠한 IP 든지 기다림
addr.sin_port = htons(8080);
state = bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
listen 함수
- 수신 대기열을 만든다
int listen(int queue_size);
accept 함수
- 수신 대기열에서 연결을 가져온다
int accept(int s,
이 함수를 성공하면 새로운 소켓을 만드는데 이 소켓은 클라이언트와 직접 연결된 소켓
이 소켓을 연결 소켓이라 부름
accept에서 매개변수에 사용되는 소켓은 요청을 듣기 위해 사용되는 소켓
듣기 소켓이라 부름
듣기 소켓과 연결 소켓을 구분하는 이유는 한 번에 여러 개의 소켓을 다루기 위함
동시에 2 개 이상의 소켓을 다루는 부분은 이후에 다룸
데이터 입출력
* 소켓 함수 : send, recv, sendto, recvfrom
* 파일 함수 : read, write
입력함수
- send, sendto, read
출력함수
- recv, recvfrom, write
4. 연결 종료
close(int sockfd);
closesocket(SOCKET sockfd);
클라이언트
socket() - connect() - read()/write() - close()
서버
sockete() - bind() - listen() - accept() - read()/write() - close()
인터넷 주소와 포트번호를 이용해서 원격 소켓에 연결
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen);
sockfd - 소켓을 만든 소켓 지정 번호
serv_addr - IP와 port 번호 지정
원격 소켓의 인터넷 주소 지정하기
struct sockaddr_in server_address;
server_sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("211.3.45.33");
server_address.sin_port = htons(8080);
client_len = sizeof(server_address);
connect(server_sockfd, (struct sockaddr*)&server_address, client_len);
흐름을 만들어보기
1. 송신측
소켓 생성 -> 포트 부여 -> 상대편 IP/Port 주소로 연결 -> 통신 -> 종료
2. 수신측
소켓 생성 -> 포트 부여 -> 상대편 연결 기다리기 -> 통신 -> 종료
1. 소켓 생성
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
- domain : 소켓의 사용 영역을 정의
- type : 소켓 유형을 정의
- protocol : 소켓이 사용할 프로토콜을 정의
* domain : 소켓의 사용영역 정의
인터넷 : AF_INET
컴퓨터 : AF_UNIX
* type과 protocol
TCP : SOCKET_STREAM - IPPROTO_TCP
UDP : SOCKET_DGRAM - IPPROTO_UDP
소켓 함수 사용 예
1. TCP
socket(AF_INET, SOCKET_STREAM, IPPROTO_TCP)
2. UDP
socket(AF_INET, SOCKET_DGRAM, IPPROTO_UDP)
성공하면 0보다 큰 수를 반환
이 때 반환 값은 소켓을 가리키는 값
어떠한 사실(팩트)가 있을 때 사람들은 어떻게 진실로 받아들이는 가에 대한 방법 13가지를 소개하고 있다
이것은 사람들하고 대화를 할 때도 마찬가지인데 특히 나는 맥락 부분에서 많이 부족한 점이 있어서 느낀 점이 많다
문제는 편집에 있는 것이고 어떻게 편집하느냐에 따라 어떻게 받아들이는가이고
그 목록들은 다음과 같다
1. 복잡성
2. 역사
3. 맥락
4. 통계
5. 스토리
6. 도덕성
7. 바람직함
8. 가치
9. 단어
10. 사회적 산물
11. 이름
12 예측
13. 신념
나는 지금 4장 통계 중간까지 읽었고 재미있는 부분도 많고 새로운 사실도 있으며 기존에 알던 항목도 정리된 책이라 가치가 있는 책이라 생각된다
내가 왠만하면 책을 안 사는데 이 책은 사서 소장해도 될 만한 책이라 생각이 든다
추후에 각 목록과 예시를 기록해 놓으면 나중에 도움이 될 만한 부분이 많다
모든 윈도우는 윈도우 클래스로부터 만들어진다
윈도우 클래스는 윈도우를 만들기 위한 형틀이며 생성될 윈도우의 여러가지 특징을 모아놓은 구조체이다
CreateWindow 함수는 첫 번째 인수로 전달된 윈도우 클래스로부터 만들고자 하는 윈도우의 특성을 알아내며 윈도우 클래스가 지정한 특성대로 윈도우를 만든다
CreateWindow 함수의 첫 번째 인수 lpszClassName은 지금 만들고자 하는 윈도우가 어떤 윈도우 클래스로부터 생성될 것인가, 즉 어떤 특성을 가지는 윈도우를 만들 것인가를 지정하며 생략할 수 없다
윈도우 클래스는 윈도우 생성에 꼭 필요한 정보가 있기 떄문에 윈도우 클래스 없이 윈도우를 생성하는 것은 불가능하다
button 윈도우 클래스로부터 만들어지는 윈도우는 버튼 컨트롤이 되고 First 윈도우 클래스로부터 만들어지는 윈도우는 First 윈도우가 된다
윈도우 클래스가 지정하는 윈도우의 특성에는 배경색, 커서, 아이콘 등 겉보기 모양을 지정하는 것도 있고 내부 동작들을 지정하는 것도 있는데 이 정보들 중에서 가장 중요한 것은 메시지 처리 방식을 지정하는 WndProc 함수이며 이 함수가 어떻게 작성되어 있는가에 따라 윈도우의 모양과 기능에 고유성이 부여된다
다른 말로 하면 같은 클래스로부터 만들어진 윈도우는 모양과 기능이 동일하다는 ㅁ뜻이다
프로그램 선두에서 WNDCLASS 구조체를 정의하고 RegisterClass 함수로 윈도우 클래스를 등록한 후 윈도우를 생성할 수도 있고, 아니면 "edit"나 "button"과 같이 운영체제에 미리 등록되어 있는 윈도우 클래스로도 윈도우를 생성할 수 있다
프로그램의 메인 윈도우를 만들기 위해서는 반드시 RegisterClass로 윈도우 클래스를 등록하고 CreateWindow로 윈도우를 생성하는 2단계를 거쳐야 한다
2단계로 윈도우 생성과정을 분리함으로써 하나의 윈도우 클래스로부터 여러 개의 똑같은 윈도우를 만들 수 있으며 운영체제가 미리 정해놓은 윈도우 클래스를 공짜로 쓸 수 도 있다
만약 윈도우 클래스라는 개념이 없으면 윈도우를 만들 때마다 배경색, 커서, 아이콘, 메시지 처리함수 등을 일일히 지정해야 할 것이며 CreateWindow 함수로 20개가 넘는 인수를 전달해야 하는데 이는 너무나도 귀찮은 작업이다
윈도우 : 프로그램이 출력 결과를 내보내고 사용자로부터 입력을 받아들이는 화면상의 사각 영역
세 가지 특징
1. 윈도우는 화면상에 존재한다
- 메모리상에만 내부적으로 존재하는 것이 아니라 화면상에 나타나며 사용자의 눈에 보인다. 숨겨지거나 가려지거나 일시적으로 가시영역을 벗어나는 특수한 경우도 있지만 이 경우에도 당장 보이지 않을 뿐 여전히 화면상에 존재한다
2. 그 모양은 반드시 직사각형이다
- 화면상의 좌상단 좌표를 가지고 높이와 폭이 있으며 각 변끼리 수직을 이룬다.
둥근 모양이나 세모 모양의 윈도우를 만들 수 있지만 이 경우도 나머지 부분이 투명할 뿐이지 결국은 직사각형이다
3. 윈도우는 독립적으로 사용자와 상호작용을 할 수 있다
실행 결과를 화면에 출력하거나 사용자로부터 입력을 받아들이기도 한다
윈도우가 상호작용한다는 말은 능동적인 동작을 한다는 얘기이며 메시지 처리 능력이 있다는 뜻이다. 즉 메시지 처리 함수인 WndProc을 가진다
예제들을 보면 모두 WinMain에서 CreateWindow 함수를 호출하여 윈도우를 만들고 있다
struct RPOCESS_INFORMATION
{
HANDLE hProcess; // 프로세스의 핸들
HANDLE hThread; // 스레드 핸들
DWORD dwProcessId; // 프로세스의 ID
DWORD dwThreadId; // 스레드 ID
};
운영체제는 프로세스를 생성할 때마다 프로세스들을 구분짓기 위한 ID를 할당
프로세스 핸들과 프로세스 ID의 차이점
프로세스의 핸들은 프로세스의 커널 오브젝트를 가리키기 위한 것이고,
프로세스 ID는 커널 오브젝트가 아니라 프로세스 자체를 구분짓기 위한 것이다
CreateProcess 함수를 통해서 프로세스를 생성하면 스레드라는 시스템 리소스도 더불어 생성된다
자세한 내용은 이후에 핸들 테이블에 관련된 내용을 공부하면 모호함이 사라진다