본문 바로가기

c++ 클래스34

C++ 33 [const 메소드, 멤버변수] ▣ const 메소드 : int 함수이름() const {} ▣ const 메소드는 해당 객체 안에 어떠한 값도 바꿀 수 없다. 2023. 10. 18.
C++ 32 [생성자 멤버변수 초기화리스트] ▣ 생성자에서 멤버변수 초기화 리스트 방법 : 클래스이름::생성자이름() : 멤버변수(값), 멤버변수(값) {} ▣ 매개변수가 있는 생성자 초기화 리스트 방법 : 클래스이름::생성자이름(매개변수) : 멤버변수(매개변수), 멤버변수(매개변수) ▣ { } 괄호에 위치가 멤버 변수 리스트 밑에 있어야 하고 : 초기화 리스트시 콜론을 붙이기 ▣ 그럼 number = 20; length = 20 이런 식으로 대입해도 되는데 초기화 리스트를 사용하는 이유는 (=) 대입은 초기화가 된 이후에 대입을 의미하고 () 리스트초기화는 오브젝트가 만들어질 때 초기화하는 것 다시 말해서 멤버변수 대입 없이 초기화, 상수, 참조변수를 초기화할 수 있다. 일반 대입은 불가능하다. ▣ 예시 const int number; , Pla.. 2023. 10. 18.
C++ 26 [포맷플래그 입출력] ▣ 형식상태는 비트 형태로 표현되는 형식 플래그 값에 의해 그 의미가 지정 ▣ long setf(long n) : 형식 플래그를 인수로 받아서 이 플래그 값에 해당하는 비트의 필드를 세팅하는 함수 ▣ long unsetf(n) : setf() 함수와 반대의 기능을 수행하는 함수, 해당 비트를 끝내는 함수 ▣ long flags() : 현재 플래그의 상태를 반환하는 함수 ▣ long flags(long n) : 플래그를 인수 n의 비트 패턴으로 세팅시키고 변경되기 이전의 플래그 값으로 반환 ▣ ios::skipws : 입력 시 공백문자 무시한다. ▣ ios::left : 폭 안에 출력을 왼쪽 정렬 ▣ iost::right : 폭 안에 출력을 오른쪽 정렬 ▣ ios::scientific : 과학산술용 표기로.. 2023. 5. 3.
C++ 25 [람다 표현식] https://learn.microsoft.com/ko-kr/cpp/cpp/lambda-expressions-in-cpp?view=msvc-170 C++ 람다 식 자세한 정보: C++의 람다 식 learn.microsoft.com ▣ 람다 : c++11 표준부터 지원, 람다 표현식, 람다 함수, 이름 없는 함수 ▣ 람다 사용방법 : [캡쳐](매개변수){함수코드;};(호출인자); [](매개변수){함수코드}(호출인자); []{함수코드;}; []{함수코드;}; [](매개변수){함수코드;}; auto n = [](매개변수){함수코드;} ; auto n = [](매개변수) -> 반환형 {함수코드;}; ▣ (;) 세미콜론에 위치는 문장 끝, 함수 끝 부분에 넣어야 한다. 람다식도 동일하다. ▣ 캡처 : 람다 외부 .. 2023. 4. 28.
C++ 24 [STL, map] ▣ map : key와 value로 이루어져 저장하고 key를 이용해서 값을 검색하는 제네릭 컨테이너, 중복을 허용하지 않음 ▣ map을 사용 : #include ▣ map 객체 : map 객체이름 ▣ map 값 접근 : dic[key] ▣ insert() : map에 삽입, 단 key가 중복되면 삽입을 하지 않는다. ▣ erase(포인터) : 가리키는 포인터 원소 삭제 ▣ begin() : 첫 번째 map 주소 반환 ▣ end() : 마지막 map 다음 주소 반환 ▣ at() : map에 키 값에 값을 반환 ▣ find(key) : map에 key를 가리키는 iterator(포인터) 반환 ▣ d->first : 주소에 값 접근 ▣ empty() : map이 비어 있으면 true 반환 ▣ clear() .. 2023. 4. 26.
C++ 20 [추상클래스, 순수가상함수] ▣ 순수 가상 함수 : 함수에 코드(원형)는 없고 선언만 하는 가상함수 ▣ 추상 클래스 : 순수 가상 함수가 포함되어 있는 클래스 ▣ 순수 가상 함수가 선언되었기 때문에 자식 클래스에서 오버라이딩을 해야 한다, 그렇지 않으면 추상 클래스의 인스턴스(객체)를 생성할 수 없다. ▣ 추상 클래스의 목적 : 순수 가상 함수를 통해서 자식 클래스가 구현할 함수의 원형을 보여주는 인터페이스 역할 ▣ 추상 클래스로 함수에 선언부를 잡아놓고 자식클래스에서 그 목적에 맞게 다시 구현(정의)해서 사용하기 때문에 선언부와 구현부를 나누어서 사용 가능 2023. 4. 20.
C++ 18 [상속, 다중상속, 가상상속] ▣ 상속 : 부모클래스(기본클래스), 자식 클래스(파생클래스)에 관계를 의미 ▣ 클래스 간에 상속을 하는 이유 : 클래스 재활용 및 생산성, 관리에 용이하기 때문 ▣ 상속 방법 : class 자식클래스명 : public 부모클래스명 { }; ▣ 부모클래스에 public, private, protected 모두 사용 가능 ▣ 상속 횟수는 제한이 없고 상속받은 자식클래스는 부모의 모든 멤버를 접근 가능 ▣ protected 접근지정자는 상속받은 클래스는 접근이 가능 ▣ 자식클래스가 부모클래스를 상속할 때에도 생성자, 소멸자 모두 실행 ▣ 자식클래스를 객체로 사용할 때 부모클래스 생성자 호출 -> 자식클래스 생성자 호출 -> 자식클래스 소멸자 호출 -> 부모클래스 소멸자 호출, 이런 순으로 실행 ▣ 이러한 생.. 2023. 4. 19.
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++ 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++ 03 [클래스, 멤버변수, 멤버함수, 생성자, 소멸자, 접근지정자] ▣ 클래스 : 설계도, 틀 ▣ 객체 : 설계도로 생성된 완성품 ▣ 클래스 선언 : class 클래스이름 { }; , class 키워드를 앞에 붙여야 한다. ▣ 멤버변수 : 클래스내부에서 선언하는 변수 ▣ 멤버함수 : 반환형 클래스이름::멤버함수이름(매개변수){ } 순으로 생성한다. , (::)는 범위지정연산자 ▣ 접근지정자 : public: 클래스 내부, 외부 모두 접근이 가능한 접근지정자 ▣ 객체생성 : 클래스이름(자료형) 변수이름;으로 지정한다. 구조체를 생성하는 것과 동일하다. ▣ p1.Damage(50); 객체에 접근할 때에는. 점을 사용한다. ▣ 생성자 : 객체가 생성될 때 자동으로 한번 호출되는 함수, 생성자는 클래스 이름과 동일하게 작성해야 한다. 생성자는 리턴 타입 반환형을 선언하지 않는다.. 2023. 3. 10.
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.
언리얼엔진5 15장 [함수] ▣ 안녕하세요. 이번장에서는 함수에 대해 공부해 보도록 하겠습니다. ▣ 먼저 Content Drawer메뉴에서 Content폴더에 오른쪽마우스를 클릭해서 Buleprints에 Buleprint Function Library를 클릭해서 함수를 생성하겠습니다. 그런 다음 함수의 이름을 Sum이라고 하고 더블클릭을 하여 함수 편집 메뉴에 들어갑니다. ▣ 그런 다음에 왼쪽에 보면 FUNCTIONS메뉴가 있는데 여기에서 함수 이름을 Sum으로 바꾸고 Details메뉴에서 Inputs 메뉴에 + 버튼을 클릭하여 2개의 매개변수를 생성하고 num1, num2 이름으로 integer 형식으로 지정합니다. 그리고 Outputs메뉴에서 한 개의 sum 반환형 변수를 생성합니다. 그리고 위에 코드처럼 num1 + num2를.. 2023. 1. 27.
C++ 18장 [템플릿1] ▣ 안녕하세요. 이번장에서는 템플릿에 대해 공부해보도록 하겠습니다. C++에서 함수를 작성하다 보면 함수의 이름을 동일하게 만드는 경우가 있습니다. 같은 의도로 다른 자료를 받는 경우에 그렇습니다. 그걸 오버 로딩이라고 하는데 이럴 경우 반환형이나 매개변수에 자료형(데이터 타입)을 모두 다 다르게 하여 구분을 해서 함수를 만들기도 합니다. 하지만 우리가 모든 자료형(데이터 타입)의 경우의 수를 다 생각하고 함수를 만들 수는 없습니다. 그렇기 때문에 템플릿을 사용해야 합니다. 템플릿은 형판이라는 뜻을 가지고 있으며, 함수에서 매개변수에 자료형 타입만 다른 중복된 함수들을 일반화시킨 틀을 템플릿이라고 합니다. 설명만 들으면 어려울 수 있으니 코드를 작성하며 공부해보도록 하겠습니다. ▣ 템플릿을 작성하려면 t.. 2022. 11. 24.
C++ 17장 [프렌드 함수] ▣ 안녕하세요. 이번장에서는 프렌드 함수를 공부해보도록 하겠습니다. C++에서 객체(클래스)의 private 멤버에는 해당 객체가 public 멤버 함수를 통해서만 접근이 가능했습니다. 하지만 상황에 따라 객체의 멤버 함수가 아닌 일반 함수도 private 멤버에 접근해야만 할 경우가 있습니다. 이럴 때 프렌드 함수를 사용합니다. 프렌드 함수를 사용하기 위해서는 프렌드(friend)라는 접근 제어 키워드를 사용해야 합니다. 코드를 작성하며 공부해보도록 하겠습니다. ▣ 먼저 클래스를 선언해주시고 public: 접근 연사자에서 friend 키워를 넣어 접근할 함수를 작성합니다. 그리고 함수의 매개변수에 (Calculator c)를 매개변수로 주시고 sum(Claculator c) 코드에서 처럼 매개변수 클래.. 2022. 11. 18.