C & C++/C++

[C++] C++ 헷갈리는 개념 간단 정리 (1)

Razelo 2022. 11. 7. 15:15

1. C++ member initializer lists (멤버 초기화 리스트)

-> 생성자 괄호 뒤에 콜론으로 표시해서 초기화할 멤버 변수들을 명시해줌.

-> 간단하게 : 뒤에 쓰는건데 괄호 안에 어떻게 초기화할건지 값 명시해준다고 보면 됨. 

 

2. tcp::acceptor

-> socket에서 사용하는 acceptor와 동일한 존재이다. 

-> 말 그대로 accept 를 시작하는 녀석이다. 

-> 여기서 생성한 acceptor를 가지고 async_accept를 호출해서 비동기 accept를 시작하는 셈이다. 

 

3. tcp::socket

-> stream-oriented socket 기능을 제공한다. 그냥 socket 통신할때 필요한 변수라고 보면 된다. 

 

4. 스마트 포인터 

스마트 포인터에는 세가지 종류가 있다고 한다. 

->  unique_ptr

    포인터를 통해 unique 한 소유권을 가지고 unique_ptr 번위를 벗어날때 해당 개체를 처리한다고 한다. 

 

-> shared_ptr

아래와 같은 방식으로 사용한다. 

std::shared_ptr<int> ptr = std::make_shared<int>(10);

참고로 접근할때는 그냥 ptr 이 아니라 *ptr을 해야 10을 찍을 수 있다. 

shared_ptr 에는 reference count 개념이 있다고 한다. 

소유권이 들어날때마다 이 count 가 늘어난다고 보면 된다. 

그리고 그 count가 0이 되면 자동으로 삭제가 되서 메모리를 따로 해제하지 않아도 되는 형식이다. 

 

-> weak_ptr 

어떤 객체를 참조하는데 객체의 수명에 영향을 주고 싶지 않을때 사용하는데 그러면서도 

dangling pointer 의 잠재 위험성을 없애고 싶을 때 쓴다고 한다. 

 

5. self reference

->  self reference 는 객체 자신을 참조할 수 있는 참조자를 의미한다.

this 포인터를 사용해서 객체가 자기 자신의 참조에 사용 가능한 참조자의 반환문도 작성할 수 있다고 한다. 

(c++ 에서도 this 가 지원되는 줄은 몰랐는데 생각보다 굉장히 유연한 언어인 것 같다.) 

 

6. c++ auto 

-> 선언되니 변수의 초기화 식을 사용해서 형식을 추론하도록 컴파일레에게 지시한다. 

즉 타입 추론이 이뤄지는 거다. 그래서 초기화가 이뤄져야만 사용가능하기도 하다.

참고로 함수의 매개변수로는 사용할 수 없다. 

또한 구조체나 클래스의 멤버 변수로도 사용불가하다. 왜냐면 해당 객체의 자료형 크기를 모르기 때문이다. 

또한 가독성이 떨어질 수 있어서 적당히 사용해야 한다고 한다. (아마 쓰이는 유형이 어느정도 정해져있을 듯 싶다.)

 

7. std::move 

-> 어떤 객체 t가 이동될 수 있음을 알려준다고 한다. t가 가지고 있는 자원을 다른 객체에게 효율적으로

전달하는 것을 의미한다고 한다. 이동을 수행하는게 아니라 이동 가능함을 알려주는 것 뿐이라고 함. 

-> Lvalue 를 Rvalue로 casting 해준다고 생각하면 편함. 

개념이 아마 좀 생소할텐데 이 블로그에 굉장히 심플하게 설명되어있다.

(https://yhwanp.github.io/2019/09/08/rvalue-and-move/)

그리고 최적화에 사용된다고 보면 된다. input 이라는 string 을 할당한 변수가 있다고 했을때 이걸 vector 에 push_back 할때 그냥 input을 전달하는게 아니라 std::move(input) 을 할 경우 좀 더 성능이 좋다고 한다. 그 이유는 move assignment operator 가 일어나서라고 한다. 새로 메모리를 할당하는게 아니라 메모리에 할당된 것을 소유권만 넘겨주기 때문에 copy assignment operator 보다 빠르다고 한다. 

-> 굉장히 흥미로운 개념인데 아마 꼭 필요한 곳이 있는 것 같다. 이건 나중에 좀 더 찾아볼까 한다. 

 

8. typedef 

-> 프로그래머가 타입의 별칭을 생성하고 실제 타입 이름 대신 별칭을 사용할 수 있다. 

typedef double distance_t 라고 한다면 double a 가 아니라 distance_t a 로도 가능하다. 

주로 가독성때문에 많이 사용한다고 한다. 


C++ boost asio tcp server 예제를 읽어봐야할 일이 생겼는데 C++ 을 사용한지 오래되서 생소한 개념들이 걸린다. 

 

아래 블로그에서 많은 도움을 받았습니다.

 

감사합니다. 

 

그나저나 c++ 프로젝트 진짜 완성은 가능할까...?

 

 

https://mutpp.tistory.com/entry/Boost-echo-tcp-client-server%EB%A5%BC-%EC%82%B4%ED%8E%B4%EB%B3%B4%EC%9E%90-1

 

Boost-echo tcp client & server를 살펴보자 (1)

Boost는 C++을 하다보면 언젠간 반드시 꼭 사용하게될 라이브러리이다 Boost에 대한 설명은 아래에 첨부할 Boost 공식홈페이지에서 한번 읽어보는걸 추천한다 (재밌음) 처음에 boost를 사용할 때는, STL

mutpp.tistory.com

 

 

https://mutpp.tistory.com/entry/Boost-echo-tcp-client-server%EB%A5%BC-%EC%82%B4%ED%8E%B4%EB%B3%B4%EC%9E%90-1

 

Boost-echo tcp client & server를 살펴보자 (1)

Boost는 C++을 하다보면 언젠간 반드시 꼭 사용하게될 라이브러리이다 Boost에 대한 설명은 아래에 첨부할 Boost 공식홈페이지에서 한번 읽어보는걸 추천한다 (재밌음) 처음에 boost를 사용할 때는, STL

mutpp.tistory.com

 

https://computer-science-student.tistory.com/78

 

[c++] auto 키워드

auto 키워드 auto 키워드는 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시한다. 즉, auto 키워드를 사용하면 초깃값의 형식에 맟춰 선언하는 인스턴스(변수)의 형식

computer-science-student.tistory.com

 

https://yhwanp.github.io/2019/09/08/rvalue-and-move/

 

C++ Rvalue 와 std::move 에 대한 이해

Rvalue 란 무엇인가?Rvalue, 우측값은 대입 시에 항상 오른쪽에만 오는 식을 말한다.예제로 이해하는 것이 쉽다. 123456789101112131415int doSomething(){ ... return z;}int x = 10; // x 는 Lvalue, 10은 Rvalueint y = 20; // y

yhwanp.github.io

 

https://kevinthegrey.tistory.com/26

 

*) C++를 이용한 TCP 소켓통신 구현

서버-클라이언트 환경을 만들기 위한 과정 서버 : Socket 생성 → Socket에 이름연결(bind) → 클라이언트의 연결을 기다림(listen) → 클라이언트 받아들임(accept) → 클라이언트의 명령을 받아서 적절

kevinthegrey.tistory.com

 

https://www.codeproject.com/Articles/1264257/Socket-Programming-in-Cplusplus-using-boost-asio-T

 

Socket Programming in C++ using boost.asio: TCP Server and Client

This article will help you get started with socket programming in C++. We will build a TCP server and client using boost.asio library in C++.

www.codeproject.com

 

반응형