C++ TIL day 6

2024. 12. 23. 17:22·C++

1. 프로그래밍 기초

  • Visual Studio 단축키
    • 컴파일 CTRL + F7
    • 실행 F5
  • 값의 전달
    • 일반 변수 전달: 변수를 복사하기 때문에 원본의 값은 변하지 않는다.
    • 배열의 값 전달: 배열의 경우 배열의 첫번째 위치의 값이 들어있는 주소가 전달되기 때문에 원본의 값을 바꿔준다.
    • 참조자를 이용한 전달: 실제 변수의 값 변경
#include <iostream>
using namespace std;

//일반 변수 전달
void ChangeValue(int x)
{
	x = 100;
}

int main()
{
	int num = 1;
    cout << num <<"\n"; //1
    ChangeValue(num);
    cout << num <<"\n"; //1
    
    return 0;
}
#include <iostream>
using namespace std;

//배열의 값 전달
void ChangeArrayValue(int board[], int size)
{
    if (size >= 0)
        board[0] = 100;
}

int main()
{
    int board[5] = { 1,2,3,4,5 };
    cout << board[0] << "\n"; // 1
    ChangeArrayValue(board, 5);
    cout << board[0] << "\n"; // 100

    return 0;
}
#include <iostream>
using namespace std;

//참조 전달
void ChangeValueRef(int& x)
{
    x = 100;
}

int main()
{
    int num = 1;
    cout << num << "\n"; // 1
    ChangeValueRef(num);
    cout << num << "\n"; // 100
}
  • 숙제
#include <iostream>
using namespace std;

int main()
{
	int n;
	cin >> n;

	for (int i = 0; i < 2 * n - 1; ++i)
	{
		if (i < n)
		{
			for (int j = 0; j < n - i - 1; ++j)
			{
				cout << " ";
			}			
			for (int j = 0; j < 2 * i + 1; ++j)
			{
				cout << "*";
			}
			cout << "\n";
		}
		else //4
		{	
			for (int j = 0; j < i - n + 1; ++j)
			{
				cout << " ";
			}

			//4 -> 2
			//5 -> 1
			//6 -> 0
			for (int j = 0; j < 2 * (2 * n - 1 - i - 1) + 1; ++j)
			{
				cout << "*";
			}
			cout << "\n";
		}
	}
	

	return 0;
}

2. Class 개념

  • 헤더파일에 class 정의 & 소스파일에 class 구현
    • 헤더파일에 중복 선언 방지
#ifndef STUDENT_H_ //STUDENT_H_가 정의되어 있지 않은 경우에만 아래 코드를 실행하라는 의미
#define STUDENT_H_ //STUDENT_H_ 정의하기

...
#endif 			   //#ifndef 가 끝났다는 것을 알려줌

 

  • 숙제1
#include <iostream>
using namespace std;

class Battery
{
public:
	Battery(int initCharge = 100)
		:charge(initCharge)
	{
		cout << "Initial Charge : " << charge << "%\n";
	}

	const int GetCharge() const;
	void UseBattery();
	void ChargeBattery();

private:
	int charge;
};

const int Battery::GetCharge() const
{
	return charge;
}

void Battery::UseBattery()
{
	cout << "Battery Used. Current charge: ";
	if (charge > 0)
	{
		charge -= 5;
		if (charge < 0)
			charge = 0;
	}
	cout << charge << "%\n";
}

void Battery::ChargeBattery()
{
	cout << "Battery Charged. Current charge: ";

	charge += 7;
	if (charge > 100)
		charge = 100;

	cout << charge << "%\n";
}

int main()
{
	Battery battery;

	battery.UseBattery();
	battery.UseBattery();
	battery.ChargeBattery();
	battery.UseBattery();
}
  • 숙제2
#include <iostream>
using namespace std;

int GCD(int a, int b)
{
	while (b != 0)
	{
		int temp = b;
		b = a % b;
		a = temp;
	}
	return a;
}

class Fraction
{
public:
	Fraction()
		:numerator(0)
		,denominator(1)
	{}
	Fraction(int num, int denom)
		:numerator(num)
		,denominator(denom)
	{}
	void Simplify();
	Fraction multiply(Fraction other);
	void display();

private:
	int numerator;
	int denominator;
};

void Fraction::Simplify()
{
	int div = GCD(numerator, denominator);
	numerator /= div;
	denominator /= div;
}

Fraction Fraction::multiply(Fraction other)
{
	Fraction res;
	res.numerator = numerator * other.numerator;
	res.denominator = denominator * other.denominator;

	return res;
}

void Fraction::display()
{
	Simplify();
	cout << numerator << "\\" << denominator << "\n";
}


int main()
{
	Fraction f1(2, 4);
	Fraction f2(3, 4);
	
	Fraction result = f1.multiply(f2);

	result.display();
}

3. 객체지향 프로그래밍

1. 상속

  • 공통적인 특성을 반복하여 구현하는 것을 방지하여, 코드 관리를 편하게 하기
  • 상속의 대상(기본 클래스, 부모 클래스) -> 상속을 받는 클래스(파생 클래스)
  • 상속받은 자식을 생성하면, 상속의 대상인 부모 클래스의 생성자가 먼저 호출된 후 자식의 생성자가 호출된다.
    • 소멸자의 경우는 자식의 소멸자 부터 호출

2. 다형성

  • 같은 동작을 하는 것들을 이름은 같지만, 다르게 동작하도록 만들기
    • 대표 클래스를 만들어서 정의만 한 후, 실제 구현은 파생 클래스에서 하기
  • virtual 키워드
    • C++는 기본적으로 정적 바인딩이다. 쉽게 말해 자신의 무늬를 따라 가는 것 (자신의 원래 타입!)
      • 그러나 virtual 을 사용하면, 동적 바인딩이되어 가리키는 대상을 따라간다.
    • 순수 가상 함수
      • virtual void foo() = 0;
      • 순수가상함수는 파생 클래스에서 반드시 구현해야 한다.
      • 순수 가상함수가 존재하는 클래스를 추상 클래스라고 한다.
      • 또한 순수 가상함수를 포함한 클래스는 그 자체로 변수가 될 수 없다 (인스턴스화 불가능)
  • new / delete
    • 정적 배열과 동적 배열 사용 결과
      • 정적 배열의 경우 생성하면, 생성자가 배열의 갯수만큼 호출된다.
      • 동적 배열의 경우 선언했을 이때는 단지 해당 객체를 담을 수 있는 공간만 만든 것
        • 동적 배열이 이후 new 키워드를 사용해서 객체를 생성하면, 그 때 생성자가 호출된다.
#include <iostream>
using namespace std;

class Base
{
public:
	Base()
	{
		cout << "Base 생성자\n";
	}
	virtual ~Base()
	{
		cout << "Base 소멸자\n";
	}
	virtual void foo()
	{
		cout << "Im base virtual \n";
	}

	void bar()
	{
		cout << "Im base\n";
	}
};

class Derived : public Base
{
public:
	Derived()
	{
		cout << "Derived 생성자\n";
	}

	~Derived()
	{
		cout << "Derived 소멸자\n";
	}
	virtual void foo()
	{
		cout << "Im derived virtual \n";
	}

	void bar()
	{
		cout << "Im derived base\n";
	}
};
class Derived2 : public Base
{
public:
	Derived2()
	{
		cout << "Derived2 생성자\n";
	}

	~Derived2()
	{
		cout << "Derived2 소멸자\n";
	}
	virtual void foo()
	{
		cout << "Im derived2 virtual \n";
	}

	void bar()
	{
		cout << "Im derived2 base\n";
	}
};

int main()
{
	cout << "=====  정적 배열  =====\n";
	Base base1[2];
	base1[0].foo();
	base1[1].foo();

	cout << "\n\n===== 동적 배열 =====\n";
	Base* base2[2];
	cout << "-------\n";
	base2[0] = new Derived();
	base2[1] = new Derived2();

	for (int i = 0; i < 2; ++i)
		base2[i]->foo();

	for (int i = 0; i < 2; ++i)
		delete base2[i];

	return 0;
}

위 코드의 실행 결과

  • 숙제
#include <iostream>
using namespace std;

class Adventure
{
public:
	Adventure() = default;
	virtual ~Adventure()
	{}

	const virtual void useSkill() const = 0;
};

class Warrior :public Adventure
{
	const void useSkill() const
	{
		cout << "Warrior use Slash\n";
	}
};

class Mage : public Adventure
{
	const void useSkill() const
	{
		cout << "Mage use Fireball\n";
	}
};

class Archer : public Adventure
{
	const void useSkill() const
	{
		cout << "Archer shoots an Arrow\n";
	}
};

int main()
{
	Adventure* adventure[3];

	adventure[0] = new Warrior;
	adventure[1] = new Mage;
	adventure[2] = new Archer;

	for (int i = 0; i < 3; ++i)
	{
		adventure[i]->useSkill();
	}

	for (int i = 0; i < 3; ++i)
	{
		delete adventure[i];
	}

	return 0;
}

'C++' 카테고리의 다른 글

C++ TIL day 9  (3) 2024.12.27
C++ TIL day 8  (0) 2024.12.26
Smart Pointer 보충  (0) 2024.12.24
C++ TIL day 7  (2) 2024.12.24
C++ 상속  (0) 2024.12.23
'C++' 카테고리의 다른 글
  • C++ TIL day 8
  • Smart Pointer 보충
  • C++ TIL day 7
  • C++ 상속
gbleem
gbleem
gbleem 님의 블로그 입니다.
  • gbleem
    gbleem 님의 블로그
    gbleem
  • 전체
    오늘
    어제
    • 분류 전체보기 (184)
      • Unreal Engine (73)
      • C++ (19)
      • 알고리즘(코딩테스트) (27)
      • TIL (60)
      • CS (4)
      • 툴 (1)
  • 블로그 메뉴

    • 홈
    • 카테고리
  • 링크

    • 과제용 깃허브
    • 깃허브
    • velog
  • 공지사항

  • 인기 글

  • 태그

    상속
    템플릿
    Vector
    blend pose
    gamestate
    enhanced input system
    addonscreendebugmessage
    BFS
    additive animation
    매크로 지정자
    const
    DP
    C++
    싱글턴
    map을 vector로 복사
    actor 클래스
    cin함수
    character animation
    motion matching
    applydamage
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gbleem
C++ TIL day 6
상단으로

티스토리툴바