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;
- 순수가상함수는 파생 클래스에서 반드시 구현해야 한다.
- 순수 가상함수가 존재하는 클래스를 추상 클래스라고 한다.
- 또한 순수 가상함수를 포함한 클래스는 그 자체로 변수가 될 수 없다 (인스턴스화 불가능)
- C++는 기본적으로 정적 바인딩이다. 쉽게 말해 자신의 무늬를 따라 가는 것 (자신의 원래 타입!)
- 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 |