C++ 썸네일형 리스트형 Rust 배우기2 - 심화 들어가기 심화에서는 좀더 Rust를 깊게 들어갈려고 한다. 이글에서는 오프라인에서 Cargo를 사용할 예정이다. 그렇기 때문에 사전에 Cargo 설치가 필요하다. 구글링해서 검색하거나 참고[3]을 참고하시기 바란다. 이글에서는 Cargo 설치에 대해서는 다루지 않는다. 이제부터 Rust에 대해서 좀더 깊게 들어가보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ Cargo Cargo는 Rust의 빌드 시스템 및 패키지 매니저이다. 코드 빌드 및 라이브러리 다운로드 및 설치를 수행한다. 먼저 Cargo로 프로젝트 관리하는 방법을 간단히 살펴보자. 프로젝트 생성 먼저 hello_cargo 프로젝트 생성해보자. $ cargo new hello_cargo --b.. 더보기 Rust 배우기1 - 기본 들어가기 이전부터 Rust 언어를 들어었지만 관심을 가지기 시작한 시점은 마이크로소프트가 핵심 코드를 Rust로 작성한다는 소식을 알게되었을 때이다. 러스트가 시스템 프로그래밍에도 사용할 수 있는 언어이고 C++을 대체하고 있다고 한다. 평소에 C++에 관심이 있어서 이번 기회에 한번 Rust을 정리하고 갈려고한다. 이전에 Kotlin을 정리했을 보다 시간이 다소 걸리에 시간을 두고 접근해야 한다. 기본에서는 가급적 Rust 언어 자체에 집중하고 표준 라이브러리에 대해 가급적 다루지 않을려고 한다. 또한 포인터와 참조에 대해서 어느정도 이해하고 있다고 가정하고 최대한 간략하게 설명하고 가급적 예제 중심으로 기능을 설명하려고 한다. 작성자: ospace114@empal.com, http://ospace.t.. 더보기 [c++] std::async와 std::thread 사용하기 들어가기 이 글은 C++에서 비동기 전체를 다루지는 않는다. 이미 thread 작동 방식이나 사용에 대해서는 어느정도 알고 있다고 가정한다. std::thread와 std::async에 대한 간단한 사용법과 각 자원 해제시 주의점, 몇 가지 고려할 점을 정리했다. 작성자: ospace114@empal.com, http://ospace.tistory.com/ 맛보기 비동기 처리에 있어서 std::thread와 std::async을 사용하는 방법이 있다. std::thread와 std::async은 결과는 같지만 실제 동작과 인터페이스가 조금씩 다르다. std::thread는 스레드 기반(thread-based) 프로그래밍이고 std::async는 과제 기반(task-based) 프로그래밍이다. std::t.. 더보기 [c++] 람다식 사용하기 들어가기 가장 유용하지만 가능 신경써야할게 많은 람다식이다. C++14에서는 auto로 인해 더 사용이 용이해졌다. 그러나 사용할 때 주의해야할 점이 있다. 하나씩 살펴보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ 람다식 람다식의 기본형은 다음과 같다. ["capture 절"]("인자목록") "추가사양" "예외사양" -> "반환형식" { "몸체" } capture 절: 해당 범위에서 액세스 또는 복사할 변수를 지정한다. 만약 없다면 “[]”만 사용하면 된다. 또한 기본 모드를 지정할 수 있다. “[&]”을 사용해 해당 범위의 모든 변수를 참조할 수 있고 “[=]”를 사용해 모든 변수를 복사해서 값을 사용할 수 있다. 또는 개별로 지정하거나 기본 모드.. 더보기 [c++] 보편참조와 오버로딩 들어가기 보편참조는 왼쪽 참조와 오른쪽 참조를 모두 받는 참조이다. 이런 보편참조는 보통 템플릿 함수를 사용해서 구현한다. 단순히 모든 참조만 받는 용도로만 쓰면 유용하지만, 그렇지 않는 상황이 발생한다. 보편참조를 사용할 때 문제점을 알아보고 이를 해결하는 방법을 살펴보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ 보편참조 사용자 이름을 목록에 추가하는 아주 일반적인 함수가 있다. std::multiset names; void addName(const std::string& name) { names.emplace(name); } 함수 자체는 크게 문제가 없지만 비효율성이 있다. 다음 실행 예를 보자. std::string myName("Foo"); .. 더보기 [c++] std::move와 std::forward 사용하기 들어가기 c++11에서 std::move와 std::forward는 왜 사용하는지 이해하기 힘들었다. 어쩌면 오른쪽 참조를 많이 사용하지 않아서? 혹시 보편참조가 무서워서 사용하지 않아서인가? std::move와 std::forward을 왜 사용하는지 이해하고 어떻게 사용할지 알아보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ std::move std::move의 역활은 단순하다. 오른값으로 캐스팅하는 함수이다. 아래 처럼 일반적인 왼값도 오른값으로 캐스팅할 수 있다. void f(Box&& box) {} Box box; f(std::move(box)); // 오른값 참조 호출 std::move의 동작방식을 이해하면 좀더 쉽게 이해할 수 있다. C++.. 더보기 [c++] 특수 멤버함수 사용하기: 복사 생성자/배정 연산자, 이동 생성자/배정 연산자, =default, =delete 들어가기 컴파일러가 정의되어 있지 않다면 자동 생성하는 특수 멤버함수(special member function)가 있다. 기본 생성자, 소멸자, 복사 생성자, 복사 배정 연산자, 이동 생성자, 이동 배정 연산자 들이다. 이동 생성자(move constructor)와 이동 배정 연산자(move assignment operator)는 C++11에서 추가되었다. 이들 특수 멤버 함수 자동 생성과 구현시 서로 간에 어떤 영향이 있는지 살펴볼려고 한다. 작성자: ospace114@empal.com, http://ospace.tistory.com/ Box 클래스 먼저 간단한 Box 클래스를 만들어보자. 단순 값 한개를 관리하게 최대한 단순하게 정의했다. class Box { public: int getValue(.. 더보기 [c++] override, const_iterator, noexcept, constexpr 사용하기 들어가기 이번에는 C++11에서 override, const_iterator, noexcept, constexpr에 대해서 살펴보자. 작성자: ospace114@empal.com, http://ospace.tistory.com/ override 선언 C++11에서는 파생 클래스(derivered class)에서 기반 클래스(base class)의 가상 함수를 재정의(override)할 때에 함수에 override을 붙인다. 기존에는 잘못으로 인한 잠재적 오류 가능성이 있다. override을 사용해서 명시적으로 지정하여 조건에 맞지 않으면 에러가 발행하도록 한다. 실제 사용 예를 보자. class Base { public: virtual void mf1() const; virtual void mf2();.. 더보기 이전 1 2 3 다음