본문 바로가기
  • 쓸쓸한 개발자의 공부방

cpp39

[C++] 객체 지향 프로그래밍 OOP 객체 지향 프로그래밍 OOP 개념 OOP : Objected Oriented Programming 복소수를 표현하기 위해 double형 변수 2개를 사용 날짜를 표현하기 위해 int형 변수 3개 를 사용 사람을 표현하기 위해 이름, 나이 등의 변수들을 사용 아래와 같이 복소수 계산을 위해 input 6개를 넣어주는 함수를 만드는데 복잡하고 번거롭다. 객체 지향 프로그래밍 관점에서 Complex, Date, Person 와 같은 객체를 만들어 표현하고 싶다. // 복소수 2개를 더하고 싶다. void add( double ar, double ai, double br, double bi, // 계산에 필요한 변수 4개 (in parameter) double* sr, double* si ) // 결과 값을 담.. 2021. 8. 16.
[C++] 동적메모리 할당 (new, delete), nullptr new / delete C언어에서 메모리 할당할 때 malloc을 사용한다. 해제할 때는 free를 사용한다. C언어에서는 malloc사용시 캐스팅이 필요없다. C++에서 malloc 사용 가능하다. 그러나 반환되는 주소는 원하는 포인터 타입으로 캐스팅 해야 한다. #include int main() { int* p1 = (int*)malloc(sizeof(int)*10); // malloc 사용시 c에서는 (int*) 캐스팅 없이 사용가능하지만 // c++에서는 (int*)와 같은 캐스팅이 필요하다. free(p1); } C언어에서의 동적 메모리 할당 - new로 할당하고 delete로 해지한다. - new가 반환한 주소를 캐스팅 할 필요가 없다. - 배열 형태로 할당한 경우 delete[]로 해지 해.. 2021. 8. 15.
[C++] const reference, return by reference const reference call by value - 인자로 전달된 객체의 복사본이 생성된다. 원본 객체를 변경할 수 없기에 안전하지만 복사본에 대한 오버헤드가 있다. call by reference with const void foo (const Data& d) 복사본에 대한 오버헤드를 없애고, 안전하게 값을 사용하게 하기 위해서 const reference를 사용할 수 있다. 또한 복사 생성자와 소멸자가 호출되지 않는다. #include struct Date { int year; int month; int day; }; //void foo(Date d) // call by value void foo(const Date& d) // const reference : 안전하게 값을 넘겨 사용이 가능하다.. 2021. 8. 14.
[C++] reference 개념 c++ reference 개념 아주 기본 개념이지만 완벽하게 이해하지 않고 개발하려면 매우 혼란스럽다. reference 개념을 확실하게 이해해야 한다. c에서는 pointer의 개념, 주소의 개념이 정말 중요했다면, 추가로 c++에서는 reference 개념을 정확히 이해해야 한다. 변수 - 메모리의 특정 위치를 가리키는 이름이다. - 코드 안에서 해당 메모리에 접근하기 위해서 사용한다. 레퍼런스 - 기존 변수(메모리)에 또 다른 이름(alias)를 부여하는 것 - 아래 코드에서 n이 기존 변수 이며, r이 새로운 reference 변수 이름이다. #include int main() { int n = 10; n = 20; //int* p = &n; // 포인터 변수에서 주소를 꺼내는 방법 int& r .. 2021. 8. 13.
[C++] range-for, if init, if constexpr range-for - C++부터 지원하는 새로운 모양의 반복문 - 배열 뿐 아니라 STL의 다양한 컨테이너 list, vector, set 등 사용이 가능하다. - auto와 같이 사용되는 경우가 많다. #include int main() { int x[10] = {1,2,3,4,5,6,7,8,9,10}; for ( auto n : x ) { std::cout 2021. 8. 12.
[C++] 함수 : Lamda expression (람다 표현식) Lamda 람다 표현식은 매우 자주 사용되며 유용하기에 필수로 알아 두어야 한다. https://en.cppreference.com/w/cpp/language/lambda 일반적인 함수는 global space에 만들어 놓고 함수의 이름을 사용해서 호출한다. lamda expression (람다표현식) - 코드 안에서 이름이 없는 함수를 만들어서 사용하는 방법 - 익명의 함수 ( anonymous function), 함수 리터럴 (literal) - 함수 반환타입과 이름을 제거하고 [ ] 를 표기해 사용한다. #include void foo(int a) { std::cout 2021. 8. 11.
[C++] 함수 : constexpr function constexpr function https://en.cppreference.com/w/cpp/keyword/constexpr constexpr 상수 constexpr int c = 1; constexpr function : 함수 앞에 constexpr 이 있는 형태 - 컴파일 할 때 값을 결정할 수 있으면, 컴파일 할 때 함수를 바로 실행한다. - 함수 인자값을 컴파일 시간에 결정할 수 없으면, 실행시간에 함수를 실행한다. constexpr int add(int a, int b) { return a + b; } int main() { int x = 1; int y = 1; int n1 = add(1, 1); // 컴파일 할 때 값을 결정할 수 있으면, 컴파일 할 때 함수를 바로 실행함. int n2 =.. 2021. 8. 10.
[C++] 함수 삭제 (function delete) 함수 삭제(function delete) 지금까지 대부분은 에러를 발생시키지 않게 하기 위한 코딩을 했다면, 제대로 코딩을 하기 위해 컴파일 에러를 발생시키는(?) 함수 삭제에 대해 살펴보겠습니다. 함수 삭제 코드를 실제 본 적은 없어서 이게 왜 필요한지 잘 이해가 어려웠으나 아래 예시를 통해 이해했습니다. 함수 삭제는 간단합니다. 아래 처럼 함수 선언 뒤에 = delete;를 붙여주면 함수 삭제가 됩니다. 컴파일 과정에서 삭제된 함수를 호출하면 에러가 발생합니다. void foo(int) = delete; // 함수 삭제 int main() { foo(10); // 컴파일 에러 발생 } 왜 함수 삭제가 필요한걸까? > 암시적 변환에 의한 의도치 않은 함수 호출을 방지하기 위해서 사용합니다. 함수 삭제를.. 2021. 8. 9.
[C++] 함수 : template, inline template 타입만 다르고 구현이 동일하거나 유사한 함수의 경우 템플릿을 활용할 수 있다. 아래와 같이 square() 함수가 2개가 있을 때, 구현이 동일하기에 템플릿으로 만들어 볼 수 있다. int square(int a) { return a * a; } double square(double a) { return a * a; } int main() { square(3); square(3.3); } square 함수 탬플릿은 아래와 같은 형태로 만들어 볼 수 있다. template 의미 : 템플릿을 만들거야! 물론 type을 하나 T로 받을 거야! 하나 받으면 이 형태로 아래 형태로 만들어줘! * T는 다른 값으로도 사용이 가능하지만 약속으로 굳어져서 거의 T를 사용함. // 템플릿 사용 방법 te.. 2021. 8. 9.
[C++] 함수 : default parameter, function overloading default parameter 함수가 만들어지는 시점에 입력받는 값이 없을 경우에는 default 값이 set되게 할 수 있다. default paramater라고 말한다. c++에서는 function 정의할 때 default parameter를 지정할 수 있다. 시, 분, 초 에서 '시' 값만 입력하면 나머지 분, 초는 0로 값이 설정되게 하는 예시다. void setAlarm(int h, int m = 0, int s = 0) { // ...... } int main() { setAlarm( 3, 4, 5); setAlarm( 3, 0, 0); setAlarm( 3); // 3, 0, 0 setAlarm( 3, 30); // 3, 30, 0 } default parameter 사용시 주의사항 2가지.. 2021. 8. 8.
[C++] string : 비교, 대입, c_str() string c에서 문자열 처리 방법 직관적이지 않기에 c++에서 개선되었다. 혹은 은 c언어의 문자열 처리를 위한 헤더이다. //c에서 문자열 처리하는 방법 #include #include // int main() { char s1[32] = "hello"; const char* s2 = "world"; //s1 = s2; // 대입 : c언어는 배열의 이름을 포인터 상수로 보기 때문에 error 발생 strcpy( s1, s2); // strcpy 함수로 해결 가능 //if ( s1 == s2 ) {} // 비교 if ( strcmp(s1, s2) == 0) {} // strcmp : string compare로 비교 가능 } c++의 string에서 비교 및 대입 C++에서 String 타입이 새롭.. 2021. 8. 7.
[C++] 변수 선언 : constexpr, structure binding constexpr 컴파일 시간에 상수 값이 결정된다. (c++11 부터 도입) const 와 constexpr은 변수 값이 한 번 set되면 값을 변경을 허용하지 않는다. constexpr은 컴파일 시간에만 상수를 만들 수 있다. c++에서는 constexpr를 쓰도록 추천한다. int main() { const int c1 = 10; c1 = 20; // error constexpr int c2 = 10; c2 = 20; // error } const는 10을 바로 set해주면서 값을 지정할 수 있고, 실행시간에 알 수 있도록 n 을 우변에 넣어 줄 수도 있다. 하지만 이는 정확하지 않고 문제가 발생할 소지가 있어 c++에서 constexpr을 새롭게 소개한다. void foo( const int s).. 2021. 8. 7.
[C++] 변수 선언 : uniform initialize, auto, decltype, using c++ 변수 선언하는 방법 #include struct Point { int x = 0; int y = 0; // c++11 부터 구조체 멤버 초기화 가능해짐. }; int main() { //if ( 1 ) {} // c언어에서는 첫줄부터 변수 선언이 모두 된 이후에 코드를 넣어줬어야 했음. int n = 0; // c++에서는 중간에 변수 선언을 해도 문제없음. //struct Point pt; Point pt; // struct 사용하지 않고 바로 Point 클래스명으로 변수 선언 가능 int n1 = 0b10; // 2진수 표기법 (c++11 부터 지원) int n2 = 1'000'000; // 자릿수 표기법 (c++11 부터 지원) 사람이 읽기 좋게 하려고 사용됨. bool b = true; /.. 2021. 8. 6.
[C++] cout, cin, iomanipulator c 언어에서 사용하는 기본적인 출력 방법인 printf, scanf 를 사용한다. #include int main() { int age = 0; printf("How old are you ? >> "); scanf("%d", &age); printf("age : %d\n", age); } 아래는 c 언어에서의 printf 와 scanf 를 c++에서 사용하는 방법입니다. (물론 printf, scanf를 사용할 수는 있지만 추천하지 않는다.) C++ 입출력 std::cout - 변수 출력 시 서식 문자열 지정이 필요없다. > age; std::cout 2021. 8. 5.
[C++] header : iostream, cstdio, cstdlib, [C++] header : iostream, cstdio, cstdlib, C++ 헤더(header) 파일 c++ 에서 헤더 파일은 확장자를 사용하지 않는다. 기존 c헤더를 대신하는 새로운 헤더 파일을 제공한다. ----> ----> * 기존 c헤더보다 새로운 헤더 형태 사용을 권장한다. #include //#include // 사용가능하지만 사용을 권장함. #include int main() { printf("%d\n", std::max(1,2)); } stdio.h 와 cstdio 의 차이 printf() 등의 표준 함수가 global namespace에 있다. printf() 등의 표준 함수가 std 이름 공간에 있다. 표준은 아니지만 대부분의 컴파일러는 global namespace에도 print.. 2021. 8. 4.
[C++] using namespace std; using namespace std; c++ 공부를 시작하면 가장 먼저 알아야 하는 것! 왜 이 코드 "using namespace std; " 를 먼저 넣어두고 실행해야 하는지 아래 예제를 통해 확인해본다. algorithm 안에 있는 max 함수를 사용하고자 한다. include를 통해 아래와 같이 코드를 작성했는데 컴파일 에러가 발생한다. #include int main() { int n = max(1,2); } 해결 방법은 아래와 같다. c++ 표준의 모든 요소는 std 이름 공간 안에 있다. std:: 를 max 함수 앞에 명시적으로 넣어주면 컴파일이 된다. #include int main() { int n = std::max(1,2); } using 선언을 통해 필요한 함수를 사용할 수 있다... 2021. 8. 3.
[C++] namespace, using C++ namespace 개념 namespace가 필요한 이유 C언어 에서는 여러개의 init() 이 아래와 같이 존재할 때 init() 함수를 구분할 수 없다. (C ++에서도 아래와 같은 코드는 컴파일 에러가 역시 발생한다.) 이를 해결해 줄 수 있는 namespace 개념을 알아두어야 한다. #include void init() { printf("Lego init\n"); } void init() { printf("Book init\n"); } void init() { printf("Default init\n"); } int main() { init(); } 아래와 같이 namespace로 함수들을 구분 지을 수 있으며, 동일 init() 함수를 구분된 namespace로 호출할 수가 있다. 그냥 .. 2021. 8. 2.
Boost C++ Libraries 설치 (Dev C++) Boost 다운 받기 http://boost.org Boost C++ Libraries Welcome to Boost.org! Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work well with the C++ Standard Library. Boost libraries are intended to be widely useful, and usable across a broad spectrum of applications www.boost.org 1. Boost 사이트의 화면 오른쪽에 Download 2. 윈도우 Zip version 다운 (약 180MB) 3. 다운받은 파일 압축 풀.. 2021. 7. 29.
c++공부 준비 : 컴파일러 (g++), dev c++ 툴 설치 c++공부를 위해 기본적으로 컴파일러가 필요합니다. 결론부터 말하자면 컴파일러를 설치하기 보다는 최신 컴파일러를 제공하는 툴을 설치하시길 추천드립니다. c++ 공부를 위해 저는 Dev C++를 설치해 사용할겁니다. (설치 방법은 아래로 쭉쭉 이동해주세요) 컴파일러에 따라 (g++, cl) 다른 결과를 내는 경우가 있습니다. vc++, vs code, xcode, eclipse 등 통합 툴에서 이미 컴파일을 제공하고 대부분 툴에서 제공하는 컴파일러를 활용합니다. 컴파일 마다 컴파일 방식이 다르고 공부하는 과정에서 아래 두 개의 컴파일러를 실행해 보고 결과를 비교해보면서 그 차이를 확인해 볼 수 있습니다. g++ 컴파일러 사용시 컴파일 (추천 커멘드) g++ hello.cpp -std=c++1z -std=c.. 2021. 7. 28.