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

C++46

[C++] Class : 멤버 초기화 리스트 (member initializer lists) 멤버 초기화 리스트 (member initializer lists) 생성자 괄호 ( ) 뒤에 콜론 (:) 을 표기하고 멤버를 초기화 하는 것 Point( int a, int b) : x(a), y(b) { } 대입 방식이 아닌 초기화 방식이다. 멤버 초기화 리스트를 사용하는 방향이 성능면에서 더 좋다. 클래스 선언부 구현부가 분리되어 있을 때, 초기화 리스트는 구현부에 작성한다. #include class Point { int x; int y; public: Point( int a, int b) : x(a), y(b) // 초기화 { // x = a; // 대입 // y = b; } }; int main() { Point p(1, 2); int a = 0; // 초기화. 생성자 호출 int b; // 생.. 2021. 8. 19.
[C++] 생성자, 소멸자, 위임 생성자, default 생성자 생성자 (constructor)와 소멸자 (destructor) "생성자 (constructor)" 생성자를 사용하는 이유 - 객체를 자동으로 초기화 하기 위해서 생성자 모양 - 클래스 이름과 동일한 함수 - 리턴 타입이 없다. - 인자는 있어도 되고 없어도 된다. 2개 이상 만들 수 있다. 객체를 생성하면 - 객체의 크기 만큼 메모리를 할당 - 생성자가 호출된다 - 생성자가 없으면 객체를 만들 수 없다. 디폴트 생성자 - 사용자가 생성자를 한 개도 만들지 않으면 디폴드 생성자를 컴파일러가 인자없는 생성자를 제공해 준다. #include using namespace std; class Point { int x, y; public: Point() { x = 0; y = 0; cout 2021. 8. 19.
[C++] 객체지향 : 접근지정자 private, public, friend 접근지정자 private / public - 사용자는 내부 멤버 데이터 구조에 대해 굳이 알 필요가 없다. - 멤버 함수를 통해서만 객체 상태 변경이 가능하도록 해서 객체를 안전하게 유지한다. 이를 캡슐화라 말한다. - setter / getter : 멤버 데이터 접근을 위해 함드는 함수를 나타내는 용어, private 멤버 데이타를 선언하고 setter/getter로 접근하는 것이 일반적 자전거의 기어는 현실 세계에서 항상 존재함. 프로그램에서 잘못된 기어 생성을 막아야 한다. gear의 값이 마이너스 값이거나 0 인 경우는 값 셋팅이 되지 않도록 하는 조건을 만들어 넣을 수 있다. #include class Bike { public: void changeGear(int n) { if ( n < 1 ).. 2021. 8. 18.
[C++] STL : stack, vector 다양한 STL 이 있지만 그 중 가장 많이 자주 사용하는 stack과 vector를 살펴 보겠습니다.! STL - stack STL (Standard Template Library) 은 C++에서 제공하는 표준 라이브러리 #include #include // stack 사용을 위해 해당 header추가 해야함. int main() { std::stack s; // 클래스 탬플릿으로 되어 있어 input type을 적어줘야 함. s.push(10); s.push(20); s.push(30); std::cout 2021. 8. 17.
[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++] Explicit Casting (명시적 캐스팅) C++ Explicit Casting (C++ 명시적 캐스팅) C의 캐스팅이 논리적이지 않고, 위험성이 있으며, 버그 가능성이 높다. 그래서 C++에서는 새로운 캐스팅 방법을 소개하고 있다. C언어의 캐스팅 방법 : int* p1 = (int*)malloc(sizeof(int)*10); // C언어의 캐스팅 방법 : C++에서도 사용은 가능하다. C++의 캐스팅 방법 : #include #include int main() { int* p1 = static_cast(malloc(sizeof(int)*10)); // C++ 에서 사용하는 캐스팅 방법 free(p1); } C언어 방식의 캐스팅의 단점 : 아래 두 가지 경우가 대표적인 c언어에서 발생할 수 있는 캐스팅 문제이다. 단점 예제 (1) : #incl.. 2021. 8. 14.
[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++] 함수 : 후위 반환 타입(suffix return, trailing return) suffix return type 함수를 만들 때 사용하는 새로운 표기법 (C+11부터 지원) 함수의 이름 앞에 "auto"를 넣고, 괄호 뒤쪽에 -> 반환타입 을 적어준다. 람다 표현식이나 함수 템플릿을 만들 때 주로 사용한다. //int square(int a) auto square(int a) -> int { return a * a; } //int main() auto main() -> int { square(3); } 에러 케이스 // T1, T2 두 개의 타입을 받아 처리하는 템플릿 선언하는데 에러가 발생한다. // a, b 가 선언되어 있지 않다는 에러가 발생함. template decltype(a + b) add(T1 a, T2 b) { return a + b; } int main() { a.. 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.