상속
자식(하위) 클래스가 부모(상위) 클래스의 모든 기능을 물려받는 것.
자식클래스의 패딩은 자식 클래스의 자료형을 기준으로 다시 맞춰진다.
만약 부모클래스의 최대 자료형이 int(4byte)이고
자식클래스의 최대 자료형이 long long(8byte)이라면 8byte를 기준으로 다시 패딩이 설정된다.
상속에 사용되는 접근제한 지정자는 일반적으로 public
C#이나 자바에서는 아예 public 키워드를 사용하지 않는다.
이중상속
두 개 이상의 클래스에서 상속을 받는 것을 말한다.
두 부모클래스에 같은 이름의 멤버 변수나 함수가 있으면 복잡해진다.
그러나 컴파일은 정상적으로 되고 문제없는 문법이다.
A::Test()
B::Test()
이런식으로 실제로는 식별하기 위한 클래스 명이 붙기 때문에
내 경우에는 복잡한 것을 싫어해서 선호하지 않는다.
has-a와 is-a관계
is-a
상속구조에서 온전히 상속받은 클래스를 포함하고 있는 관계를 말한다.
사실상 상속이면 Is A 관계라고 할 수 있다.
has-a
다른 클래스의 기능 중에서 필요한 것들만 가져다 쓴다.
이러한 구조를 컴포넌트 구조라고 합니다.
포함 관계를 말합니다. 어떤 것을 가지고 있으면 Has A 입니다.
플레이어 클래스의 멤버 변수로 무기 클래스 weapon을 가지고 있고 weapon의 함수를 가져다 쓰는 관계
예외처리
예외처리할 때 꼭 로그 기록할 것
문제가 생기면 코드를 터뜨려라
assert(조건)
조건이 false일 경우 에러를 내면서 코드가 종료된다.
OutputDebugStringA("");
디버그 로그 창에 메세지를 출력한다.
MessageBoxA(nullptr, "내용", "", MB_OK);
특정 내용을 담은 메세지 박스를 띄운다.
typedef와 using
typedef long long ll;
using ll = long long;
ll a = 0;
어떤 자료형에 이러한 별명을 붙이겠다는 문법
위의 코드는 long long대신 ll을 입력하는 것으로 long long 자료형처럼 사용할 수 있다.
using은 typedef의 가독성이 떨어진다고 하여 새롭게 만든 문법으로 둘은 사실상 동일하다.
그러나 모던 c++에서는 using을 사용하는 것을 권장하고 있다.
typedef가 구조체에 사용되는 경우는 뭔가요?
예전 c 문법은 구조체를 작성하면
struct MyStruct {};
이 구조체를 사용하기 위해서 선언할 때 struct키워드까지 붙여서
struct MyStruct mySt = ....;
이런식으로 작성해야 했다.
그래서
typedef struct __MyStruct
{
...
}MyStruct;
int main()
{
//struct __MyStruct A
MyStruct A = ...
}
이렇게 작성하면 익숙한 방식으로 구조체를 사용할 수 있었기 때문에 이런 문법을 사용한 코드가 있을 수 있다고 한다.
전처리문
전처리문은 세미콜론을 통해서 구문마침을 명시할 필요가 없다.
#define MAX 10000
MAX라는 문자가 나오는 위치에 그대로 갖다박는다.
역슬래쉬로 전처리문을 다음줄과 연결 할 수 있다.
모던 c++에서는 const를 대신 사용할 것을 권장하고 있다.
#define MACRO(TEXT) printf(TEXT)
이런식으로 MACRO에 인자를 넣을 수도 있는데
매크로 쓸 때는 주의해야할 점이 있다.
이런 매크로 전처리문이 있다고 하자.
#define MUL(x) x*x
#define ADD(x) x+x
MUL(ADD(10))
일반적으로 이러한 식을 보면 (10+10)*(10+10) = 400이라고 생각할 수도 있다.
그런데 실제로 실행해보면
x*x의 자리에 ADD(10)가 들어가게 될 것이다.
ADD(10)*ADD(10)
10+10*10+10 = 120
그냥 그자리에 식을 치환하는 것이기 때문에 연산 순서가 보장되지 않고 의도한 것과 다른 결과값을 얻을 수도 있다.
그래서 주의해야 한다.
복사생성자
복사 생성자와 대입 연산자는 아무런 작성도 하지 않아도 알아서 생성된다.
class Player
{
Player() {}
~Player() {}
Player(const Player& _Other);
Player(Player&& _Other) noexcept;
Player& operator=(const Player& _Other);
Player& operator=(Player&& _Other) noexcept;
...
}
Player(const Player& _Other);
Player(Player&& _Other) noexcept;
와 같이 초기화 할때 다른 객체를 통해 초기화 하는 생성자를 복사 생성자라고 한다.
operator overloading
함수 오버로딩이란 같은 이름의 함수를 인자에 따라 다르게 동작하게 하는 것.
연산자 오버로딩은 C++에서 제공하는 기본 자료형이 아닌 사용자 정의 자료형. 즉, 클래스나 구조체와 같은 자료형에도 연산자를 사용할 수 있도록 연산자의 역할을 정의해주는 것
int operator<(const Player& _Other)
{
return 10;
}
// int Value0 = NewPlayer0.operator<(NewPlayer1);
int Value0 = NewPlayer0 < NewPlayer1;
이런 식으로 클래스 간의 연산자를 정의해서 사용할 수 있다.
'개인 공부 및 프로젝트 > 국비과정' 카테고리의 다른 글
20240930 - 선언과 구현, 파일 입출력 (3) | 2024.10.07 |
---|---|
20240927 - 연산자 오버로딩 (0) | 2024.09.30 |
20240925 - 프로그래밍 패러다임, 클래스 (11) | 2024.09.30 |
20240924 - MyPrintf, 객체지향 패러다임 (0) | 2024.09.30 |
20240923 - const, 랜덤 (0) | 2024.09.24 |