본문 바로가기

[ C++ ]/- C++ 실습연습33

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.
C++ [템플릿_02, template, typename] ▣ 이번장에서는 template 두 번째 장으로 다른 자료형 type을 사용할 경우에 어떻게 해야는지 공부해보겠습니다. ▣ 저번 1장에서 템플릿을 사용하여 코드를 작성해보겠습니다. 템플릿을 사용하는 이유는 간단합니다. 함수오버로딩시 다른 자료형 type일 경우 함수를 따로 만들어줘야 하는 불편함이 있었습니다. 그래서 템플릿을 사용하면 이렇게 어떤 자료형을 매개변수로 주더라도 그에 맞게 반환형을 주는걸 코드로 확인할 수 있습니다. 하지만 여기서 우리가 생각할 수 있는 문제는 같은 함수이지만 내가 원하는 타입일 경우 다른 함수를 지정하고 싶을 경우가 있습니다. 그럴 때 이렇게 코드를 작성합니다. ▣ 이렇게 template 을 따로 구분해주시고 함수를 내가 원하는 타입에 맞게 매개변수와 반환형을 지정해서 코드.. 2022. 4. 29.
C++ [클래스, 생성자, 소멸자] ▣ 안녕하세요. 이번장에서는 클래스에 생성자와 소멸자에 대해 공부해보겠습니다. ▣ MyClass라는 클래스를 생성해주시고, public에 MyClass()와 ~MyClass() 함수를 만들어보겠습니다. MyClass()는 클래스가 생성되었을 때 실행되는 함수이고, ~MyClass()는 클래스를 생성한 함수가 끝나게 되면 소멸되는 함수입니다. ▣ 메인에서 MyClass my;로 정의하고 코드를 실행하면 메인 시작 -> 생성자 -> 메인 끝 -> 소멸자 이렇게 출력되는 걸 확인할 수 있습니다. 여기서 중요한건 코드가 어떤 순서로 흘러가는지 출력 함수로 확인해보는 게 중요합니다. ▣ 이번에는 char *p 포인터를 선언해주시고, p = new char[100000] 메모리를 할당합니다. 그리고 소멸자에서 de.. 2022. 4. 19.
C++ [포인터, const] ▣ 안녕하세요. 이번장에서는 C++ 포인터에서 const를 사용하는 방법을 공부해보겠습니다. 포인터에서 이해가 안 되는 분은 C언어 포인터 부분을 꼭 공부해주세요. ▣ 기본적으로 포인터를 선언하여 num 변수에 주소를 지정하고 출력을 해보겠습니다. 그럼 p포인터가 num에 주소에 있는 값을 출력하는 걸 확인할 수 있습니다. ▣ 이번에는 &num 주소를 가르치고 있는 p포인터에 200을 대입해보겠습니다. 그럼 num에 값이 200으로 바뀐걸 확인할 수 있습니다. ▣ 여기서 const int * p = &num 포인터에 자료형 앞에 const 상수로 지정하는 키워드를 붙이게 되면 선언 정의 후에 값을 바꾸게 되면 오류가 나는 걸 확인할 수 있습니다. 포인터에 자료형 앞에 const를 붙이면 지정한 주소의 값.. 2022. 4. 13.
C++ [방향키입력, 커서이동] ▣ 안녕하세요. 이번장에서는 방향키를 눌러 문자를 이동시키는 코드를 공부해보도록 하겠습니다. ▣ 우선 방향키를 입력받는 코드를 작성해보겠습니다. #incldue 를 선언해주세요. 이건 _getch()를 사용하기 위함입니다. scanf()와 다르게 입력 버퍼에 저장하지 않고 바로 아스키코드로 반환해주는 함수입니다. 그리고 엔터를 누를 때까지 기다리지 않습니다. 이렇게 코드를 작성하고 방향키를 누르게 되면 224 72, 224 80, 224 77, 224 75 이렇게 두 가지 숫자들이 출력되는 걸 확인할 수 있습니다. 방향키는 복합키워드를 가지고 있기 때문에 두 가지 숫자를 조합해서 반환합니다. 그럼 여기서 우리가 알 수 있는건, 방향키를 입력했을때에는 공통적으로 224를 준다라는 사실입니다. ▣ 그럼 이걸.. 2022. 2. 22.
C++ [NULL, 0, nullptr, 초기화, 함수오버로딩] ▣ 안녕하세요. 이번장에서 데이터를 초기화하는 NULL, 0, nullptr에 차이를 공부해 보겠습니다. ▣ 우선 똑같은 이름에 두 개에 함수를 선언하겠습니다. 그리고 한개는 int num 정수에 값을 받는 매개변수로 한 개는 int *num 주소를 입력받는 포인터로 각각 선언을 합니다. 그런 다음 메인 함수에서 testFunce() 함수를 호출합니다. 첫번째 testFunce(0) 정수 값을 0으로 매개변수에 값을 전달해줍니다. 그럼 함수 오버 로딩을 하면 두 함수 중에 정수에 매개변수를 가지고 있는 함수를 호출하고 값을 전달하는걸 확인할 수 있습니다. ▣ 이번에는 매개변수에 NULL을 전달해줍니다. 디버그를 해보면 아까와 동일하게 정수형 매개변수를 가지고 있는 함수를 호출하는 걸 확인할 수 있습니다... 2022. 2. 4.
C++ [ctype, is키워드, 종류 판단함수] ▣ 안녕하세요. 이번장에서 ctype.h에 있는 문자의 종류를 판단하는 함수를 공부해보겠습니다. ▣ 우선 #include 헤더를 추가합니다. 헤더 이름 앞부분에 c를 붙이면 c언어에서 사용한 헤더라고 생각하시면 됩니다. cin.get(str) 함수를 사용하여 문자를 입력받습니다. 그리고 밑에 cin.get() 쓰는 이유는 버퍼에 남아 있는 \n 엔터를 지우기 위함입니다. 저게 없으면 계속 입력을 받을때 엔터가 버퍼에 남아있어 두 번 입력을 받는 게 됩니다. ▣ if문 조건문 안에 isalnum, isalpha, isblank함수를 넣어 10진수라면, 알파벳이라면, 스페이스나 탭이라면 반환형을 1 또는 0으로 주기 때문에 이렇게 결과가 나옵니다. 꼭 직접 확인해보세요. ▣ 그리고 islower, isupp.. 2021. 12. 1.
C++ [논리연산자, and, or, not] ▣ 이번장에서는 논리 연산자를 간단하게 공부해보도록 하겠습니다. C언어에서는 논리연산자를 &&, ||,! 기호로 사용했습니다. 하지만 이건 큰 문제가 될 수 있습니다. 왜냐하면 세계 모든 키보드자판에 형식이 같지 않기 때문에, &, |, ! 을 지원하지 않는 키보드가 있을 수 있습니다. 그렇기 때문에 C++에서는 &&, ||,! 논리 연산자를 다르게 사용합니다. ▣ && 연산자는 and로 || 연산자는 or로 ! 연산자는 not으로 합니다. ▣ 이렇게 and or 모두 값을 확인해보세요. 이제 입력을 받아서 조건문에 논리연산자를 모두 사용해서 만들어보세요. 2021. 11. 24.
C++ [형변환, 상수, 매크로, casting] ▣ 안녕하세요. 이번장에서는 형 변환(casting) 그리고 상수에 대해 공부해보도록 하겠습니다. ▣ char 형으로 x 라는 변수를 'A' 문자 값을 넣고 정의합니다. 그리고 cout 으로 x를 출력했을 경우 (int) x, int(x)를 출력한 걸 확인해보겠습니다. 그럼 x는 문자 그대로 A가 출력되고 casting 한 두 변수는 65 아스키코드 숫자 값이 나오는 걸 확인할 수 있습니다. C언어에서와 동일하게 강제형변환을 하려면 (int)를 사용하여 진행했지만 C++에서는 int() 조금더 직관적으로 코드를 작성할 수 있습니다. ▣ 이렇게 float형식을 int() 형으로 강제 형변환(casting)하여 출력하면 바뀌는 걸 확인할 수 있습니다. ▣ 이번에는 매크로와 상수를 만드는 방법을 간단하게 해보.. 2021. 10. 22.
C++ [bool, 데이터자료형] ▣ 안녕하세요. 이번장에서는 C++에서의 bool 자료형에 대해 공부해보도록 하겠습니다. ▣ bool 자료형은 변수의 자료형들 중에 하나입니다. int 형은 정수형, float 형은 실수형 이런 식으로 자료형이 있듯이 bool 형은 true(1), false(0)를 저장하는 형식에 자료형이라고 생각하시면 됩니다. ▣ 변수를 선언할 때 bool 자료형으로 지정을 하고 값을 true, false로 각각 대입을 하고 출력을 해보겠습니다. 그러면 1과 0이 출력되는 걸 확인할 수 있습니다. ▣ 그럼 1과 0이 아닌 true와 false 값을 출력하는 코드를 진행해보겠습니다. 그러기 위해서는 cout으로 boolalpha로 코드를 작성한 후에 bool 값이 있는 변수를 출력합니다. 그러면 true, false값으.. 2021. 10. 21.
C++ [cmath, algorithm, 수학함수] ▣ 안녕하세요. 이번장에서 수학를 계산하는 함수를 간단하게 공부해보겠습니다. ▣ 수학함수를 사용하기 위해선 c언어에서 다르게 를 사용합니다. c언어 헤더와 c++ 헤더를 구분하기 위함도 있지만 cmath 가 더 기능이 있습니다. 그리고 숫자를 입력받을 변수와 제곱근을 계산해서 반환한 값을 저장할 변수를 선언하고, sqrt()함수를 입력합니다. 그럼 이렇게 double 형으로 반환되고 매개변수값을 (double)형식으로 넣으라는 표시가 나옵니다. ▣ 함수에 양식대로 넣어서 출력을 해보면 81을 입력하면 81에 제곱근이 9라는걸 확인할 수 있습니다. ▣ 헤더를 추가하여 min(), max()함수를 사용해보겠습니다. 함수에 이름처럼 최소값 최대값을 구해주는 함수이고 ceil(), floor() 올림, 내림을 .. 2021. 10. 20.
C++ [파일입출력] ▣ 이번장에서는 C++에 파일 입출력을 진행해보도록 하겠습니다. ▣ 먼저 파일입출력을 사용하기 위해서 #include 헤더를 추가해야 합니다. 그리고 ofstream, ifstream를 사용하여 파일을 열어야합니다. ofstream는 쓰기 모드 ifstream은 읽기 모드로 각각 파일을 열어주세요 그리고 디버그를 해보고 프로젝트 파일 안을 확인하면 ▣ 이렇게 ofstream 파일을 열었던 파일이 생성된 걸 확인할 수 있습니다. 그럼 이번에는 ofstream으로 만든 텍스트 파일에 글을 작성해보겠습니다. ▣ ofstream 클래스로 파일을 쓰기 모드를 열고 outfile 2021. 10. 15.
C++ [템플릿_01, template, typename] ▣ 안녕하세요. 이번장에서 템플릿을 공부해보도록 하겠습니다. 우선 필요성에 대해서 생각해보겠습니다. ▣ 우리가 함수 오버 로딩을 공부했습니다. 함수 이름을 동일하게 사용하는 걸 이야기하는데, 이는 자료형이나 매개변수에 수가 다르면 사용할 수 있습니다. sum라는 함수에 하나는 int형으로 하나는 double형으로 반환형을 지정했습니다. ▣ 그리고 main() 함수에서 sum(10, 20), sum(1.4, 4.5)를 각각 출력해보면 매개변수에 값에 자료형에 따라 함수 오버 로딩으로 값이 출력되는 걸 확인할 수 있습니다. 하지만 함수이름이 같기 때문에 반환형에 자료형과 매개변수에 자료형이 어떻게 지정되어 있는지 우리는 알기가 어렵습니다. 직접 코드를 보는 방법도 있지만, 그렇지 못할 경우 반환형이 정수형인.. 2021. 8. 19.