본문 바로가기

c++ 변수27

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++ 14 [유니폼 초기화] ▣ C++11 이번에는 타입의 초기화 방식이 일정하지 않았다. ▣ C++11부터 타입을 초기화할 때 유니폼 초기화(균일, 중괄호) 초기화를 따르도록 통일 ▣ C++ 11부터 {} 유니폼초기화를 이용해서 초기화 가능 ▣ n4{3}; : 대입연산자(=)를 생략가능하다. ▣ int n5{}; : 빈 중괄호로 초기화할 경우 0으로 초기화 ▣ 유니폼 초기화를 사용해서 구조체, 클래스 모두 초기화가 가능하고 초기화할 경우 생성자가 자동으로 호출 ▣ 동적메모리 할당을 하며 유니폼 초기화를 할 수 있다. 2023. 4. 12.
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++ [가상함수] ▣ 기본클래스, 파생클래스를 선언하고 각각 멤버함수를 선언합니다. 멤버함수의 이름은 동일하게 선언합니다. 그리고 메인함수에서 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++ [인수 객체, 인수 포인터, 인수 레퍼런스] ▣ 클래스 생성, 멤버변수, 멤버함수 생성 ▣ 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++ [Swap, 레퍼런스 인수] ▣ int& num1 == 레퍼런스 인수(주소 값을 저장한다.) ▣ int*p = &num1; 포인터와 동일하지만 포인터는 초기값이 없으면 안 되기 때문에 그 점에 차별점이 있다. ▣ &변수이름 == 변수의 주소를 의미한다. 2023. 2. 8.
C++ 13장 [참조변수] ▣ 안녕하세요. 이번장에서는 참조 변수를 공부하도록 하겠습니다. 참조란 무언가 가리키는 걸 의미합니다. 참조 변수의 개념은 C언어의 포인터와 같은 방식입니다. 그럼 코드를 작성하고 이야기를 이어가겠습니다. ▣ C++에서 참조 변수는 int &p 코드처럼 & 기호를 넣어주면 됩니다. C언어의 포인터 int*p와 거의 비슷합니다. &는 참조자를 의미합니다. 우리가 C언에서 공부했던 것처럼 &를 기호를 변수 이름 앞에 &변수 이름 하면 주소를 의미합니다. 참조 변수를 만들 때 중요한 건 int&p = n; 코드처럼 참조 변수 초기화 시 변수를 대입해줘야 합니다. 대입하지 않으면 오류가 나게 됩니다. 그리고 Calculator& pCal = cal; 코드처럼 객체 클래스도 참조 변수로 사용이 가능합니다. 이제 .. 2022. 11. 4.
C++ 11장 [string] ▣ 안녕하세요. 이번장에서는 string클래스에 대해 공부해보도록 하겠습니다. 문자열은 문자를 여러 개를 관리하는 문자 배열을 의미합니다. 다시 말해 문자를 여러 개 관리하는 메모리를 의미합니다. C언어에서는 char라는 자료형으로 char str [5] 이렇게 문자열을 다뤘습니다. 배열은 처음에 선언할 때 메모리의 크기를 먼저 정하기 때문에 문자열을 저장하고 다루기가 어려웠고 관리하기도 어려움이 많았습니다. 그래서 C++에서는 그점을 개선하기 위해 표준 라이브러리에서 제공하는 클래스, 문자열 객체가 바로 string입니다. string클래스는 문자열의 크기에 맞춰서 메모리 크기를 조절하기 때문에 앞에 이야기한것처럼 메모리의 크기를 지정하고 미리 생각했야 했던 문제들은 쉽게 해결됩니다. 이제 코드를 작성.. 2022. 10. 28.
C++ 8장 [포인터 객체] ▣ 안녕하세요. 이번장에서는 포인터로 객체를 다루는 코드를 공부해보도록 하겠습니다. 포인터는 주소를 저장하는 변수입니다. C언어의 포인터의 개념과 동일합니다. 혹시 포인터를 모르시는 분은 C언어 공부에 포인터 부분을 꼭 공부해보세요. 이제 포인터 객체를 코드를 작성하며 공부해보도록 하겠습니다. ▣ 먼저 기본적인 클래스를 생성해주는 코드와 멤버 함수 코드를 작성해주세요. 그리고 메인 함수에서 Calculator num; 로 객체를 선언합니다. 그런 다음에 포인터를 선언합니다. Calculator* p = num(자료형 변수 이름 = 주소)의 형태로 코드를 작성합니다. 변수를 선언하는 코드와 동일합니다. 그리고 포인터를 이용하여 멤버 함수를 호출해보겠습니다. 포인터에 있는 멤버함수를 접근하기 위해서.(점) .. 2022. 10. 20.
C++ 7장 [인라인 함수] ▣ 안녕하세요. 이번장에서는 인라인 함수를 공부해보겠습니다. 인라인 함수는 인라인 함수 호출 시 그 호출한 코드에 인라인 함수 코드 자체가 안으로 들어가는 함수를 의미합니다. ▣ 정리하면 짧은 코드를 함수로 만들면 함수 호출의 오버헤드가 커서 프로그램 실행 시간이 길어집니다. 오버헤드란 프로그램의 실행 흐름에서 나타나는 현상을 이야기하는데 쉽게 이야기하면 메인 함수로 프로그램을 실행 흐름 중에 다른 곳에 떨어진 위치의 함수 코드를 실행시켜야 할 때, 메모리와 시간을 드리게 됩니다. 그걸 오버헤드 현상이라고 합니다. 만약 우리가 짧은 함수를 호출할 때마다 스택 메모리를 할당하고 함수에 따라 여러 가지 연산을 하는 이 과정들로 하여금 많은 메모리와 시간을 들이게 되면 효과적이지 않고 속도가 저하됩니다. 그렇.. 2022. 10. 13.
C++ 3장 [클래스1] ▣ 안녕하세요. 이번장에서는 클래스를 공부해보겠습니다. 클래스에 대한 부분은 내용이 많아서 여러 장으로 진행하도록 하겠습니다. ▣ 클래스란 객체를 정의하는 틀이나 설계도를 이야기합니다. 클래스는 C언어에서 구조체랑 비슷하다고 생각하시면 됩니다. 클래스를 만들어서 정의하면 그게 객체입니다. 객체는 자신만의 교유한 상태 행동을 구성하고 있습니다. 다시 말해 구조체처럼 클래스 안에 멤버 변수와 멤버 함수를 선언할 수 있습니다. 객체의 상태와 행동으로 생각하시면 됩니다. 그럼 코드를 작성하며 클래스를 공부해보겠습니다. ▣ 클래스를 선언하기 위해서는 class 키워드를 사용해야 합니다. 구조체와 동일한 형식으로 class 키워드, 클래스 이름을 지정해주시고 괄호를 이용하여 클래스의 범위를 지정해줍니다. 중요한 건.. 2022. 9. 30.
C++ 2장 [using 지시어] ▣ 안녕하세요. 이번장에서는 using에 대해 공부해보겠습니다. ▣ 먼저 Hello C++, OK를 출력하는 코드를 작성해보겠습니다. 출력하는 코드를 살펴보면 cout앞에 std::라는 네임스페이스(이름공간, 소속)가 있습니다. 불편하다고는 생각할 수 는 없지만, cout라는 출력하는 키워드를 사용할 때 마다 std:: 붙기 때문에 번거롭다는 느낌을 받게 됩니다. 그럴때 지시어인 using 키워드를 사용하면 됩니다. ▣ using namespace std;로 선언하는 코드를 넣어주면 std:: 네임스페이스를 넣지 않고도 cout을 사용할 수 있습니다. using지시어는 std이름 공간에 선언된 모든 이름에 대해 std::를 생략하기 때문입니다. ▣ 그런데 여기서 주의해야 할 건 std::라는 네임스페이스.. 2022. 8. 24.
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++ [파일입출력] ▣ 이번장에서는 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.