본문 바로가기

[ C++ ]84

C++ 12 [복사생성자] ▣ 객체 복사 방법 : Player p2(p1), Player p2 = p1; ▣ 복사생성자 임의로 정의 : Player::Player(const Player& player) ▣ 객체복사 시 자동으로 복사생성자 호출 ▣ 위에 코드처럼 복사생성자를 임의로 정의하지 않을 경우 디폴트 복사생성자 호출 this->level = player.level; 처럼 기본적으로 원본객체의 멤버변수 포인터를 사본 this객체에 복사 ▣ 복사 생성자를 호출하여 임의로 복사된 객체의 값을 변경할 수 있다. ▣ 객체를 복사할 경우, 객체를 매개변수로 받아올 경우, 객체를 반환할 경우 자동으로 복사생성자를 생성하고 호출한다. 2023. 4. 6.
C++ 11 [auto] ▣ C++ 11이후 버전 기준, auto 키워드는 자동으로 데이터타입을 정해준다. ▣ auto n1 = 10; : int형 데이터타입으로 자동으로 지정 ▣ typeid(변수이름).name() : 변수에 데이터타입 이름을 반환해 주는 함수 ▣ const auto n1 = 10; : const 키워드를 붙여서 지정하면 상수처럼 정의할 수 있다. ▣ auto& : 참조자나 포인터를 사용하여 선언 가능 ▣ auto n1 = player; : 클래스나 포인터를 auto 키워드로 선언할 수 있다. ▣ auto Player::lvUp(int level) : auto 키워드를 반환형으로 사용이 가능 ▣ auto 키워드를 사용해서 참조, 값, 객체를 반환할 수도 있다. ▣ void Player::lvUp(auto lev.. 2023. 4. 5.
C++ 10 [참조변수] ▣ & : 참조자 ▣ Player& p1 = player; : 참조변수 선언 및 초기화 ▣ Player& p1; : 참조변수는 선언할 때 초기화를 같이 진행해야 한다 그렇지 않으면 컴파일 오류 ▣ p1.lvUp(10); : 참조변수는 일반변수처럼 사용 가능해서 포인터처럼 -> 이 아닌 . 으로 접근 ▣ 값을 접근할 때 참조변수는 *p 포인터처럼 값을 접근할 때 마다 *를 붙이지 않아도 된다. 2023. 4. 4.
C++ 09 [call by value, call by reference] ▣ 변수나 객체를 매개변수로 전달하면 값에 의한 호출이 된다. ▣ 객체를 매개변수로 값을 전달하면 객체가 복사되어서 전달하기 때문에 전달한 함수에서 객체의 값을 바꾸어도 원본에는 지장이 없다. ▣ 매개변수 객체의 생성자는 호출되지 않고 소멸자만 컴파일에 의해 호출되고 소멸된다. ▣ 객체의 주소로 매개변수를 전달하면 주소의 의한 호출이 된다. ▣ 객체의 주소를 전달했기 때문에 호출된 함수에서 값을 변경하면 원본객체에 영향을 준다. ▣ 객체의 주소로 매개변수를 전달해도 원본 객체의 생성자와 소멸자만 호출된다. 2023. 3. 28.
C++ 08 [string] ▣ string 클래스를 사용을 사용하기 위해서는 #include 헤더가 있어야 한다. ▣ string str(문자열) : 괄호를 통해 초기화 가능 ▣ string *p = new string(문자열) : 메모리 할당으로 string 객체 사용 가능 ▣ string에 속해 있는 getline() 함수 ▣ getline(cin, str, '\n') : getline(cin, 입력받을 객체, 구분문자(구분문자까지 입력)) ▣ str2 = str1 : 대입연산자를 통해서 문자열을 치환(대입)해서 바꿀 수 있다. ▣ 대표적인 string 함수들 객체.append(연결 문자) : 문자열 연결 함수 반환형 객체.length() : 문자열 길이 함수 stoi(객체) : 숫자로 된 문자열을 숫자로 변환 함수 객체.cl.. 2023. 3. 28.
C++ 07 [this 포인터] ▣ this 포인터 : 객체 자신에 주소 포인터 ▣ this->num 코드는 test객체의 포인터(클래스 Test의 int num = 0)를 접근하여 대입 ▣ 클래스의 멤버함수와 생성자함수에서만 this 사용이 가능하다. ▣ 멤버변수와 멤버함수의 매개변수의 이름이 동일할 때 this로 객체 자신을 접근하여 사용한다. ▣ 멤버 함수에서 자신의 주소를 리턴해야 할 때 사용한다. ▣ this는 정적 멤버함수(static 함수)에서는 this를 사용할 수 없다. ▣ 멤버함수에서 객체의 주소를 this로 접근이 가능하다. ▣ 위에 코드를 풀어서 작성하면 이렇게 test.testfunc(&test, 10);처럼 주소를 매개변수로 전달하고 컴파일러가 void testfunc(Test* this, int num) 코드.. 2023. 3. 24.
C++ 06 [메모리 할당] https://ko.wikipedia.org/wiki/%EB%8F%99%EC%A0%81_%EB%A9%94%EB%AA%A8%EB%A6%AC_%ED%95%A0%EB%8B%B9 동적 메모리 할당 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 동적 메모리 할당 또는 메모리 동적 할당은 컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제가 쓸 ko.wikipedia.org ▣ 메모리 할당 : 필요한 메모리를 힙이라는 메모리 영역에서 가져와 사용하는 것 ▣ 동적메모리 : 상황에 따라 원하는 크기만큼의 메모리가 할당 가능 ▣ 정적메모리 : 메모리의 크기가 코딩되어 있어서 나중에 조절할 수 없다. ▣ 메모리 할당 방법 : 데이터타입 *포인터이.. 2023. 3. 24.
C++ 05 [객체배열] ▣ 객체배열 만들기 : 클래스이름 배열이름[크기]; ▣ 객체배열을 초기화하는 방법 : 클래스이름 배열이름[크기] = { 클래스이름(), 클래스이름(값)}; ▣ 객체배열 인덱스 수만큼 초기화를 해야 한다. ▣ Test() : 매개변수가 없는 생성자 호출 ▣ Test(10) : 매개변수가 있는 생성자 호출 ▣ 소멸자는 큰 숫자 인덱스부터 소멸한다. 그렇기 때문에 매개변수가 있는 소멸자가 먼저 호출되었다. 2023. 3. 24.
C++ 04 [인라인 함수] https://namu.wiki/w/%EC%98%A4%EB%B2%84%ED%97%A4%EB%93%9C 오버헤드 - 나무위키 이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권 namu.wiki ▣ 오버헤드 : 어떤 명령어를 처리하는데 소비되는 간접적, 추가적 컴퓨터 자원 ▣ 함수 호출 오버헤드 : 함수 호출에 따른 시간흐름 ▣ sum함수를 호출할 때 num1+num2 연산을 하는 시간보다 함수를 호출하는 시간, 리턴에 따른 시간이 더 많이 들어간다. 그렇기 때문에 짧은 코드 함수는 인라인 함수를 사용하면 속도해야 처리속도라 빨라진다. ▣ 인라인함수.. 2023. 3. 22.
C++ 03 [클래스, 멤버변수, 멤버함수, 생성자, 소멸자, 접근지정자] ▣ 클래스 : 설계도, 틀 ▣ 객체 : 설계도로 생성된 완성품 ▣ 클래스 선언 : class 클래스이름 { }; , class 키워드를 앞에 붙여야 한다. ▣ 멤버변수 : 클래스내부에서 선언하는 변수 ▣ 멤버함수 : 반환형 클래스이름::멤버함수이름(매개변수){ } 순으로 생성한다. , (::)는 범위지정연산자 ▣ 접근지정자 : public: 클래스 내부, 외부 모두 접근이 가능한 접근지정자 ▣ 객체생성 : 클래스이름(자료형) 변수이름;으로 지정한다. 구조체를 생성하는 것과 동일하다. ▣ p1.Damage(50); 객체에 접근할 때에는. 점을 사용한다. ▣ 생성자 : 객체가 생성될 때 자동으로 한번 호출되는 함수, 생성자는 클래스 이름과 동일하게 작성해야 한다. 생성자는 리턴 타입 반환형을 선언하지 않는다.. 2023. 3. 10.
C++ 02 [string, cin.getline(), width(), std::right, 정렬] ▣ : C언어 헤더는 c로 시작한다, C언어 string헤더 ▣ strcpy() : string을 복사하는 함수 ▣ : C++ string클래스 헤더파일 ▣ string : C++표준 라이브러리에서 제공하는 string클래스, 배열과 다르게 메모리 크기 제약이 없다., 쉽게 사용가능 ▣ getline() : 공백을 포함해서 입력받는 함수, getline(cin, 버퍼) ▣ cin.getline() : 공백을 포함한 지정한 문자까지 입력, getline(버퍼, 메모리크기, 입력받을 끝 문자) ▣ cin >> str >> str2 : 동시입력이 가능하다. ▣ cout.width() : 출력간격 ▣ std::right, std::left : 오른쪽정렬, 왼쪽정렬 2023. 3. 3.
C++ 01 [시작, 역사, 특징, 컴파일, 링킹, 디버깅, cout, cin, namespace] ▣ 소프트웨어 : 컴퓨터 프로그램과 데이터를 총칭하는 용어이다. ▣ 프로그래밍 : 컴퓨터가 처리할 작업 ▣ 프로그래밍 언어 : 컴퓨터 언어 https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D 컴퓨터 프로그래밍 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 컴퓨터 프로그래밍(영어: computer programming) 또는 간단히 프로그래밍(programming, 문화어: 프로그램 작성) 혹은 코딩(coding)은 하나 이상의 관련된 추상 알고리즘을 ko.wikipedia.org ▣ 1972년 C언어 ▣ 1983년 C++ ▣ 1995년 Java ▣ .. 2023. 2. 28.
C++ [가상함수] ▣ 기본클래스, 파생클래스를 선언하고 각각 멤버함수를 선언합니다. 멤버함수의 이름은 동일하게 선언합니다. 그리고 메인함수에서 GameManager 객체의 포인터, Player 객체의 포인터를 각각 정의하고 위에 코드처럼 GameMaanger클래스의 주소로 접근하여 멤버함수를 호출하는 코드, Player클래스의 주소를 pGameManager 함수에 대입하여 멤버함수를 호출하는 코드를 작성합니다. ▣ 디버그를 해보면 둘 다 GameManager 클래스의 멤버함수가 호출되는 걸 확인할 수 있습니다. ▣ 그 이유는 정적바인딩으로 컴파일할 때 호출될 함수의 주소가 이미 결정해 버렸기 때문에 pGameManager = pPlayer; 이렇게 코드를 작성하더라도 부모의 함수가 호출됩니다. ▣ 이럴 때 가상함수(Vir.. 2023. 2. 22.
C++ [오버라이드] ▣ 먼저 GameManager 클래스를 선언하고 GameManager에 멤버변수, 함수를 지정합니다. Player라는 파생 클래스도 선언하고 멤버변수를 선언합니다. ▣ 그리고 Player의 객체를 p로 정의하고 p에서 Show() 멤버함수를 호출합니다. 그럼 기본클래스인 GameManager에 멤버함수 Show()가 호출됩니다. ▣ 코드를 추가해서 Player 파생클래스에 멤버함수로 기본클래스에 있던 멤버함수랑 동일한 이름으로 Show()라는 멤버함수를 선언합니다. 그리고 다시 p.show() 함수를 호출하면 위에 이미지처럼 기본클래스의 멤버함수가 아닌 파생클래스의 멤버함수가 호출됩니다. 이걸 오버라이드라고 합니다. ▣ 다시 정리하면 파생클래스가 기본클래스 함수를 대신 호출되는 걸 오버라이드라고 합니다. 2023. 2. 22.
C++ [클래스 상속] ▣ 파생클래스를 만들기 위해서는 class State : public Player class 파생클래스명 : 접근연산자 부모클래스이름 위에 있는 형식으로 작성해주시면 됩니다. ▣ state 객체에서 show() 함수를 호출하는데 show() 함수에는 Player에 level, hp 멤버변수를 사용할 수 있습니다. ▣ Player에 객체를 생성해서 p1. 접근을 하려고 하면 level 만 접근할 수 있습니다. ▣ public은 외부에서든 내부에서든 자식 클래스에서든 모두 접근이 가능합니다. private는 외부 접근이 불가능하고 내부 자기 자신에서만 접근이 가능합니다. protected는 외부에서는 접근이 불가능하지만 상속 관계만 접근이 가능합니다. 그렇기 때문에 public접근연산자인 level만 접근할.. 2023. 2. 16.
C++ [정적멤버변수, 정적멤버함수] ▣ 정적멤버를 생성하기 위해서는 멤버변수, 멤버함수에 데이터타입 앞에 static 키워드를 붙여주면 됩니다. 그럼 데이터영역에 저장되어 프로그램이 끝날 때까지 데이터가 남아 있고 외부에서도 접근이 가능합니다. ▣ int Player::count = 0; 정적변수를 초기화하는 코드입니다. 클래스명::멤버변수로 정적멤버변수를 접근해서 초기화할 수 있습니다. ▣ 정적멤버 함수 또한 Player::Sum(); 이런 식으로 호출할 수 있습니다. ▣ 그럼 Player p1;이라는 객체가 생성하기 전에 Sum() 정적멤버함수를 호출했기 때문에 정적멤버변수인 count가 +1이 되었고 또 p1.Sum()으로 호출했기 때문에 count = 1;인 상태에서 또 +1이 되었기 때문에 정적멤버변수인 count가 2가 출력됩니.. 2023. 2. 15.
C++ [인수 객체, 인수 포인터, 인수 레퍼런스] ▣ 클래스 생성, 멤버변수, 멤버함수 생성 ▣ Play함수에 Player클래스의 객체 인수를 받는다. ▣ 인수로 받아오게 되면 바로 해당 인수의 객체를 사용할 수 있다. ▣ 다른 함수에서도 객체를 받아오면 그 해당 객체의 멤버 함수 호출 가능 ▣ 레퍼런스 인수로 받아와서 호출가능 주소를 받아오기 때문에 원본 수정 가능 ▣ 포인터로 인수를 받아 올 수 있다. ▣ 단 & 주소로 받아와야 하고 포인터로 받아온 객체는 -> 화살표로 접근해야 한다. 2023. 2. 10.
C++ [열거형, enum] ▣ enum 키워드를 이용해서 선언 구조체와 비슷합니다. ▣ enum은 여러 개의 상수를 관리한다고 생각하시면 됩니다. ▣ 함수 밖에 선언하면 전역변수처럼 모든 함수에서 접근이 가능합니다. ▣ 구조체와 동일하게 열거형 변수이름; 으로 정의해야 합니다. ▣ 위에 이미지처럼 switch에서 조건으로 바로 사용이 가능합니다. 2023. 2. 8.
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++ [Swap, 레퍼런스 인수] ▣ int& num1 == 레퍼런스 인수(주소 값을 저장한다.) ▣ int*p = &num1; 포인터와 동일하지만 포인터는 초기값이 없으면 안 되기 때문에 그 점에 차별점이 있다. ▣ &변수이름 == 변수의 주소를 의미한다. 2023. 2. 8.