본문 바로가기

c++ 메모리20

C++ 29 [스마트 포인터] https://learn.microsoft.com/ko-kr/cpp/cpp/smart-pointers-modern-cpp?view=msvc-170 스마트 포인터(최신 C++) 자세한 정보: 스마트 포인터(최신 C++) learn.microsoft.com ▣ 스마트포인터 : C++11 버전 이후부터 새로운 스마트포인터 제공 ▣ 스마트포인터 : 메모리 할당 시 따로 delete를 사용하지 않아도 메모리 자동해제 ▣ 스마트포인터 종류 ▣ unique_ptr : 하나의 객체에 하나의 포인터만 소유권을 가질 수 있는 스마트포인터 ▣ shared_ptr : 하나의 객체가 참조하는 스마트 포인터가 총 몇 개인지를 참조하는 스마트포인터 ▣ weak_ptr : shared_ptr 객체에 대한 접근은 가능하지만 메모리 소.. 2023. 5. 16.
C++ 21 [템플릿] ▣ 데이터타입별로 반환형 매개변수를 다르게 하여 함수오버로딩 가능, 하지만 다른 데이터타입에 대한 걸 계속 만들어야 하기 때문에 가독성이 떨어진다. ▣ 템플릿 : 함수와 클래스가 제네릭형으로 동작할 수 있게 해주는 틀 ▣ 제네릭 : 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술 https://ko.wikipedia.org/wiki/%ED%85%9C%ED%94%8C%EB%A6%BF_(C%2B%2B) 템플릿 (C++) - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 템플릿(template)은 C++ 프로그래밍 언어의 한 기능으로, 함수와 클래스가 제네릭 형과 동작할 수 있게 도와준다. 함수나 클래스가 개별적으로 다시 작성하지 않고 ko.wiki.. 2023. 4. 21.
C++ 15 [friend 함수, 클래스] ▣ 프렌드를 사용하는 이유 : 클래스, 함수, 멤버 간에 공유해야 할 상황이 있을 경우, 클래스의 private, protected 멤버를 접근해야 하는 특별한 경우 ▣ 프렌드 함수 선언 방법 : friend void gameStart(Player); : 접근할 함수 반환형 앞에 friend키워드를 붙인다. ▣ gameStart(Player) : 코드처럼 접근할 클래스를 매개변수로 지정해야 한다. ▣ void gameStart(Player p) : 함수를 정의할 때에도 매개변수를 접근할 클래스로 정해준다. ▣ 프렌드 클래스 선언방법 : friend class Player2, 접근 권한을 줄 클래스를 선언할 때 맨 앞에 friend 키워드를 붙이고 선언한다. ▣ 프렌드를 선언할 때 클래스에 public, .. 2023. 4. 13.
C++ 12 [복사생성자] ▣ 객체 복사 방법 : Player p2(p1), Player p2 = p1; ▣ 복사생성자 임의로 정의 : Player::Player(const Player& player) ▣ 객체복사 시 자동으로 복사생성자 호출 ▣ 위에 코드처럼 복사생성자를 임의로 정의하지 않을 경우 디폴트 복사생성자 호출 this->level = player.level; 처럼 기본적으로 원본객체의 멤버변수 포인터를 사본 this객체에 복사 ▣ 복사 생성자를 호출하여 임의로 복사된 객체의 값을 변경할 수 있다. ▣ 객체를 복사할 경우, 객체를 매개변수로 받아올 경우, 객체를 반환할 경우 자동으로 복사생성자를 생성하고 호출한다. 2023. 4. 6.
C++ 10 [참조변수] ▣ & : 참조자 ▣ Player& p1 = player; : 참조변수 선언 및 초기화 ▣ Player& p1; : 참조변수는 선언할 때 초기화를 같이 진행해야 한다 그렇지 않으면 컴파일 오류 ▣ p1.lvUp(10); : 참조변수는 일반변수처럼 사용 가능해서 포인터처럼 -> 이 아닌 . 으로 접근 ▣ 값을 접근할 때 참조변수는 *p 포인터처럼 값을 접근할 때 마다 *를 붙이지 않아도 된다. 2023. 4. 4.
C++ [인수 객체, 인수 포인터, 인수 레퍼런스] ▣ 클래스 생성, 멤버변수, 멤버함수 생성 ▣ Play함수에 Player클래스의 객체 인수를 받는다. ▣ 인수로 받아오게 되면 바로 해당 인수의 객체를 사용할 수 있다. ▣ 다른 함수에서도 객체를 받아오면 그 해당 객체의 멤버 함수 호출 가능 ▣ 레퍼런스 인수로 받아와서 호출가능 주소를 받아오기 때문에 원본 수정 가능 ▣ 포인터로 인수를 받아 올 수 있다. ▣ 단 & 주소로 받아와야 하고 포인터로 받아온 객체는 -> 화살표로 접근해야 한다. 2023. 2. 10.
C++ [헤더파일] ▣ Sum.cpp라는 소스파일을 생성하고 함수를 정의합니다. ▣ Sum.h 라는 헤더파일을 생성하고 아까 만든 함수를 선언합니다. ▣ 라이브러리에 있는 헤더는 으로 불러온다. ▣ 사용자가 임의로 만든 헤더는 "Sum.h" 이런식으로 불러온다. ▣ 헤더를 통해서 가져오게 되면 컴파일 과정에서 내가 필요한 코드만 컴파일한다. 2023. 2. 8.
C++ [배열메모리 할당] ▣ int *p = new int [num] == int 크기로 배열 메모리 할당, *p에 할당한 주소 대입 ▣ delete []p; == 사용한 메모리 반환(반환을 해야지 메모리 재사용 가능) ▣ int *p = (int*)malloc(sizeof(int)) * num); == sizeof() 함수는 메모리의 크기를 구하는 함수, int형 크기로 메모리 입력받은 수만큼 곱하여 메모리 할당, (int*) int형 포인터를 의미 강제형변환 ▣ free(p) == 사용한 메모리 반환(반환을 해야지 메모리 재사용 가능) 2023. 2. 8.
C++ 16장 [static 멤버 변수, 함수] ▣ 안녕하세요. 이번장에서는 static 멤버에 대해 공부해보도록 하겠습니다. static을 공부할 때는 메모리 영역과 정적, 동적 이런 이야기를 해야 하지만, 이번장에서는 static에 사용 방법과 용도를 간단하게 공부해보겠습니다. ▣ static 멤버 변수와 멤버 함수를 선언하는 건 간단합니다. 선언할 멤버 변수 자료형 앞에 static 키워드를 붙어주시면 됩니다. 여기서 중요한건 static 멤버 변수는 모든 객체를 공유합니다. 그래서 반드시 int Calculator::number = 500; 코드에서처럼 전역 범위에서 정의 및 초기값을 지정해야 합니다. ▣ 메인 함수에서 객체를 각각 선언해주시고 선언한 객체로 static 멤버 변수를 접근하여 static 변수 주소를 출력하는 코드와 sum() .. 2022. 11. 16.
C++ 14장 [복사생성자] ▣ 안녕하세요. 이번장에서는 복사 생성자(Copy Constructor)를 공부해보겠습니다. 복사 생성자란 다른 객체의 내용을 복사해서 만드는 생성자를 의미합니다. 다시 말해 객체를 복사해서 사용한다라고 생각하시면 됩니다. ▣ 복사 생성자는 컴파일러에 의해 자동으로 만들어집니다. 그리고 모든 멤버 변수를 자동 복사합니다. 직접 코드를 작성하며 공부해보겠습니다. ▣ 먼저 클래스를 생성하고 멤버 함수를 선언했습니다. 코드를 작성하다가 주의해야한껀 private으로 멤버 변수를 지정했기 때문에 this->num = n를 기본 생성자에 넣어주셔야 내가 기본생성자 호출로 받아온 매개변수 값을 멤버 변수에 대입할 수 있습니다. ▣ 그리고 이렇게 Calculator c2(c1), Calculator c3 = c1 코.. 2022. 11. 11.
C++ 13장 [참조변수] ▣ 안녕하세요. 이번장에서는 참조 변수를 공부하도록 하겠습니다. 참조란 무언가 가리키는 걸 의미합니다. 참조 변수의 개념은 C언어의 포인터와 같은 방식입니다. 그럼 코드를 작성하고 이야기를 이어가겠습니다. ▣ C++에서 참조 변수는 int &p 코드처럼 & 기호를 넣어주면 됩니다. C언어의 포인터 int*p와 거의 비슷합니다. &는 참조자를 의미합니다. 우리가 C언에서 공부했던 것처럼 &를 기호를 변수 이름 앞에 &변수 이름 하면 주소를 의미합니다. 참조 변수를 만들 때 중요한 건 int&p = n; 코드처럼 참조 변수 초기화 시 변수를 대입해줘야 합니다. 대입하지 않으면 오류가 나게 됩니다. 그리고 Calculator& pCal = cal; 코드처럼 객체 클래스도 참조 변수로 사용이 가능합니다. 이제 .. 2022. 11. 4.
C++ 10장 [this 포인터] ▣ 안녕하세요. 이번장에서는 this포인터를 공부해보도록 하겠습니다. this 포인터는 말 그대로 포인터를 의미하며 단순한 포인터가 아닌 멤버 함수를 호출한 객체 자신을 가리키는 포인터, 객체 자신에 대한 포인터를 의미합니다. 코드를 작성하며 공부해보도록 하겠습니다. ▣ 기본적인 클래스와 멤버 함수를 만들어주세요. this->n = n;코드를 보시면 이게 무슨 코드이지?라고 생각하실 거라 생각합니다. 이 코드를 해석하면 this(자신의 객체 주소를 의미하고), ->는 주소에 접근하는 연산자입니다. 그리고 = n 은 멤버 함수에 있는 int n 매개변수의 값을 현재 객체에 있는 멤버 변수에 대입을 하라는 의미입니다. 디버그하고 출력을 해보면 각각 객체마다 지정했던 멤버 함수에 값이 출력되는 걸 확인할 수 .. 2022. 10. 27.
C++ 9장 [메모리 할당] ▣ 안녕하세요. 이번장에서는 메모리 할당에 대해 공부해보겠습니다. 메모리 할당은 프로그래밍에서 실행하는 동안 사용할 메모리 공간을 할당(배정, 몫을 나누는 것) 의미합니다. ▣ 그럼 왜 메모리 할당이 필요할까요? 우리가 프로그램을 만들 때 "내가 몇 기가짜리를 만들어야지"라고 계획을 하지 않습니다. 그렇게 계획을 하고 만들더라도 프로그램에 텍스트 입력 수, 이미지나 도형 크기 등등 메모리를 어느 정도 사용할지에 대한 부분을 모두 다 생각하며 제작하는 건 불가능합니다. 그렇기 때문에 프로그램을 만들고 실행 중 내가 필요한 메모리를 할당받고 필요 없을 때 반환하는 메모리 할당을 진행해야 합니다. 그럼 이제 코드를 작성하며 공부하겠습니다. ▣ int* p = (int*) malloc(sizeof(int)) 이.. 2022. 10. 26.
C++ 8장 [포인터 객체] ▣ 안녕하세요. 이번장에서는 포인터로 객체를 다루는 코드를 공부해보도록 하겠습니다. 포인터는 주소를 저장하는 변수입니다. C언어의 포인터의 개념과 동일합니다. 혹시 포인터를 모르시는 분은 C언어 공부에 포인터 부분을 꼭 공부해보세요. 이제 포인터 객체를 코드를 작성하며 공부해보도록 하겠습니다. ▣ 먼저 기본적인 클래스를 생성해주는 코드와 멤버 함수 코드를 작성해주세요. 그리고 메인 함수에서 Calculator num; 로 객체를 선언합니다. 그런 다음에 포인터를 선언합니다. Calculator* p = num(자료형 변수 이름 = 주소)의 형태로 코드를 작성합니다. 변수를 선언하는 코드와 동일합니다. 그리고 포인터를 이용하여 멤버 함수를 호출해보겠습니다. 포인터에 있는 멤버함수를 접근하기 위해서.(점) .. 2022. 10. 20.
C++ [포인터, const] ▣ 안녕하세요. 이번장에서는 C++ 포인터에서 const를 사용하는 방법을 공부해보겠습니다. 포인터에서 이해가 안 되는 분은 C언어 포인터 부분을 꼭 공부해주세요. ▣ 기본적으로 포인터를 선언하여 num 변수에 주소를 지정하고 출력을 해보겠습니다. 그럼 p포인터가 num에 주소에 있는 값을 출력하는 걸 확인할 수 있습니다. ▣ 이번에는 &num 주소를 가르치고 있는 p포인터에 200을 대입해보겠습니다. 그럼 num에 값이 200으로 바뀐걸 확인할 수 있습니다. ▣ 여기서 const int * p = &num 포인터에 자료형 앞에 const 상수로 지정하는 키워드를 붙이게 되면 선언 정의 후에 값을 바꾸게 되면 오류가 나는 걸 확인할 수 있습니다. 포인터에 자료형 앞에 const를 붙이면 지정한 주소의 값.. 2022. 4. 13.
C++ [매크로, inline, #define] ▣ 안녕하세요. 이번장에서는 C++에서 매크로와 인라인을 공부해보겠습니다. 매크로는 우리는 C언어에서 #define으로 정의를 하는 부분과 동일합니다. #define PI 3.1412 이렇게 main함수 밖에서 #include와 함께 적었던 코드 기억하시죠. 그럼 PI라는 상수 기호가 3.1412 값으로 정의가 되는 걸 했던 기억을 있을 겁니다. #은 전처리기고 컴파일하기전에 처리해주는 걸 의미합니다. 그렇기 때문에 int PI = 3.1412 이렇게 선언 및 정의를 해준 것보다 과정에서도 컴파일 전에 하기 때문에 적겠죠? 이 부분을 기억하시고 이제 매크로를 활용하여 함수를 정의해보겠습니다. ▣ 매크로 함수를 정의하려면 함수를 정의하는 것과 거의 동일합니다. 함수 이름 앞에 #define을 붙어주시고 S.. 2021. 7. 30.
C++ [레퍼런스변수, 포인터, 주소, 참조] ▣ 안녕하세요 이번장에서는 포인터를 꼭 공부하고 진행해주세요. 메모리 주소에 대한 개념이 없으면 어렵습니다. ▣ 첫번째는 포인터를 이용해서 변수에 값을 바꿔보도록 하겠습니다. int num = 10; 변수를 정의하고 int *으로 int에 주소를 저장하는 pNum를 주소를 선언해줍니다. 그리고 &num에 주소를 대입해서 넣어주세요 그리고 값과 주소를 출력하는 코드를 넣고 *pNum 포인터로 간접으로 접근해서 20으로 대입을 해주고 출력을 하면 주소가 동일한걸 확인할 수 있고, 값이 바뀐 것도 확인할 수 있습니다. ▣ 이부분을 C++에서는 더 직관적으로 사용하게 만든 게 레퍼런스 변수, 참조 변수입니다. ▣ 이번에는 C++에 레퍼런스변수로 주소를 저장해서 값을 바꿔보겠습니다. 쉽게 정의를 해보겠습니다. 포.. 2021. 7. 23.
C++ [디폴트 매개변수] ▣ 디폴트 매개변수는 간단합니다. 함수에 매개변수에 초기값을 지정해주는 게 디폴트 매개변수라고 생각하시면 됩니다. ▣ function(int num1 = 1)을 해주시면 매개변수 기본값이 지정하게 되는데 여기서 중요한 부분은 호출을 하는 호출자가 값을 전달해주냐 주지 않느냐에 따라 달라집니다. function() 함수를 그냥 호출했을 때와 153, 39처럼 값을 전달해줄 때에 출력 결과가 다른 걸 볼 수 있습니다. 그냥 호출해주었을때 1이 출력되는 걸 확인할 수 있고, 값을 전달해준 호출은 그 값이 출력되는 걸 확인할 수 있습니다. 즉 우선순위는 호출자가 전달해주는 값입니다. ▣ 이번에는 여러개에 매개변수를 받아 호출해보겠습니다. 이번에는 num1, num2, num3 이렇게 3개에 매개변수로 값을 받아.. 2021. 7. 13.
C++ [for문, 포인터, 레퍼런스변수] ▣ C언어에 for문 형식입니다. (초기식, 조건, 증감) 이렇게 for문 함수 형식으로 C++에서 사용할 수 있습니다. 그리고 C++에서의 for문 스타일도 존재합니다. ▣ for( 변수 : 범위 ) 에 형식으로 for문을 작성할 수 있습니다. 그럼 범위에 넣었던 aList에 하나하나에 요소에 값을 변수에 하나씩 대입을 합니다. 그리고 그 범위가 끝날때까지 반복을 하는 형식입니다. ▣ 이번에는 for문을 이용하여 배열에 값들에 +1씩을 더하는 코드를 작성해보겠습니다. 하나하나 요소를 접근하여 i++를 하고 다시 for문을 활용하여 출력을 해보면 값이 하나도 안바뀌어 있는걸 확인할 수 있습니다. ▣ 우리가 여기서 생각해야할 부분은 for에 있는 (int i입니다. for() 이렇게 괄호가 있으면 함수이기.. 2021. 7. 9.
C++ [함수 오버로딩] ▣ C언어에서는 똑같은 이름에 함수를 선언하고 정의해서 사용하게 되면 컴파일 오류가 나오게 됩니다. 하지만 C++에서는 이 부분을 함수 오버 로딩을 통해 여러 함수를 같은 이름으로 사용할 수 있습니다. ▣ 전에 C언어 코드를 .cpp소스 코드 파일을 만들어 코드를 작성해보겠습니다. C++에서 sum이라는 이름에 함수를 두 가지를 선언했습니다. 함수 오버로딩을 하는 방법은 아주 간단합니다. 위에 코드처럼 함수에 매개변수에 변수에 갯수가 다르거나, ▣ 매개변수에 변수에 갯수가 같더라도 자료형이 다르면 같은 이름에 함수를 사용할 수 있습니다. 이게 함수 오버로딩입니다. 2021. 7. 2.