반응형

SW/C++ 87

C++ : 템플릿 프로그래밍 : 기본 개념, 예제, 활용방법, 주의사항

템플릿 프로그래밍 java와 C#에서의 제너렉 메서드 / 클래스와 유사합니다. STL 컨테이너 또한 템플릿으로 구성되어 있습니다. 덕분에 코드를 자료형마다 중복으로 장석하지 않아도 됩니다. 함수 템플릿 template T Add(T a, T b) { // ... } template T Add(T a, T b) { // } 함수 템플릿을 호출할 때 템플릿 매개변수를 생략할 수 있습니다. typename vs class 차이가 무엇일까요? 사실상 큰 차이는 없다고 합니다. 그냥 typename을 사용해도 무방합니다. 템플릿은 어떻게 동작할까요? 템플릿을 인스턴스화할 때마다 컴파일러가 내부적으로 코드를 생성합니다. 템플릿에 넣는 자료형 가짓수에 비례해서 exe 파일 크기가 증가합니다. 예시 class MyIn..

SW/C++ 2020.04.20

C++ : 가변 인자 템플릿 : 장점, 사용법, 예제, 개념

가변인자 템플릿 printf() 함수는 몇개의 매개 변수든 받을 수 있습니다. 템플릿 프로그램ㅇ에서도 똑같이 할 수 있습니다. 이것을 가변 인자 템플릿이라고 합니다. 다양한 매개변수 개수와 자료형을 지원하는 클래스 또는 함수 템플릿을 의미합니다. 매개 변수 목록에서 생략 부호(...)를 씁니다. 가변 인자 템플릿 클래스 template (Arguments... args) { } std::make_unique() 가변 인자 템플릿을 사용하는 대표적인 클래스는 바로 make_unique() 함수입니다. 매개변수가 얼마나 많이 나오는 지에 대해 알 수 없기 때문에, 활용되다는 것을 알 수 있습니다. 또 추가적으로 share_ptr에서도 활용되고 있다는 것을 알 수 있습니다. 가변 인자 템플릿 활용 활용법을 생..

SW/C++ 2020.04.19

C++ : module : 모듈 시스템 개요, 사용 방법, 장단점

모듈 시스템 C++17 까지도 여전히 표준으로 들어오지 않았습니다. 허나 비주얼 스튜디오에서 experimental:module 플래그를 활성화해서 사용할 수 있습니다. 표준이 된다면 컴파일이 엄청나게 빨라진다고 합니다. cpp와 h 파일로 나눌 필요가 없어지며, 이것은 컴파일 속도를 높이기 위한 것이었습니다. 마치 Java의 패키지 처럼 동작합니다. 여전히 앞에 시련이 있습니다. cpp와 h가 둘 다 있는 레거시 코드들은 앞으로 어떻게 처리를 해야할까요. 또한, #define을 활용한 코드들이 많이 있는 경우에는 어려움이 있을 수 있습니다. module Math; export int Add(int a, int b) { return a+b; } export int Multiply(int a, int b)..

SW/C++ 2020.04.18

C++ : filesystem : 파일 복사, 디렉터리 이동, 바꾸기, 삭제, 목록, 권한 : 예제

파일 복사하기 namespace fs = std::experimental::filesystem::v1; int main () { fs::path originalTextPath = "C:\\examples\\myRank.txt"; fs::path copiedTextPath = "C:\\examples\\copiedMyRank.txt"; fs::path originalDirPath = "C:\\examples\\folder"; fs::path copiedDirPath1 = "C:\\examples\\copiedFolder1"; fs::path copiedDirPath2 = "C:\\examples\\copiedFolder2"; fs::copy(originalTextPath , copiedTextPath); ..

SW/C++ 2020.04.16

C++ : filesystem : 라이브러리 개요, 사용법, 예제, 특징

파일시스템 C++17의 새로운 라이브러리입니다. C++14나 그 전에는 파일 시스템과 같은 구성 요소에 대해 연산할 방법이 존재하지 않았습니다. 이 라이브러리는 파일 읽기와 쓰기에 관한 라이브러리가 아닙니다. 파일 속성 변경, 디렉터리 순회, 파일 복사 등에 관한 라이브러리라고 생각하면 됩니다. 이 모든 걸 이 라이브러리에서 활용할 수 있습니다. 파일시스템 연산 플랫폼 공통적인 방법으로 경로를 합쳐야 합니다. 또 파일과 디렉터리를 복사, 이름 바꾸기, 삭제 등을 할 수 있어야 합니다. 디렉터리에서 파일, 디렉터리 목록을 가져와야 합니다. 파일 권한 읽기 및 설정, 파일 상태 읽기 및 설정이 가능합니다. #include namespace fs = std::experimental::filesystem::v1..

SW/C++ 2020.04.15

C++ : 헤더파일 초기화 : 정적 변수, 정적 상수 : 사용법, 활용법, 팁

class Vector { // ... private: int mX = 0; // not error int mY = 0; // not error const static int mDimension = 2; // not error static int mCount = 0; // error } 클래스 멤버 변수를 선언할 떄, 위와 같이 선언이 가능합니다. 다만, 정적 변수를 선언하는 것은 아직 지원하지 않는다고 합니다. class Vector { // ... private: static int mCount; }; int Vector::mCount = 0; 따라서 정적 변수를 만족시키기 위해서는 위와 같이 선언하고 활용해야 합니다. 그렇다면 이러한 클래스 변수 선언 방식들을 적극적으로 활용해도 괜찮을까요? 선별적..

SW/C++ 2020.04.14

C++ : enum class : enum과 차이점, 장점, 사용법, 반복문 예제

Enum C에서도 Enum을 다루기도 합니다. 좋은 점이 많지만, C에서는 타입을 비교할 때, 정수형태로 비교를 하기 떄문에 문제가 있었습니다. enum class enum class를 활용하면, 다른 enum 끼리 타입을 비교하거나, 정수 형태로 초기화하는 것을 방지해줍니다. 즉, C++11에서 제대로 지원되는 것입니다. 정수형으로의 암시적 캐스팅이 존재하지 않습니다. 자료형 검사를 진행하며, 또한, enum에 할당할 바이트 양을 정할 수 도 있습니다. #include enum class eScoreType : uint8_t { Assignment1, Assignment2, Assignment3, Midterm, Final = 0x100, }; // 경고를 알림 enum class로 정수형을 명시하는 ..

SW/C++ 2020.04.13

C++ : 고정폭 정수형 : 기본 자료형과 차이, 필요성

기본 자료형과 바이트 크기 기본 자료형들의 바이트 크기는 얼마일까요? 사실 이러한 바이트의 크기는 표준으로 제공되지 않습니다. 따라서 컴파일러마다 개발자들마다 상이한 의견들이 존재하였습니다. 고정 폭 정수형 C++11에서는 이제 지원되게 되었습니다. int8_t / uint8_t int16_t / uint16_t int32_t / uint32_t intptr_t / uintptr_t 이 외에도 많이 존재합니다. 가독성 향상을 위해 낡은 기존 자료형보다 이러한 자료형들을 활용해야 합니다. 특정 플랫폼에 국한되지 않고 고정폭으로 작업할 수 있어 오류의 여지를 줄일 수 있습니다.

SW/C++ 2020.04.12

C++ : final, override : 사용방법, 예제, 개념, 활용방법

final final 키워드로 클래스 상속을 막을 수 있습니다. 또한, 상속받은 클래스를 final 키워드로 추가 상속을 막을 수 있습니다. final 키워드로 함수 상속을 막을 수 있습니다. 클래스나 가상 함수를 파생 클래스에서 오버라이딩 못 하도록하려면 final 키워드를 사용합니다. 컴파일 도중에 확인이 가능합니다. 당연히 가상 함수가 아니면 쓸 수 없습니다. override 실제 오버라이드인지 아닌지를 지정해주어서, 명확하게 구현이 가능해지게 해줍니다. 잘못된 가상 함수 오버라이딩 막으려면 override 키워드를 사용합니다. 당연히 가상 함수가 아니면 쓸 수 없습니다. 컴파일 도중에 해당 문제들을 잘 잡아줍니다. #pragma once #include namespace samples { clas..

SW/C++ 2020.04.09

C++ : default 와 delete : 사용방법, 활용방법, 장점

default 해당 키워드를 사용하면, 컴파일러가 특정한 생성자, 연산자, 소멸자 등을 만들어 낼 수 있습니다. 비어 있는 생성자나 소멸자를 구체화할 필요는 없습니다. 기본 생성자, 연산자, 소멸자를 더 분명하게 표실할 수 있습니다. 명확하게 표현하는 것은 가독성을 높여 좋습니다. delete 컴파일러가 자동으로 생성자를 만들어 주길 원치 않는다면 delete 키워드를 사용합니다. private 접근 제어자로 빈 생성자를 만드는 트릭은 이제 사용할 필요가 없습니다. 에러 메세지도 올바르게 출력됩니다. 베스트 프랙티스 컴파일러가 코드를 생성하는 암시적 방식에 기댈 필요가 없어졌습니다. 명확하게 선언해줍니다. 어디에나 default나 delete 키워드를 넣어주도록 합니다.

SW/C++ 2020.04.08

C++ : static_assert 와 assert : 차이점, 활용법, 적용 방법

assert assert 기존 함수는 조건이 false면 실행을 멈추어줍니다. 즉, 실행 중에 가정이 맞는 지 평가합니다. 오직 디버그 빌드에서만 동작합니다. 실패한 assert를 보려면 반드시 프로그램을 실행해야 합니다. 모든 코드 경로가 실행되었다고 어떻게 장담할 수 있을까요? 일부 가정은 프로그램을 실행하기도 전에 알 수 있습니다.모든 곳에 assert를 쓰는 것은 여전히 유효한 조언 중 하나입니다. static_assert 컴파일 중에 가정을 평가합니다. 컴파일러가 assert 조건이 참인지 아닌지를 아는 것입니다. 실패하면 컴파일러는 컴파일 에러를 뱉습니다. 많은 경우에 유용합니다. C++11에서 선호하는 기능 중 하나입니다. 버전 확인, 배열의 길이, 메모리 크기 등을 검증할 떄 활용할 수 있..

SW/C++ 2020.04.06

C++ : auto : 반복자, 템플릿 : 사용해야 할 때, 방법 추천

auto와 반복자 반복자에는 auto 키워드가 매우 유용합니다. for (auto it = v.begin(); it != v.end(); ++it) { // } 반복자를 직접 구현해서 for문을 돌리는 것은 매우 골치 아픕니다. 만약 map을 for문 돌리때에는 더더욱 골치아픕니다. 이러한 것들을 auto를 활용하면 타이핑도 줄이고, 매우 간결해집니다. auto와 템플릿 MyArray* a = new MyArray(10); auto* a =new MyArray(10); 일부 템플릿에서도 마찬가지입니다. 누가 보아도 알 수 있는 타입인지 알 수 있는 경우에는 auto를 활용해도 무방하다고 할 수 있습니다. 베스트 프랙티스 auto보다 실제 자료형 사용을 권장합니다. 다만, 템플릿 매개변수와 반복자에는 au..

SW/C++ 2020.04.05

C++ : auto : const 형 받기, 함수 반환형 받기 : 활용법, 주의사항, 팁

auto로 const 받기 const int b = 1; auto& a = b; auto는 const를 이어 받습니다. 컴파일러가 알아 낼 수 있기 떄문입니다. 하지만, const인지 아닌지, 개발자가 구별하기 어려워, 가독성이 떨어질 수 있습니다. 따라서, const 참조를 받을 떄는 const auto& 를 직접적으로 선언하여 활용하는 것이 좋다고 합니다. auto와 함수 반환형 auto 키워드는 함수가 반환하는 걸 저장하는 데 때론 유용합니다. 함수 반환형이 변해도 auto는 그대로 활용되기 때문입니다. 개발시에, 반환형이 바꾸어져도 auto는 바꾸어질 필요가 없습니다. auto 키워드가 타이핑을 확실히 줄여줄 수 있습니다. 허나 가독성을 떨어트릴 수 있습니다. auto에 관해서는 모두가 동의하는 ..

SW/C++ 2020.04.04

C++ : auto : 포인트 참조 및 받기 : 사용법, 주의점

auto 키워드 자료형을 추론합니다. JavaScript 등의 언어에 있는 동적인 타입과는 다릅니다. 실제 자료형은 컴파일하는 동안 결정됩니다. 따라서, 반드시 auto 변수를 초기화해야 됩니다. 일반적인 자바스크립트와 파이썬과 활용하는 방식은 비슷하지만, 자료형이 바뀌지는 않으므로 유의해야 합니다. auto로 포인터와 참조 받기 auto를 사용하며 포인터와 참조를 받을 수 있습니다. 포인터를 받을 떄 : auto / auto* 참조를 받을 떄 : auto& Cat* myCat = new Cat("CoCo", 2); auto myCatPtr = myCat; myCat과 myCatPtr은 동일한 포인터의 값을 갖습니다. 컴파일러가 어느 형인지 알아낼 수 있기 때문입니다. 다만, 가독성이 떨어질 수 있습니다..

SW/C++ 2020.04.03

C++ : STL 알고리즘 참고 사이트 : C++03과 C++11 이후의 차이점

http://www.cplusplus.com/reference/algorithm/ - C++ Reference library Standard Template Library: Algorithms The header defines a collection of functions especially designed to be used on ranges of elements. A range is any sequence of objects that can be accessed through iterators or pointers, such as an a www.cplusplus.com STL 알고리즘 목록은 위 사이트에서 확인할 수 있습니다. 다양한, 함수들이 있다는 것을 알 수 있고, 상황에 맞게 잘 사용하면 좋..

SW/C++ 2020.04.02
반응형