๊ฐ์ฒด์งํฅ์ ๊ทผ๊ฐ์ด ๋๋ ์ธ์ด. ๊ธฐ๋ณธ ๋จ์๋ฅผ ๊ฐ์ฒด๋ก ํ๋ค.
์ถ์ํ, ์บก์ํ, ๋คํ์ฑ, ์์
์์๊ณผ ๋คํ์ฑ์ ์ฌ์ฉํด ์ฌ์ฌ์ฉ์ฑ์ ๋์์ผ๋ก์จ ์ฝ๋๋ฅผ ์ค์ผ ์ ์์.
๊ฐ์ฒด: Object. ์ฌ๋ฌผ์ ๋ํ๋ด๋ ์ถ์์ ์ธ ๊ฐ๋ .
์ ์ฐจํ ํ๋ก๊ทธ๋๋ฐ: ๊ธฐ๋ฅ ๋จ์ ⇒ ํจ์
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ: ๊ธฐ๋ฅ ๋จ์ ⇒ ๊ฐ์ฒด(ํด๋์ค. ๋ณ์+ํจ์)
๐ํด๋์ค(Class)
์ฐ๊ด์ด ์๋ ๋ฐ์ดํฐ์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ํจ์๋ฅผ ํ๋๋ก ๋ฌถ์ด ๋์ ์ถ์์ ๋ฐ์ดํฐํ(์ฌ์ฉ์ ์ ์ ํ์ ). ๋ฉค๋ฒ ๋ณ์์ ๋ฉค๋ฒ ํจ์๋ฅผ ๊ฐ์ง๋ค.
์์ฑ์, ์๋ฉธ์(C#, Java, JavaScript์์๋ ์ฌ์ฉํ์ง ์์), ๋ฉค๋ฒ ๋ณ์, ๋ฉ์๋.
๊ฐ์ฒด ์์ฑ
์คํ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ: ๋ณ์ ์ ์ธ
void exampleFunction() {
TV myTV; // ์คํ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ
myTV.power(true);
// myTV๋ ํจ์ ๋ธ๋ก์ด ๋๋๋ฉด ์๋์ผ๋ก ํ๊ดด๋จ
}
ํ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ: ํด๋น ์๋ฃํ์ ํฌ์ธํฐ์ new ์ฐ์ฐ์๋ก ๊ฐ์ฒด ์์ฑ ํ ์ฐธ์กฐ
void exampleFunction() {
TV* myTV = new TV(); // ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ
myTV->power(true);
delete myTV; // ๋ฉ๋ชจ๋ฆฌ ํด์
}
new ์ฐ์ฐ์๋ ๊ฐ์ฒด๋ฅผ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋์ ์ผ๋ก ์์ฑํ๊ณ ํด๋น ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ๋ฐํํ๋ค. ํฌ์ธํฐ ๋ณ์๋ก ์ฐธ์กฐํ ์ ์๋ค.
delete ๋ก ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ผ ํ๋ค.
์ ๊ทผ ์ ์ด์(์ ๊ทผ ์ง์ ์)
ํด๋์ค ์์ฑ ์ ์ ๊ทผ ์ ํ์๋ฅผ ์ง์ ํ ์ ์๋ค. private protected public
private ์๊ธฐ ์์ ์ ์ ์ธํ ๋ชจ๋ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์์.
public ๊ณต๊ฐ(์ ํ ์์)
protected ์์ ๊ด๊ณ์์ ์ฌ์ฉํ ์ ์์. ์ธ๋ถ์์ ์ ๊ทผํ ์ ์์.
์ ๊ทผ ์ ์ด์๋ฅผ ์๋ตํ๋ฉด ๊ธฐ๋ณธ์ผ๋ก private ์ด ๋๋ค.
๋ณ์๋ฅผ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก ์ ํํ๋ฉด, ์ธ๋ถ์์ ๋ฐ์ดํฐ๋ก ์ ๊ทผํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด์ผํ๋ค.
#include <iostream>
class MyClass{
private:
int a;
public:
int b;
void setA(int a) {
this->a = a;
}
int getA() {
return this->a;
}
}
void main(){
MyClass m;
m.a = 10; // ๋น๋ ์๋ฌ: ๋ฉค๋ฒ MyClass::a์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
m.b = 10;
m.setA(10);
std::cout << m.getA() << std::endl; // 10
}
ํจ์ ์ ์ธ๋ถ๊ณผ ์ ์๋ถ๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ค.
class MyClass {
private:
int a;
int b;
public:
void setA(int a);
};
void MyClass::setA(int a) {
this->a = a;
}
void main() {
MyClass m;
m.setA(10);
}
์์ฑ์(Constructor)
๊ฐ์ฒด ์์ฑ ์ ๋ฉค๋ฒ ๋ณ์์ ์ด๊ธฐ๊ฐ์ ๋ฃ์ด์ฃผ๋ ํจ์. ๋ฉค๋ฒ ๋ณ์์ ์ด๊ธฐํ๋ฅผ ๋ด๋นํ๋ ๊ธฐ๋ฅ์ผ๋ฟ ๊ฐ์ ๋ฐํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฆฌํด ํ์ ์ ์ง์ ํ์ง ์์ผ๋ฉฐ(void๋ ์ฐ์ง ์๋๋ค.) ํจ์ ์ด๋ฆ์ ํด๋์ค ์ด๋ฆ๊ณผ ๋์ผํ๋ค. ๊ฐ์ฒด ์์ฑ์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์๋์ผ๋ก ํธ์ถ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์๋ ๊ธฐ๋ณธ ์์ฑ์์ ๊ฒฝ์ฐ ๊ฐ์ฒด ์ ์ธ ์์ ์๋์ผ๋ก ํธ์ถ๋๋ค.
์์ฑ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ ์ ์๋ค. ์ฆ, ์์ฑ์๋ฅผ ์ค๋ฒ๋ก๋ฉ ํ ์ ์๋ค.
#include <iostream>
class MyClass{
private:
int a;
int b;
public:
MyClass(){
this->a = 1;
this->b = 2;
}
MyClass(int a, int b){
this->a = a;
this->b = b;
}
void getA(){
return this->a;
}
void getB(){
return this->b;
}
}
void main(){
MyClass m1;
std::cout << "m1.a = " << m1.getA() << std::endl;
MyClass m2 = MyClass(10, 20);
std::cout << "m2.a = " << m2.getA() << std::endl;
}
1
10
๊ธฐ๋ณธ ์์ฑ์(Default Constructor)
๋งค๊ฐ๋ณ์๋ ์ค๊ดํธ ๋ด๋ถ๋ ์๋ ์์ฑ์. ์์ฑ์๋ฅผ ๋จ ํ๋๋ ์ ์ธํ์ง ์์ผ๋ฉด ๋งค๊ฐ๋ณ์์ ๋ด๋ถ๊ฐ ๋น์ด์๋ ์์ฑ์๊ฐ ์๋์ผ๋ก ์์ฑ๋๋ค.
์๋ฉธ์(Destructor)
๊ฐ์ฒด ์งํฅ ์ธ์ด์๋ ์๋ฉธ์๊ฐ ๋ฐ๋์ ์กด์ฌํ๋ค. ๋จ, ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์กด์ฌํ๋ ์ธ์ด์ ๊ฒฝ์ฐ ์๋ฉธ์์ ํ์๋ฅผ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์คํํ๋ค.
ํจ์ ์ด๋ฆ์ ํด๋์ค ์ด๋ฆ ์์ ~ ๋ฅผ ๋ถ์ฌ ์ ์ธํ๋ค. ๊ฐ์ฒด๊ฐ ํ๊ดด๋ ๋ ์๋์ผ๋ก ํธ์ถ๋๋ค. ์์ฑ์์ ๋ฌ๋ฆฌ ์ค๋ฒ๋ก๋ฉํ ์ ์๋ค. (๋จ ํ ๊ฐ๋ง ์ ์ธํ ์ ์๋ค. )
- ์คํ ๋ฉ๋ชจ๋ฆฌ๋ First In Last Out ๊ตฌ์กฐ๋ก ๋์ค์ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ๋จผ์ ์๋ฉธ๋๋ค.
#include <iostream>
class MyClass{
private:
int a;
int b;
public:
MyClass(){
this->a = 1;
this->b = 2;
}
~MyClass(){
std::cout << "bye!" << std::endl;
}
void getA(){
return this->a;
}
}
void main(){
MyClass m1;
std::cout << "m1.a = " << m1.getA() << std::endl;
}
1
bye!
class์ struct
C์ธ์ด์๋ ์ ๊ทผ์ ํ์๊ฐ ์กด์ฌํ์ง ์๋๋ค. C++์์๋ struct์๋ ์ ๊ทผ์ ํ์๋ฅผ ์ ์ฉํ ์ ์์ง๋ง, ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฐ๋ ์ธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
struct ์ class ๋ ๋น์ทํ์ง๋ง ๊ธฐ๋ณธ ์ ๊ทผ ์ ์ด์์ ์ฐจ์ด๊ฐ ์์.
struct ๋ ๊ธฐ๋ณธ์ ์ผ๋ก public ์ ๊ทผ ์ ์ด๋ฅผ ์ ๊ณตํ๋ค. ๋ฐ์ดํฐ ์ค์ฌ์ผ๋ก ์ค๊ณํ ๋ ์ ์ฉํ๋ค.
class ๋ ๊ธฐ๋ณธ์ ์ผ๋ก private ์ ๊ทผ ์ ์ด๋ฅผ ์ ๊ณตํ๋ค. ๋ฐ์ดํฐ ๋ณดํธ ๋ฐ ๊ฐ์ฒด ์งํฅ ์ค๊ณ(์บก์ํ)์ ์ ํฉํ๋ค.
๋ ๋ค ๋ค์ค ์์์ ์ง์ํ์ง๋ง class ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
struct MyStruct {
int x; // ๊ธฐ๋ณธ์ ์ผ๋ก public
};
class MyClass {
int x; // ๊ธฐ๋ณธ์ ์ผ๋ก private
};
๊ฐ์ฒด(Object)
์ค์ธ๊ณ์ ์กด์ฌํ๊ฑฐ๋ ์ถ์์ ์ธ ๊ฐ๋ .
๊ฐ์ฒด? ์ธ์คํด์ค?
๊ฐ์ฒด๋ฅผ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ผ๋ก ๋๋์ด ์ ์ธํ ํด๋์ค๋ก๋ถํฐ ํ๋ก๊ทธ๋จ ๋ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ฉ๋ชจ๋ฆฌ์ ์์ฑํ ๊ฒ์ ์ธ์คํด์ค๋ผ๊ณ ํ๋ค.
์๋ฐ์ ๊ฒฝ์ฐ ๊ฐ์ฒด ๋ณ์๋ ๋ชจ๋ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ๊ฐ์ง ๊ฐ์ฒด ํฌ์ธํฐ์ง๋ง, C++์ ๊ฒฝ์ฐ int ๋ฑ์ ๊ธฐ๋ณธ ์๋ฃํ์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์ง์ ๊ฐ์ง๊ณ ์๋ ๋ณ์์ด๋ฏ๋ก, ๋ณ์๋ ๊ฐ์ฒด ๊ทธ ์์ฒด๋ก ๋ณผ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ฒด mp1 ์ด ์๊ณ ๊ฐ์ฒด mp2 ๊ฐ ์์ ๋, mp2 ์ mp1 ๋ฅผ ๋์ ํ๋ฉด ์ฃผ์๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฒด ์์ฒด๊ฐ ๋ณต์ฌ๋๋ฏ๋ก(๊น์ ๋ณต์ฌ), ๋ ๊ฐ์ฒด๋ ๊ฐ๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ค.
MousePoint mp1 = MousePoint(10, 20); // ํน์ MousePoint mp1(10, 20);
MousePoint mp2 = MousePoint(100, 200);
mp1 = mp2
mp1.setX(999);
cout <<"mp1.x :" << mp1.getX() << endl;
cout <<"mp2.x :" << mp2.getX() << endl;
mp1.x : 999
mp2.x :10
๋ง์ฝ mp1 ๊ณผ mp2 ๊ฐ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ(์์ ๋ณต์ฌ)ํ๊ณ ์์๋ค๋ฉด mp1.setX(999); ์ดํ๋ก๋ mp1 ์ x ์ mp2 ์ x ๋ชจ๋ 999๊ฐ ๋์ด์ผ ํ๋ค.
๊ทธ๋ฌ๋ ๋ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์, ์ถ๋ ฅํด๋ณด๋ฉด ๊ฐ๊ฐ์ ๊ฐ์ด ๋์ค๋ ๊ฒ์ ์ ์ ์๋ค.
๊ฐ์ฒด ๋ฐฐ์ด
์ฌ์ฉ์ ์ ์ ์๋ฃํ(ํด๋์ค)์ผ๋ก ์์ฑ๋ ๊ฒ์ ๊ฐ์ฒด(์ธ์คํด์ค)๋ผ๊ณ ํ ๋, ๋ค์์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๋ฐฐ์ด. ๋ค์์ ๊ฐ์ฒด๋ฅผ ํ ๋ฒ์ ๋ค๋ฃจ๊ณ ์ถ์ ๋ ๊ทธ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด์ ๋ด์ ๊ฒ์ด ๊ฐ์ฒด ๋ฐฐ์ด์ด๋ค.
๊ฐ์ฒด ๋ฐฐ์ด์ ๊ฐ์ฒด๋ ์์ฑ์๋ฅผ ํธ์ถํ ์ ์๋ค.
#include <iostream>
using namespace std;
class MousePoint {
private :
int x, y;
public :
MousePoint(int x, int y) {
this->x = x;
this->y = y;
}
void setXY(int x, int y) {
this->x = x;
this->y = y;
}
int getX() {
return this->x;
}
int getY() {
return this->y;
}
};
void main() {
MousePoint mpArr[3] = { MousePoint(10, 20), MousePoint(30, 40), MousePoint(50, 60) };
for (int i = 0; i < sizeof(mpArr) / sizeof(mpArr[0]); i++) {
cout << "[" << i + 1 << "] x: " << mpArr[i].getX() << ", y: " << mpArr[i].getY() << endl;
}
}
[1] x: 10, y: 20
[2] x: 30, y: 40
[3] x: 50, y: 60
๊ฐ์ฒด ํฌ์ธํฐ
๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ๋ณ์. ๊ฐ์ฒด๋ฅผ ๊ฐ์ ์ฐธ์กฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
์๋ฐ์ ๋ชจ๋ ๊ฐ์ฒด ๋ณ์๋ ๊ฐ์ฒด ํฌ์ธํฐ๋ค.
MousePoint ms(10, 20);
MousePoint* msPtr;
msPtr = &ms;
cout << msPtr->getX() << endl;
new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ ๊ฒฝ์ฐ ๊ฐ์ฒด๊ฐ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๊ฒ ๋๋๋ฐ, ์ด๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํ ๋ณ์๋ ์คํ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ค.
MousePoint* msPtr = new MousePoint();
์์์ ์๋ฐ์ ๊ฐ์ฒด ๋ณ์๋ ๋ชจ๋ ๊ฐ์ฒด ํฌ์ธํฐ๋ผ๊ณ ํ๋ค. ์๋ฐ๋ ํฌ์ธํฐ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ * ํฌ์ธํฐ๋ฅผ ์๋ตํ๋ค.
this ํฌ์ธํฐ
๋ฉค๋ฒ ํจ์๋ฅผ ํธ์ถํ ๊ฐ์ฒด ์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ. ํ๋์ ํด๋์ค๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ ๋, ๋ฉค๋ฒ ํจ์๋ฅผ ํธ์ถํ ๊ฐ์ฒด๊ฐ ์ด๋ค ๊ฐ์ฒด์ธ์ง ์ฃผ์๋ฅผ ์ ๋ฌํด์ค๋ค.
์ฆ, ๋ฉค๋ฒ ํจ์์ ์ธ์๋ก ๊ฐ์ฒด(์ธ์คํด์ค)์ ์ฃผ์๊ฐ ์ ๋ฌ๋๋ค. ๋ฉค๋ฒ ํจ์๋ฅผ ์ ์ํ ๋, ์ปดํ์ผ๋ฌ๋ ๊ฐ์ฒด ํฌ์ธํฐ๋ฅผ ํ๋ ์ถ๊ฐํ๋ค.
void SetID(int id){
this->id = id;
}
์ ๋ฉค๋ฒ ํจ์์ ์ ์๋ ์ปดํ์ผ๋ฌ์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋๋ค.
void SetId(MyClass* const this, int id){
this->id = id;
}
๋ชจ๋ ๋ฉค๋ฒํจ์๋ ์ปดํ์ผ๋ฌ์ ์ํด ํจ์๊ฐ ํธ์ถ๋ ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ ๊ฐ๋ฆฌํค๋ this ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๋ค.
this ํฌ์ธํฐ๋ก ์๊ธฐ ์์ ์ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋๋ก ํจ์๋ฅผ ์์ฑํ๋ฉด ๋ฉ์๋ ์ฒด์ด๋์ ์ฌ์ฉํ ์ ์๋ค.
MyClass& SetId(int id){
this->id = id;
return this*;
}
MyClass& SetName(std::string name){
this->name = name;
return this*;
}
void main(){
MyClass c = MyClass();
c.SetId(1).SetName("์๋ก์ด์ด๋ฆ");
}
์ ๋ฌ ์ธ์๊ฐ ๊ฐ์ฒด์ธ ํจ์(Call by value)
์ธ์๋ก ์ฌ์ฉ์ ์ ์ ํ์ ์ ๋ณ์๋ฅผ ๋ฐ์์ฌ ๊ฒฝ์ฐ ๊ฐ์ฒด ํฌ์ธํฐ๊ฐ ์๋ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ณต์ฌํด์ ๋ฐ์์จ๋ค.
call by value๋ก ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด์ ์๋ก ๊ฐ์ ธ์ค๋ ๊ฒ. ์๋ฐ์ ๋ฌ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ค์ง ์๋๋ค. ์๋ฐ๋ call by reference.
void SetRect(MousePoint mp1, MousePoint mp2) {
cout << "[ํจ์ ๋ด mp1]" << mp1.getX() << " ," << mp1.getY() << endl;
cout << "[ํจ์ ๋ด mp2]" << mp2.getX() << " ," << mp2.getY() << endl;
mp1.setXY(1000, 2000);
cout << "[๋ณ๊ฒฝ ํ mp1]" << mp1.getX() << " ," << mp1.getY() << endl;
}
[ํจ์ ๋ด mp1]10 ,20
[ํจ์ ๋ด mp2]100 ,200
[๋ณ๊ฒฝ ํ mp1]1000 ,2000
[ํจ์ ํธ์ถ ํ]10 ,20
๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด์ ๋๊ฒจ์ฃผ์๊ธฐ ๋๋ฌธ์,ํจ์ ๋ด๋ถ์ mp1 ๊ณผ ๋ฉ์ธ ํจ์์ mp1 ์ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๋ค. ์ฆ, ๋ค๋ฅธ ์ฃผ์์ด๊ธฐ ๋๋ฌธ์ ํจ์ ๋ด๋ถ์์ mp1 ์ ๋ณ๊ฒฝํ๋๋ผ๋ ๋ฉ์ธ ํจ์์ mp1 ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
์ ๋ฌ ์ธ์๊ฐ ๊ฐ์ฒด ์ฃผ์์ธ ํจ์(Call by reference)
`์ฌ์ฉ์์ ์ํ์ &` ๋ก ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ์ ๋ฌํ ์ ์๋ค. ๋ณ์นญ์ ์ค์ ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ์.
void CopyObject(MousePoint& mp1, MousePoint& mp2) {
cout << "void CopyObject() -----------------" << endl;
cout << "[mp1]" << mp1.getX() << ", " << mp1.getY() << endl;
cout << "[mp2]" << mp2.getX() << ", " << mp2.getY() << endl;
mp1 = mp2;
mp1.setXY(12, 24);
cout << "mp1.setXY(12, 24); ----------------------------" << endl;
cout << "[mp1]" << mp1.getX() << ", " << mp1.getY() << endl;
cout << "[mp2]" << mp2.getX() << ", " << mp2.getY() << endl;
cout << "mp1 = mp2; ----------------------------" << endl;
mp1 = mp2;
cout << "[mp1]" << mp1.getX() << ", " << mp1.getY() << endl;
cout << "[mp2]" << mp2.getX() << ", " << mp2.getY() << endl;
mp2.setXY(1200, 2400);
cout << "mp2.setXY(1200, 2400); ----------------------------" << endl;
cout << "[mp1]" << mp1.getX() << ", " << mp1.getY() << endl;
cout << "[mp2]" << mp2.getX() << ", " << mp2.getY() << endl;
cout << "----------------------------" << endl;
}
MousePoint mp1(10, 20);
MousePoint mp2(100, 200);
//SetRect(mp1, mp2);
CopyObject(mp1, mp2);
cout << "[ํจ์ ํธ์ถ ํ]" << mp1.getX() << ", " << mp1.getY() << endl;
cout << "[ํจ์ ํธ์ถ ํ]" << mp2.getX() << ", " << mp2.getY() << endl;
void CopyObject() -----------------
[mp1]10, 20
[mp2]100, 200
mp1.setXY(12, 24); ----------------------------
[mp1]12, 24
[mp2]100, 200
mp1 = mp2; ----------------------------
[mp1]100, 200
[mp2]100, 200
mp2.setXY(1200, 2400); ----------------------------
[mp1]100, 200
[mp2]1200, 2400
----------------------------
[ํจ์ ํธ์ถ ํ]100, 200
[ํจ์ ํธ์ถ ํ]1200, 2400
๊ทธ๋ฌ๋ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด mp1 = mp2 ๋ผ๊ณ ๋์ ํ์ ๋, ์๋ฐ์ฒ๋ผ ์์ ๋ณต์ฌ๋ก ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ์ฒด์ ๊ฐ๋ง์ ๋ณต์ฌํด์ฃผ๊ณ ์ฌ์ ํ ๊ฐ์ฒด ์์ ์ ์ฃผ์๊ฐ์ ๊ฐ์ง๋ค. ์ฆ, mp1 = mp2 ๋ผ๊ณ ๋์ ์ ํ๋๋ผ๋ ํฌ์ธํฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ์ง์ง ์๋๋ค.
๋ณ์นญ์ ์ค์ ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ์!!! ์ฐธ์กฐ๋ก ๋๊ฒจ์ฃผ๋๋ผ๋ ํฌ์ธํฐ์ฒ๋ผ ์ฃผ์๊ฐ์ ๊ฐ์ง ๋ณ์๊ฐ ์๋๋ค. ๊ฐ์ฒด ๋ณ์๋ค.
- ์ดํ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋ ๊ฒฝ์ฐ์๋ ๋ณ์๋ ์คํ, ๊ฐ์ฒด๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ๊ฐ์ฒด๋ฅผ ํฌ์ธํฐ๋ก ์ฐธ์กฐํด์ผํ๋ค. new ์ฐ์ฐ์๋ ํ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ทธ ๊ฐ์ฒด ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค.
const ํจ์
์ฌ์ ⇒ constant : ์์(ๅธธๆธ, constant)๋ ์์์์ ๋ณํ์ง ์๋ ๊ฐ์ ๋ปํ๋ค. ์ด๊ฒ์ ๋ณํ๋ ๊ฐ ๋ณ์์ ๋ฐ๋์ด๋ค. // ์ํค๋ฐฑ๊ณผ ํจ์์์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํ๋๋ก ์ ํํ๋ ์ฝ๊ธฐ ์ ์ฉ ํจ์. ํจ์ ์๊ทธ๋์ฒ์ const ๋ฅผ ๋ถ์ฌ ์ ์ธํ๋ค. const void MyFunction(int a)
const ํจ์ ๋ด์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ค๋ฅธ ๋ฉค๋ฒ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
const ๋ณ์
์ด๊ธฐํ๋ ์ดํ๋ก ๋ฉค๋ฒ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ์ ์ดํจ. const MousePoint mp1(10, 20); ์ดํ mp1 ์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ คํ๊ฑฐ๋, mp1 = mp2; ์ฒ๋ผ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋์ ํ๋ คํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
const ๋ณ์์์๋ const ํจ์๋ง ํธ์ถํ ์ ์๋ค. ๊ทธ ํจ์๊ฐ ์ฝ๊ธฐ ์ ์ฉ์ด๋๋ผ๋, const ํจ์๊ฐ ์๋ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
static ๋ฉค๋ฒ ๋ณ์
์ ์ญ ๋ณ์์ ๋ฌธ์ ์ : ํด๋์ค ๋ด๋ถ ๋ฟ ์๋๋ผ ๋ค๋ฅธ ํด๋์ค์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋ค. ๊ฐ์ฒด ์งํฅ ์ฒ ํ์ ์๋ฐฐ๋๋ค.
ex) ๊ณ ๊ฐ๋ช , ๊ณ ๊ฐ ์๊ธ ์์ก์ ๋ณ๋๋ก ๊ด๋ฆฌ๋์ง๋ง ์ด์์จ์ ๊ณตํต์ผ๋ก ๊ฐ์ง๋ค.
๊ฐ์ฒด๋ง๋ค ๊ณ ์ ๋ก ๊ฐ์ง๋ ๋ฉค๋ฒ ์์ฑ์ด ์๋๋ผ, ๊ฐ์ ๊ฐ์ ๊ณต์ ํด์ผ ํ ๋ ์ ์ญ ๋ณ์์ ์ฑ์ง์ด ํ์ํ๋ฐ, ์ ์ญ ๋ณ์๋ก ์ ์ธํ ๊ฒฝ์ฐ ๊ฐ์ฒด ์งํฅ์ ์ฒ ํ์ ์๋ฐฐ๋๋ฏ๋ก ๋ฉค๋ฒ ๋ณ์์ ์ ์ญ ๋ณ์์ ์ฑ์ง์ ๋ชจ๋ ๊ฐ์ง static ๋ณ์๋ก ์ ์ธํ๋ค.
static ๋ณ์์ ์ ์ญ ๋ณ์๋ ๋ฐ์ดํฐ ์์ญ์์ ๊ด๋ฆฌ๋๋ค.
์คํ: ํจ์ ํธ์ถ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น.
ํ: ์ฌ์ฉ์(๊ฐ๋ฐ์)๊ฐ malloc ๋๋ new ์ฐ์ฐ์๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ์์ญ. ํด์ ์๊น์ง ์ฌ๋ผ์ง์ง ์๋๋ค.
์ด๊ธฐํ
#include <iostream>
using namespace std;
class Deposit {
public :
Deposit() {
}
void bankBalance() {
balance = balance + (balance * interestRate);
}
double getBalance() {
return this->balance;
}
private :
char* name;
double balance;
static double interestRate;
};
double Deposit::interestRate = 0.0;
์์ญ ๊ฒฐ์ ์ฐ์ฐ์ :: ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๋ณ์๋ฅผ ์ด๊ธฐํํด์ค๋ค.
static ๋ฉค๋ฒ ๋ณ์๋ ํด๋์ค์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณต์ ํ๋ ๋ณ์๋ก, ํด๋์ค์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ ๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋๋ค. ์ด๋ฅผ ์ด๊ธฐํํ๋ ค๋ฉด ํด๋์ค ์ธ๋ถ์์ ๋ณ๋๋ก ์ด๊ธฐํํด์ผ ํ๋ค.
๋ณ๊ฒฝ
public:
static void setInterestRate(double) {
Deposit::interestRate = 0.05;
}
๊ฐ์ฒด๋ง๋ค ๊ฐ์ง๋ ๋ฉค๋ฒ ๋ณ์๊ฐ ์๋๋ฏ๋ก, ํด๋์ค๋ฅผ ํตํด ์ฐธ์กฐํด์ ๋ณ๊ฒฝํ๋ค.
const๋ const๋ผ๋ฆฌ, static์ static๋ผ๋ฆฌ!
static ๋ฉค๋ฒ ํจ์ ๋ด์์ ์ผ๋ฐ ๋ณ์ ๋๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
static์ ํด๋์ค ์ ์ธ ์ ์ด๋ฏธ ๋ฐ์ดํฐ ์์ญ์ ์ฌ๋ผ์ค๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๋๋ผ๋ ์ ๊ทผํ ์ ์์ง๋ง, ๊ฐ์ฒด ๋ด ์ผ๋ฐ ๋ฉค๋ฒ ๋ณ์๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ค์ ์ ๊ทผํ ์ ์๋ค. static ๋ฉค๋ฒ ํจ์๋ฅผ ์ฌ์ฉํ๋ ์์ ์์ ๊ฐ์ฒด๊ฐ ์์ฑ๋์๋์ง ์๋์ง ์ ์ ์์ผ๋ฏ๋ก ์ผ๋ฐ ๋ฉค๋ฒ ๋ณ์ ๋๋ ํจ์๋ฅผ ์ฐธ์กฐํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
static ๋ฉค๋ฒ ํจ์๊ฐ ์๋๋๋ผ๋ static ๋ฉค๋ฒ ๋ณ์์ ์ ๊ทผํ ์ ์์ง๋ง, ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ณต์ฉ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ฅผ ํตํด ์ ๊ทผํ๋ ๊ฒ์ด ์ณ์ผ๋ฏ๋ก ํจ์๋ฅผ static์ผ๋ก ์ ์ธํ๋ ๊ฒ์ด ์ข๋ค.
Deposit kim, lee, park;
kim.setInterestRate(0.55); // ๊ฐ๋ฅํ์ง๋ง ๋
ผ๋ฆฌ์ ์ผ๋ก ์ณ์ง ์์
Deposit::setInterestRate(0.55);
static ๋ฉค๋ฒ ๋ณ์๋ ๊ฐ์ฒด๋ง๋ค ์์ฑ๋๋ ๊ฒ์ด ์๋๋ผ ํ๋์ ๋ณ์๋ฅผ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ this ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
friend
ํด๋์ค ๋ด์์ ๋ค๋ฅธ ํด๋์ค๋ฅผ friend ๋ก ์ ์ธํ๋ฉด, ์ ์ธ๋ ํด๋น ํด๋์ค๊ฐ ๋ณธ์ธ์ ํด๋์ค์ ์ด๋ค ๋ฉค๋ฒ๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ๋๋ค.(์ ๊ทผ ์ ํ์๋ฅผ ๋ฌด์ํ๋ค.)
friend๋ ์ผ๋ฐฉ์ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ ์ ์ธ์ ๋ฐ์ ์ชฝ๋ง ์๋์๊ฒ ์ ๊ทผํ ์ ์๊ณ , ์๋ฐฉ์ผ๋ก ์ ๊ทผํ๋ ค๋ฉด ์๋ฐฉ์ผ๋ก ์ ์ธ๋์ด์ผ ํ๋ค.
๋ค๋ฅธ ๊ฐ์ฒด ์งํฅ ์ธ์ด์์๋ ์๋ ๊ฐ๋ ์ด๋ค.
#include <iostream>
using namespace std;
class FriendDeposit {
public:
FriendDeposit(Deposit d) {
interestRate = d.interestRate;
}
double interestRate;
};
class Deposit {
public :
friend class FriendDeposit;
Deposit() {
Deposit::nCount++;
cout << "[nCount]" << Deposit::nCount << endl;
}
~Deposit() {
Deposit::nCount--;
cout << "[nCount]" << Deposit::nCount << endl;
}
double getBalance() {
return this->balance;
}
static void setInterestRate(double interestRate) {
Deposit::interestRate = interestRate;
}
static double getInterestRate() {
return Deposit::interestRate;
}
private :
char* name;
double balance;
static double interestRate;
static int nCount;
};
๐์ค๋ฒ๋ก๋ฉ(Overloading)
์ด๋ฆ์ด ๊ฐ์ง๋ง ์ ๋ฌ ์ธ์์ ๊ฐ์๋ ํ์ ์ด ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ๊ฒ. ex) ์์ฑ์ ์ค๋ฒ๋ก๋ฉ
๋ฐํ ํ์ ์ ๊ด๊ณ๊ฐ ์์. ์๊ทธ๋์ฒ๊ฐ ๋ชจ๋ ๋์ผํ์ง๋ง ๋ฐํ ํ์ ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ๋ ์ค๋ฒ๋ก๋ฉ์ด ์๋๋ค.
C์ธ์ด์์๋ ๋ถ๊ฐ๋ฅํ๋ค. (C์ธ์ด๋ ํจ์๋ฅผ ์ด๋ฆ์ผ๋ก ํธ์ถํ๊ธฐ ๋๋ฌธ์ด๋ค. C++์์๋ ๋งค๊ฐ๋ณ์๋ ํจ๊ป ์ฌ์ฉํ์ฌ ํธ์ถํ๋ค.)
๐์ถ์ํ(Abstraction)
ํต์ฌ์ ์ธ ๊ธฐ๋ฅ ๋๋ ๊ฐ๋ ์ ๊ฐ์ถ๋ ค๋์ ๊ฒ. ์ง๋๊ฐ, ์ฝ์ด๊ฐ, ์น์์๊ฐ ์์ ๋, ๊ฐ๊ณผ๋ผ๊ณ ์ถ์ํํ ์ ์๋ค. ๊ฐ, ๊ณ ์์ด, ์ฌ์ฐ๊ฐ ์์ ๋, ๋ค๋ฐ๋๋ฌผ ๋๋ ํฌ์ ๋ฅ๋ก ์ถ์ํํ ์ ์๋ค.
์ฌ๋ฌผ์ ํน์ฑ์ ์ ๋ฆฌํ์ฌ ํ๋์ ๋ฉ์๋๋ก ์ ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํจ.
๊ฐ: ๋, ์ฝ, ์ , ๊ท, ๋ค๋ฆฌ / ์ง๋ค(), ๋จน๋ค(), ๋ฌ๋ฆฌ๋ค()
๐์์(Inheritance)
๋ฉค๋ฒ ๋ณ์์ ํจ์๋ฅผ ๋ชจ๋ ๋ฌผ๋ ค๋ฐ๋ ๊ฒ. ์ด๋ฏธ ์ ์๋์ด ์๋ ๋ณ์์ ๊ธฐ๋ฅ์ ๋ ์์ฑํ ํ์ ์์ด, ์์ ๋ฐ์ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์์. ์ถ์ํ(์ผ๋ฐํ)๋์ด์๋ ๋ถ๋ชจ๋ฅผ ๋ฌผ๋ ค๋ฐ์ ์ฌ์ฉํจ์ผ๋ก์จ ์ฝ๋์ ์ค๋ณต์ ์ค์ผ ์ ์๋ค. ๋ถ๋ชจ ํด๋์ค๋ก ์ฌ๋ผ๊ฐ์๋ก ์ถ์์ ์ด ๋๋ฉฐ, ์์ ํด๋์ค๋ก ๋ด๋ ค๊ฐ์๋ก ๊ตฌ์ฒด์ ์ด ๋๋ค.
์์ ํด๋์ค ์์ฑ ๋๋ ์๋ฉธ ์ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์, ์๋ฉธ์๋ฅผ ํธ์ถํ๋ค. (์์ฑ์: ๋ถ๋ชจ ํด๋์ค ์์ฑ์ → ์์ ํด๋์ค ์์ฑ์) (์๋ฉธ์: ์์ ํด๋์ค ์๋ฉธ์ → ๋ถ๋ชจ ํด๋์ค ์๋ฉธ์)
โจ๋คํ์ฑ(Polymorphism)
์ฌ์ : ๊ฐ์ ์ข ์ ์๋ฌผ์ด๋ฉด์๋ ์ด๋ค ํํ๋ ์ฑ์ง์ด ๋ค์ํ๊ฒ ๋ํ๋๋ ํ์. ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ์๋ฃํ์ ๋ณ์๋ก ์ฐธ์กฐํ์ฌ ๋ค์ํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ผ ์ ์๋ ์ฑ์ง. ํด๋์ค๊ฐ ์์ ๊ด๊ณ์ ์์ ๋ ๋ํ๋๋ ๋ค์ฑ๋ก์ด ์ฑ์ง.
์ฐธ์กฐํ ์บ์คํ (์ ์บ์คํ /๋ค์ด์บ์คํ )
์ฌ์ฉํ ์ ์๋ ๋ฉค๋ฒ์ ๊ฐ์๋ฅผ ์กฐ์ ํจ. ์ค๋งํธ ํฐ๋น๊ฐ ์์ ๋, ์ผ๋ฐ ๋ฆฌ๋ชจ์ปจ๊ณผ ์ค๋งํธ ๋ฆฌ๋ชจ์ปจ์ผ๋ก ์กฐ์ข ํ๋ ๊ฒ๊ณผ ๋น์ทํจ.
์ ์บ์คํ (Upcasting)
์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค ํ์ ์ผ๋ก ํ๋ณํ๋๋ ๊ฒ. ์บ์คํ ์ฐ์ฐ์ () ๋ฅผ ์๋ตํ ์ ์์. ์์ ํด๋์ค ๋ฉค๋ฒ ๋ณ์์ ์ ๊ทผ์ ์ ํํจ.
๋ค์ด์บ์คํ (Downcasting)
๋ถ๋ชจ ํด๋์ค๊ฐ ์์ ํด๋์ค ํ์ ์ผ๋ก ํ๋ณํ๋๋ ๊ฒ. ์ฐ์ฐ์๋ฅผ ์๋ตํ ์ ์๋ค. ๋ถ๋ชจ ํด๋์ค๋ก ์ ์บ์คํ ๋ ๋ณ์๋ฅผ ์์ ํด๋์ค๋ก ๋ณต๊ตฌํ์ฌ ์ ํ ๋ฐ์๋ ํ๋์ ๊ธฐ๋ฅ์ ํ๋ณตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
โจ์ค๋ฒ๋ผ์ด๋ฉ(Overriding)
์์ ๋ฐ์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ. ๊ธฐ์กด์ ๊ฒ์ ๋ฎ์ด ์ด๋ค.
#include <iostream>
using namespace std;
int Plus(int a, int b) {
return a + b;
}
int Plus(int a, int b, int c) {
return a + b + c;
}
double Plus(double a, double b) {
return a + b;
}
int main() {
int a = 1;
int b = 2;
int c = 3;
double d = 1.1;
double e = 2.2;
cout << Plus(a, b) << endl;
cout << Plus(a, b, c) << endl;
cout << Plus(d, e) << endl;
return 0;
}
3
6
3.3
๐์บก์ํ(Encapsulation)
๋ฐ์ดํฐ๊ฐ ๋ณ์ง๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์์ฑ๊ณผ ํ์๋ฅผ ํ๋๋ก ๋ฌถ์ด ์ธ๋ถ๋ก๋ถํฐ ๋ด๋ถ๋ฅผ ์๋ํจ. ์ธํฐํ์ด์ค(Getter, Setter)๋ฅผ ํตํด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋๋ก ์ ์ดํ๋ค. ์๋ฐ์์๋ private protected ํค์๋๋ฅผ ํตํด ๊ตฌํํ ์ ์์.
์ ๋ณด ์๋๊ณผ ์บก์ํ๊ฐ ๊ฐ์ ๊ฐ๋ ์ด ์๋๋ผ, ์ ๋ณด ์๋ ๊ธฐ๋ฒ ์ค์ ํ๋๊ฐ ์บก์ํ์.
์์์ ํตํ ํ์ ์๋๋ ํ ์ ์์. ⇒ ์์ ๊ฐ์ฒด์ ํ์ ์ ๋ถ๋ชจ ํ์ ์ผ๋ก ํ๋ณํํ์ฌ ๊ตฌ์ฒด์ ์ธ ์์ ๊ฐ์ฒด์ ํ์ ์ ์๋ํจ.(๋คํ์ฑ)
์ถ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ํ๋์ ํด๋์ค์ ํฌํจ์์ผ ์ค์ค๋ก๋ฅผ ๋ณดํธํ๋ ๊ฒ์ ์บก์ํ๋ผ๊ณ ํจ.
C++์์๋ ์ ๊ทผ์ ํ์๋ฅผ ์ง์ ํ์ฌ ๋ฐ์ดํฐ์ ์ง์ ์ ๊ทผ์ ์ ํํ ์ ์๋ค.
๐์์ญ ๊ฒฐ์ ์ฐ์ฐ์(::)
๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ ์ญ ๋ณ์์ ์ง์ญ ๋ณ์๋ฅผ ์ ์ธํ์ ๋, ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ญ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
#include <iostream>
using namespace std;
// ์ ์ญ ๋ณ์
int nTemp = 20;
int main() {
// ์ง์ญ ๋ณ์
int nTemp = 10;
cout << "nTemp์ ๊ฐ์ " << nTemp << "์
๋๋ค." << endl;
return 0;
}
nTemp์ ๊ฐ์ 10์
๋๋ค.
์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์์ญ ์ง์ ์ฐ์ฐ์ :: ๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
cout << "nTemp์ ๊ฐ์ " << ::nTemp << "์
๋๋ค." << endl;
nTemp์ ๊ฐ์ 20์
๋๋ค.
์์ญ ์ง์ ์ฐ์ฐ์ :: ์์ ๋ช ์นญ ๊ณต๊ฐ์ด ์ง์ ๋์ด ์์ง ์์ผ๋ฉด ์ ์ญ ๊ณต๊ฐ์ ๋ณ์ ๋๋ ํจ์๋ฅผ ์ฐธ์กฐํ๋ค.
๐๋ช ์นญ ๊ณต๊ฐ/์ด๋ฆ ๊ณต๊ฐ(namespace)
์๋ณ์ ์ฌ์ด์ ์ด๋ฆ ์ถฉ๋์ ๋ง๊ธฐ ์ํ ์ฅ์น.
๋ค์๊ณผ ๊ฐ์ด ๋งค๊ฐ๋ณ์์ ๊ฐ์๊ฐ ๋์ผํ ๊ฒฝ์ฐ ์ค๋ฒ๋ก๋ฉ์ด ์๋๊ธฐ ๋๋ฌธ์, ๋ฉ์ธ ํจ์ ๋ด์์ func() ๋ฅผ ํธ์ถํ ๋ ์ด๋ค ํจ์๋ฅผ ํธ์ถํ ์ง ๋ชจํธํ๋ฏ๋ก ๋น๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
#include <iostream>
void func() {
std::cout << "Aํ๊ธ ์ฃผ์ฑ์ด" << std::endl;
}
void func() {
std::cout << "Bํ๊ธ ์ฃผ์ฑ์ด" << std::endl;
}
int main() {
func();
return 0;
}
// ๋น๋ ์๋ฌ! void func(void) ํจ์์ ์ด๋ฏธ ๋ณธ๋ฌธ์ด ์์ต๋๋ค.
ํ๋์ ํ์ผ์์ ์ด๋ฐ ์ํฉ์ด ๋ฐ์ํ๋ค๋ฉด ํจ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ฉด ๋์ง๋ง, ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ค๋ฅธ ํ์ผ์์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ํจ์๋ฅผ ์์ฑํ๋ค๋ฉด ํจ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํ์ค์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ช ์นญ ๊ณต๊ฐ(namespace)๋ฅผ ์ฌ์ฉํ๋ค.
#include <iostream>
namespace a {
void func() {
std::cout << "Aํ๊ธ ์ฃผ์ฑ์ด" << std::endl;
}
}
namespace b {
void func() {
std::cout << "Bํ๊ธ ์ฃผ์ฑ์ด" << std::endl;
}
}
int main() {
a::func();
b::func();
return 0;
}
Aํ๊ธ ์ฃผ์ฑ์ด
Bํ๊ธ ์ฃผ์ฑ์ด
์ด๋, ๋ค๋ฅธ ํ์ผ๋ก ๋ถ๋ฆฌํด์ ์์ฑํ๋ค๋ฉด main ํจ์์ a.cpp ์ b.cpp ๋ฅผ ํฌํจ์์ผ์ผ ํ๋ค.
// a.cpp
#include <iostream>
namespace a {
void func() {
std::cout << "Aํ๊ธ ์ฃผ์ฑ์ด" << std::endl;
}
}
// b.cpp
#include <iostream>
namespace b {
void func() {
std::cout << "Bํ๊ธ ์ฃผ์ฑ์ด" << std::endl;
}
}
๋ ํ์ผ์ ๋ฉ์ธ ํจ์์ ํฌํจ์ํค๊ธฐ ์ํด ํค๋ํ์ผ์ ์์ฑํ๋ค.
#pragma once
#ifndef A_H
#define A_H
namespace a {
void func();
}
#endif // !A_H
#pragma once
#ifndef B_H
#define B_H
namespace b {
void func();
}
#endif // !B_H
// main.cpp
#include "a.h"
#include "b.h"
int main() {
a::func();
b::func();
return 0;
}
Java์์ ์ธํฐํ์ด์ค์ ์ค์ ๊ตฌํ ํ์ผ์ ๊ตฌ๋ถํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค.
ex) ProductRepository ProductRepositoryImpl
๐๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ
ํจ์ ์์ฑ ์ ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ ์ ๋ ฅํด๋๋ฉด ํธ์ถ ์ ์ธ์๋ฅผ ์๋ตํ ์ ์๋ค.
#include <iostream>
using namespace std;
void func(int a = 10, int b = 20) {
cout << "a = " << a << ", b = " << b << endl;
}
int main() {
func();
func(500);
func(1, 2);
return 0;
}
๐์ธ๋ผ์ธ ํจ์(Inline Function)
ํจ์์ ์์ฑํ ์ฝ๋ ๋ผ์ธ ์์ฒด๊ฐ ํธ์ถ๋ถ์ ํฌํจ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๋ฉด ๊ทธ ํธ์ถ๋ถ๋ฅผ ๊ธฐ์ตํ๋ค๊ฐ ํจ์๋ก ๊ฐ์ ์ฝ๋๋ฅผ ๋ชจ๋ ์คํํ ๋ค ๋ค์ ํธ์ถ๋ถ๋ก ๋์์ค๊ฒ ๋๋ค. ๋ง์ฝ ํจ์๋ฅผ 100๋ฒ ํธ์ถํ๋ค๋ฉด, ํธ์ถ๋ถ์์ ํจ์๋ก 100๋ฒ ์ค๊ฐ์ผ ํ๋ค.
์ด๋ ์ปดํ์ผ๋ฌ์๊ฒ ํจ์ ํธ์ถ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํด ์ธ๋ผ์ธ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ธ๋ผ์ธ ํจ์์ ๊ฒฝ์ฐ ํธ์ถ์ด ์ผ์ด๋๋ ์์น๊ฐ ํจ์ ์ฝ๋ ์์ฒด๋ก ๋์ฒด๋๊ธฐ ๋๋ฌธ์, ํจ์ ์คํ ์๋๋ฅผ ํฅ์์ํฌ ์ ์๋ค.
๋จ, ์ฝ๋ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ ์ ์๋ค๋ ๋จ์ ์ด ์์ผ๋ฏ๋ก ์ฝ๋ ํฌ๊ธฐ๊ฐ ์๊ณ ๊ธฐ๋ฅ์ด ๋จ์ํ๊ณ (์ฝ๋๊ฐ ์งง๊ณ ) ์์ฃผ ํธ์ถ๋๋ ํจ์์ธ ๊ฒฝ์ฐ๋ง ์ฌ์ฉํ๋ค.
#include <iostream>
using namespace std;
void inline func() {
cout << "This is Inline Func" << endl;
}
int main() {
func();
return 0;
}
๐๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
C์ธ์ด์์๋ malloc realloc calloc free ๋ฅผ ์ฌ์ฉํด์ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค. C++์์๋ new delete ๋ ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
new ์ฐ์ฐ์๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ด ํ ๋น๋๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํํ๋ค.
int* ptr = new int(9999);
cout << *ptr << endl; // 9999
๐STL(Standard Template Library)
ํ์ค ํ ํ๋ฆฟ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ์๋ฃ๊ตฌ์กฐ(์ปจํ ์ด๋, ์ดํฐ๋ ์ดํฐ, ์๊ณ ๋ฆฌ์ฆ)๋ฅผ ๋ชจ์๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
์ปจํ ์ด๋(์๋ฃ๊ตฌ์กฐ), ๋ฐ๋ณต์(iterator), ์๊ณ ๋ฆฌ์ฆ, ์์น
์ปจํ ์ด๋(Container)
Java์ ์ปฌ๋ ์ ๊ณผ ์ ์ฌํ ๊ฐ๋ ์ผ๋ก ๋ฐ์ดํฐ์ ์งํฉ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉํ๋ค.
- ์ํ์ค ์ปจํ
์ด๋ (Sequence Containers)
- vector ๋์ ๋ฐฐ์ด๋ก, ํฌ๊ธฐ๊ฐ ์๋์ผ๋ก ์กฐ์ ๋ฉ๋๋ค. ์ธ๋ฑ์ค๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ํจ์จ์ ์ธ ๋์ ์์ ์ถ๊ฐ/์ ๊ฑฐ๋ฅผ ์ง์ํฉ๋๋ค.
- deque ์์ชฝ ๋์์ ๋น ๋ฅด๊ฒ ์ฝ์ /์ญ์ ๊ฐ ๊ฐ๋ฅํ ๋ฑ(๋๋ธ ์๋๋ ํ)์ ๋๋ค.
- list ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก, ์์์ ์์น์์์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ํจ์จ์ ์ ๋๋ค.
- array ๊ณ ์ ํฌ๊ธฐ์ ๋ฐฐ์ด์ ๋๋ค. std::array๋ ํฌ๊ธฐ๊ฐ ์ปดํ์ผ ํ์์ ๊ฒฐ์ ๋ฉ๋๋ค.
- ์ฐ๊ด ์ปจํ
์ด๋ (Associative Containers)
- set ๊ณ ์ ํ ์์๋ค์ ์ ๋ ฌ๋ ์ํ๋ก ์ ์ฅํฉ๋๋ค.
- map ํค-๊ฐ ์์ ์ ์ฅํ๋ฉฐ, ํค๋ฅผ ํตํด ๊ฐ์ ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์์ต๋๋ค.
- multiset ์ค๋ณต์ ํ์ฉํ๋ ์ ๋ ฌ๋ ์งํฉ์ ๋๋ค.
- multimap ์ค๋ณต๋ ํค๋ฅผ ํ์ฉํ๋ ํค-๊ฐ ์์ ์งํฉ์ ๋๋ค.
- ๋น์์ฐจ ์ปจํ
์ด๋ (Unordered Containers)
- unordered_set ํด์ ๊ธฐ๋ฐ์ ์งํฉ์ผ๋ก, ์์๋ค์ ์ ๋ ฌ๋์ง ์์ผ๋ฉฐ, ๋น ๋ฅธ ์กฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- unordered_map ํด์ ๊ธฐ๋ฐ์ ํค-๊ฐ ์ ์ ์ฅ์๋ก, ๋น ๋ฅธ ์กฐํ๋ฅผ ์ง์ํฉ๋๋ค.
- unordered_multiset ํด์ ๊ธฐ๋ฐ์ ์ค๋ณต์ ํ์ฉํ๋ ์งํฉ์ ๋๋ค.
- unordered_multimap ํด์ ๊ธฐ๋ฐ์ ์ค๋ณต๋ ํค๋ฅผ ํ์ฉํ๋ ํค-๊ฐ ์์ ์งํฉ์ ๋๋ค.
- ๊ธฐํ
- stack: LIFO(Last In First Out) ๋ฐฉ์์ ์ปจํ ์ด๋ ์ด๋ํฐ์ ๋๋ค.
- queue: FIFO(First In First Out) ๋ฐฉ์์ ์ปจํ ์ด๋ ์ด๋ํฐ์ ๋๋ค.
- priority_queue: ์ฐ์ ์์๊ฐ ์๋ ํ๋ก, ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์์๋ฅผ ์ฐ์ ์ ์ผ๋ก ๊บผ๋ ๋๋ค.
C++์์๋ ๋ฐ์ดํฐ ์ถ๋ ฅ ํฌ๋งท(์์ ๋ฌธ์. ex) %d)์ ์ง์ ํ ํ์๊ฐ ์๋ค. ์ ์ถ๋ ฅ ์ฐ์ฐ์ << >> ๊ฐ ์ค๋ฒ๋ก๋ฉ ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
'C, C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] ํ ํ๋ฆฟ(Template) (0) | 2024.08.29 |
---|---|
[C++] ์์(Inheritance) (0) | 2024.08.29 |
[C] ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น (0) | 2024.08.13 |
[C] ๊ตฌ์กฐ์ฒด, ๊ณต์ฉ์ฒด (0) | 2024.08.13 |
[C] C์ธ์ด ๊ธฐ์ด (0) | 2024.08.09 |