ํ๋ก๊ทธ๋๋ฐ์ ์ธ๊ณ์์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋ ผ๋ฆฌ์ ์ด๊ณ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ๋๋ฐ ๋์์ ์ฃผ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์ ์ค ํ๋์ด๋ค. ์ด์ ๋ถํฐ, c++ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ๋ํด ๊ณต๋ถํด ๋ณด๊ณ ์ ํ๋ค.
c++์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ ๊ฐ๋ ฅํ ์ธ์ด๋ก, ํด๋์ค, ๊ฐ์ฒด, ์์, ๋คํ์ฑ, ์บก์ํ์ ๊ฐ์ ๊ฐ๋ ์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ ์ ์๋๋ก ํ๋ค. ๋ฌผ๋ก , c++์ ๊ณต๋ถํ๋๋ฐ ์์ด์๋ ๊ต์ฅํ ๋์์ด ๋ ๊ฒ์ด๋ค.
OOP์ ๋ํ์ฌ
OOP๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์์ด ๋นผ๋์ ์ ์๋ ๊ฐ๋ ์ด๋ค. ๋ฌด์กฐ๊ฑด ๋จธ๋ฆฌ์ ์ง์ด๋ฃ๋๋ก ํ์.
- Class and Object(ํด๋์ค, ๊ฐ์ฒด)
- Abstraction(์ถ์ํ)
- Encapsulation(์บก์ํ)
- Inheritance(์์)
- Polymorphism(๋คํ์ฑ)
Class and Object
์ฌ์ค Class์ Object๋ ์ด๋์ ๋ ํ๋ก๊ทธ๋๋ฐ์ ํด๋ณด์๋ค๋ฉด, ๋ค์ด๋ณธ ๋ฐ๊ฐ ๊ฝค ์์ ๊ฒ์ด๋ค. ํํ๋ค ๋ถ์ด๋นต ํ(class), ๋ถ์ด๋นต(object)๋ผ๊ณ ๋น์ ํ๊ธฐ๋ ํ๊ณ , ์ค๊ณ๋์ ๊ฑด์ถ๋ฌผ์ด๋ผ๊ณ ๋น์ ํ๊ธฐ๋ ํ๋ค. ์ฆ, ๊ทธ ๊ฐ๋ ์ ์ธ์งํ๋๋ฐ ์์ด์๋ ํฌ๊ฒ ์ด๋ ต์ง ์๋ค๋ ๋ง์ด๋ค.
๊ทธ๋๋ ์กฐ๊ธ ๊ฐ๋ ์ ์ผ๋ก ์์ ํ์๋ฉด, Class๋ object์ ์ผ๋ฐ์ ์ธ ๊ตฌ์กฐ์ด๋ฉฐ object์ ๋ถ๋ฅ๋ก ๋ณผ ์ ์๋ค. ๊ทธ ์์๋ก Car, Animal, Human ์ด๋ฐ ๊ฒ๋ค์ด class์ธ๋ฐ ์ด๋ ํ ๊ตฌ์ฒด์ ์ธ object, ๊ฐ๋ น ๊ณ ์์ด ๊ฐ์ object๋ Animal์ด๋ผ๋ class๋ก ๋ถ๋ฅ๋ ์ ์์ง ์์๊ฐ.
์ด๋ฌํ class๋ properties์ behaviors๋ก ๊ตฌ์ฑ๋๋ค. ์ฆ, attibute์ methods๋ก ๋ณผ ์๋ ์๋ค. ์ด๋ ์์ฑ ๊ฐ๊ณผ ์ด๋ค ํ๋ ์์์ ๊ฐ์ง ์ ์๋ ์ง ๊ธฐ์ ํ ๊ฒ์ด๋ค.
Object๋ Class์ ์ธ์คํด์ค์ด๋ค. state์ Behavior์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. state๋ class์ properties์ ๊ด๊ณ๊ฐ ์์ผ๋ฉฐ, ํ์ฌ object๊ฐ ๊ฐ์ง๊ณ ์๋ properrties์ด๋ค. state๋ ๋ฐ๋ ์ ์๋ค๋ ๊ฒ์ด ํน์ง์ด๋ค.
behavior๋ object๊ฐ ํ ์ ์๋ actions์ ๋ปํ๋ค. ๋ณ ํน๋ณํ ์๋ฏธ๊ฐ ์๋ค๊ธฐ ๋ณด๋จ, ์ฌ์ฉํ ์ ์๋ method๋ฅผ ๋งํ๋ ๋ฏ ์ถ๋ค.
์ถ์ํ(Abstraction)
๊ตณ์ด ๊น๊ฒ ํ๊ณ ๋ค ํ์๊ฐ ์๊ฑฐ๋, ๊ด๊ณ ๊ฐ ์๋ ๊ฒ๋ค์ ์จ๊ธฐ๋ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ์๋์ฐจ ์์ ์ ๋ฐ์ ๋ ๊ตณ์ด ์์ ๋ฐ์์ผ๋ก์จ ์๊ธฐ๋ ๋์์๋ฆฌ๋ฅผ ๊น๊ฒ ์ดํดํ ํ์๊ฐ ์๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ์ฆ, ๊ตณ์ด ๋ํ ์ผํ ์ดํด ์์ด object๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ. ๊ทธ๊ฒ์ด ์ถ์ํ์ด๋ค.
์ฝ๋์์ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ถ์ํ๋ฅผ ์๊ฒ ๋ชจ๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์์์ง๋ ๋ชจ๋ฅธ๋ค. class์์ method๋ฅผ ๋ง๋ค๊ณ , main ํจ์์์ ๊ทธ method ๋ด์ฉ์ ๊ตณ์ด ์๊ด ์ฐ์ง ์๊ณ , ์ฌ์ฉํ๋ ๊ฒ๋ ์ ๋ถ ์ถ์ํ์ ์ผ์ข ์ด๋ค.
์บก์ํ(Encapsulation)
์ธ๊ฐ๋์ง ์์ ์ด๋ค ์ ๊ทผ์ ๋ํด์๋ ๋ด๋ถ ์ํ(internal states)๋ฅผ ์งํค๋ ๊ฒ์ ๋งํ๋ค. ์ฆ, ์ธ๋ถ์์ ๊ฑด๋๋ฆฌ๋ฉด ์๋๋ ๊ฒ๋ค์ ๋ํด์๋ ์บก์์ ์์ ๋ฐ์์ ๊ฑด๋๋ฆฌ์ง ๋ชปํ๋๋ก ํด์ผํ๋ค๋ ๋ง์ด๋ค. ์ฝ๋์์๋ ์ค์ง class๊ฐ ์ ๊ณตํด์ฃผ๋ interface๋ฅผ ํตํด์๋ง state๊ฐ ๋ณํ๋ ๊ฒ์ ํ์ฉํด ์ฃผ์ด์ผ ํ๋ค. ์ฝ๋์์ ์ด๋ private๊ฐ์ ๊ฒ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
์์(Inheritance)
์์์ ๊ต์ฅํ ์์์ผ ํ ๊ฒ์ด ๋ง๋ค. ์ด ๋ํ ์ดํ์ ์์๊ฐ๊ธฐ๋ก ํ๊ณ , ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ๋ง ์์งํ์.
์์์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ํ์ ์์ ํด๋์ค๋ก attibute์ methods๋ฅผ ๋๊ฒจ์ฃผ๋ ๊ฒ์ ๋งํ๋ค. ์ด๋ ์ฌ๋ฌ ์กฐ๊ฑด์ ์ํด ๋๊ฒจ์ง๋ ๊ฒ๋ ์๊ณ , ์กฐ๊ธ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒ๋ ์๋ค. ํ์ง๋ง ๋ถ๋ช ํ ๊ฒ์ ๊ทธ ํด๋์ค๋ค๊ด์ ๊ด๊ณ๋ ๋ถ๋ชจ/์์ ๊ด๊ณ๋ผ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ super class(์์) / sub class(๋ถ๋ชจ), child class(์์) / parent class(๋ถ๋ชจ), derived class(์์) / base class(๋ถ๋ชจ)๋ก ๋งคํํ ์ ์๋ค.
์์์ ๋ถ๋ชจ์ ๊ธฐ๋ฅ์ ๋ฌผ๋ฌ ๋ฐ์ ๊ทธ ์ด์์ ํ ์ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์.
๋คํ์ฑ(Polymophism)
๋คํ์ฑ์ ๊ฝค ์ค์ํ๋ค. ๋ ์์์ด๋ผ๋ ๊ฒ๋ ์ฌ์ค ํ๋์ ๋คํ์ฑ์ ์ง์ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๊ธฐ๋ ํ๋ค.
๋คํ์ฑ์ ๊ฐ์ฒด์ ๋ค์ํ ํํ๋ ํ์ ์ ๊ฐ์ง ์ ์๋ ๋ฅ๋ ฅ์ ๋งํ๋ค. ์ฆ, ์์๋ ๋ถ๋ชจ ํด๋์ค๊ฐ ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ํฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๊ฐํด๋ณด์. ํท๊ฐ๋ฆฌ๋ฉด ์๋๋ ๊ฒ์ด ๋คํ์ฑ์ ๋ ๋์ ๋ฒ์๋ฅผ ํฌ์ฉํ ์ ์๋ ๊ฒ์ด ๋ ํฌ๋ค๊ณ ๋ณด์์ผ ํ๋ค.
๊ฐ๋ น, ์ฐจ๋ ๋ฒ์ค๊ฐ ๋ ์ ์์ง๋ง ๋ฒ์ค๋ ์ฐจ๊ฐ ๋ ์ ์๋ค๋ ๊ฑธ๋ก ์ดํดํด๋ณด์. ์๋ฌดํผ, ์ด๋ฌํ ๋คํ์ฑ์ ๋๊ฐ์ง ์ข ๋ฅ๋ก ๋๋๋ค.
- Static polymorphism
- ์ด๋ ์ปดํ์ผ ์ด์ ์์ ์ปดํ์ผ๊น์ง๊ฐ ๋ฒ์์ด๋ค.
- Method overloading
- Method overriding
- Dynamic polymorphism
- ์ด๋ ๋ฐํ์ ์๊ฐ ๋ฒ์์ด๋ค.
- Virtual function calls
ํด๋น ๋๊ฐ์ง ๊ฒฝ์ฐ์ ์ด๋ค ์๊ธฐ์ ์คํ๋๋ ์ง ์ ๋๋ก ํ์ ํ ํ์๊ฐ ์๋ค.
Class์ Constuctor, Namespace
Class ์ ์ธ
class Door {
};
class Car {
public:
Car(std::string name) : name_(name) {}
std::string name() { return name_; }
Door getDoor(int index) { return doors_[index]; }
private:
std::string name_;
Door doors_[4];
}
Class์ ์ ์ธ ๋ฐฉ๋ฒ์ ์ด๋ ต์ง ์๋ค. ๋ค๋ฅธ ์ธ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก class name { ... } ๋ก ์ฐ๋ฉด ๋๋ค.
Object ์์ฑ
์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
- Direct initialization
- Car car("mycar")
- "์๋ฌต์ "์ผ๋ก Car class์ constructor๋ฅผ ๋ถ๋ฅธ๋ค.
- Car car = Car("mycar")
- "๋ช ์์ "์ผ๋ก Car class์ constructor๋ฅผ ๋ถ๋ฅธ๋ค.
- Car car("mycar")
- Conversion
- Car car = std::string("mycar")
- ์๋ฌต์ ์ผ๋ก, string value๋ฅผ class Car์ object๋ก ๋ณํํ๋ค.
- Car car = (Car) "mycar"
- ๋ช ์์ ์ผ๋ก, string value๋ฅผ class Car์ object๋ก ๋ณํํ๋ค.
- Car car = std::string("mycar")
๊ทผ๋ฐ, ์ฌ์ฉํ๋ ๊ฒ์ ๋ช ์์ ์ผ๋ก constructor๋ฅผ ๋ถ๋ฅด๋ Car car = Car("mycar")๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค.
์ ๊ทผ ์ ์ด์
Private, Protected, Public์ผ๋ก ๋๋๋ค.
- Private
- ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
- Protected
- class ๋ด๋ถ์ด๊ฑฐ๋, ์์ ๋ฐ์ class ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์๋ค.
- Public
- ์ด๋์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
Constructor
์๋์ ๊ฐ์ด ์์ฑ์๋ฅผ ์ ์ธํด ์ค ์ ์๋ค.
name(parameter*) : (, member-field(expression*))* { body-statement }
๋ํ ์ ์ํ ์ ์๋ constructor๋ก๋ ๋ช๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
1. Default Contructor
parameter๋ฅผ ๊ฐ์ง์ง ์๋ ์์ฑ์์ด๋ค. ํน์ ํ๋ผ๋ฏธํฐ๊ฐ ์์ด๋ ๊ธฐ๋ณธ ๊ฐ์ด ์ง์ ๋ ์์ฑ์๋ฅผ ๋งํ๋ค.
์ด ์์ฑ์๋ Compiler๊ฐ ์๋์ผ๋ก ์์ฑํ๋ค. ๋จ, ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ ์์ฑ์๊ฐ ์์ ๋๋ง ๊ฐ๋ฅํ๋ค.
์๋ฌต์ ์ผ๋ก ๋ชจ๋ ๋ฉค๋ฒ ํ๋์ ๋ํด default constructor๋ฅผ ๋ถ๋ฅธ๋ค. ๋ง์ฝ์ ๋ฉค๋ฒ ํ๋์ ๋ํด์ ์๋ฌด๋ฐ default constructor๊ฐ ์๋ค๋ฉด, Compiler๋ ์๋ฌ๋ฅผ ๋ด๋๋๋ค.
// default constructor๊ฐ ์์ฑ ๋ชปํจ
class Door {
public:
Door(std::string color) : color(color) {} // User-defined constructor with one parameter
private:
std::string color;
};
class Car {
public:
// Car() : name("mycar") { } // Default constructor
// std::string name() { return name; }
private:
std::string name;
Door doors; // Error: no matching function for call to 'Door::Door()'
};
int main() {
Car car1; // Error: no matching function for call to 'Door::Door()'
return 1;
}
2. Implicit Conversion constructor
์์ฑ์๊ฐ ์ ์ด๋ ํ๋์ ํ๋ผ๋ฏธํฐ๊ฐ ์๊ณ , explicit ์ด๋ผ๋ ํค์๋๊ฐ ์์ ๋ถ์ง ์์ constructor๋ฅผ ์๋ฏธํ๋ค.
์ด ์์ฑ์์ ์ญํ ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ํ์ ์ด class์ object๋ก ๋ณํ๋๊ฒ ํด์ค๋ค. c++11 ๋ฒ์ ์ดํ๋ก, ์ด ์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ก ์๋ฌด๊ฒ๋ ์๊ฑฐ๋ ๊ทธ ์ด์์ ๊ฐ์ด ๋์ด๋ ์๋ฌด๋ฐ ์๊ด์ด ์์ด์ก๋ค. ์ด๋ explicit์ด๋ผ๋ ํค์๋๊ฐ ์ง์ ๋์ง ์์ constructor๊ฐ implicit conversion constructor๋ผ๋ ๊ฒ์ ์๋ฏธํ๊ธฐ๋ ํ๋ค.
Google C++ style guide๋ ๊ตณ์ด ์ด๋ฌํ type constructor๋ฅผ ์ฐ์ง ์๋ ๊ฒ์ ์ถ์ฒํ๋ค.
class Car {
public:
Car(std::string name) : name_(name) { } // Implicit converting constructor
...
}
int main() {
Car car1("mycar");
Car car2 = Car("mycar");
Car car3 = "mycar"s;
Car car4 = (Car) "mycar";
}
3. Explicit conversion constructor
์ค์ง ํ๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๋ฉฐ, explicit ์ด๋ผ๋ ํค์๋๋ก ๊ตฌ์ฑ๋ constructor์ด๋ค.
์ด constructor๋ ์์ Implicit conversion๊ณผ ๋ฌ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์ ์ด class์ object๋ก ๋ณํํ์ง ๋ชปํ๋๋ก ํ๋ค.
Google C++ style guide๋ ๋ชจ๋ constructor๊ฐ explicit conversion constructor๋ก ์ ์ํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
class Car {
public:
explicit Car(std::string name) : name_(name) { }
private:
std::string name_;
Door doors[4]
};
int main() {
Car car1("mycar");
Car car2 = Car("mycar");
Car car3 = "mycar"s; // ์ด๊ฑด ์๋์ผ๋ก ํ์
๋ณํ์ด ๋ถ๊ฐ๋ฅํ๋ค.
Car car4 = (Car) "mycar";
}
3. Copy constructor
object๋ฅผ copyํ๊ธฐ ์ํ consructor์ด๋ค. ์ด๋ ๋ณต์ฌํ๋ ค๋ object์ ๋ชจ๋ ๋ฉค๋ฒ ํ๋ ๊ฐ์ ๋ณต์ฌํ์ฌ ์ง์ด๋ฃ๋๋ค.
๋ํ ๋ชจ๋ ๋ฉค๋ฒ ํ๋์ ๋ํด์ shallow copy๋ฅผ ์งํํ๋ค. ๋ง์ฝ shallow copy๊ฐ ์๋ deep copy๋ฅผ ์ํ๋ค๋ฉด, ๋ฐ๋ก ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋ค.
์๋ ์์๋ฅผ ๋ณด๋ฉด, ์์ฑ์์ ์ง์ ์ ์ผ๋ก Explicit์ด ๋ถ์ด ์์ง ์๋ค. ์ฆ, ์์ฑ์ ํธ์ถ ์ Implicit ํน์ Explicitํ๊ฒ ํธ์ถํ๋ ๊ฒ์ ํ์ฉํ๋ค๋ ๊ฒ์ ๋งํ๋ค.
๋ฐ๋ฉด, ์์ฑ์์ Explicit์ด ๋ถ์ด์๋ค๋ฉด, Implicit ํธ์ถ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ, ์ค์ง Explicit์ ํตํด ํธ์ถํ์ฌ์ผ ํ๋ค.
class Car {
public:
Car() : name_("mycar") {}
Car(const Car& car) : name_(car.name_) {
for(int i=0; i<4; ++i) {
doors_[i] = car.doors_[i];
}
}
private:
std::string name_;
Door doors_[4];
};
int main() {
Car car;
Car car2(car); // Implicit copy constructor call
Car car3 = Car(car2); // Explicit copy constructor call
Car car4 = car3;
}
์์ ๋ณต์ฌ(Shallow copy) : ์๋ณธ ๊ฐ์ฒด์ ๋ณต์ฌํ ๊ฐ์ฒด๊ฐ ์๋ก ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ. ์ฆ, ํฌ์ธํฐ๊ฐ
๊น์ ๋ณต์ฌ(Deep copy) : ์๋ณธ ๊ฐ์ฒด์ ๋ณต์ฌํ ๊ฐ์ฒด๊ฐ ์์ ํ ๋ ๋ฆฝ์ ์ธ ๋ฐ์ดํฐ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๋ ๊ฒ.
์ฆ, ์์ ๋ณต์ฌ๋ ํฌ์ธํฐ๊ฐ ๊ฐ์ ๊ฑฐ๊ณ , ๊น์ ๋ณต์ฌ๋ ๊ฐ๋ง ๋ณต์ฌํ๊ณ ํฌ์ธํฐ๊ฐ ๋ค๋ฅธ๋ค๊ณ ์๊ฐํ ์ ์๋ค.
C++์ Class์์ ์น๊ตฌ ๊ด๊ณ(Friends)
C++์์๋ friends๋ผ๋ ๊ด๊ณ๋ฅผ Class๋ด์์ ์ ์ํ ์ ์๋ค. ํ์ง๋ง ๋ง๋ง ์น๊ตฌ์ง ์ฌ์ค ์ ๋๋ง ์น๊ตฌ๋ก ์๊ฐํ๋ ์ผ๋ฐฉ์ ์ธ ์น๊ตฌ ๊ด๊ณ์ด๋ค. ๋ด๊ฐ ์น๊ตฌ๋ก ์๊ฐํ๋ ๋์ class์์๋ ๋์ ๊ธฐ๋ฅ์ ์ ๋ถ ์ฌ์ฉํ ์ ์์ผ๋, ๋๋ ๋์ class์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. ์ข ํธ๊ตฌ๊ฐ์ ๊ด๊ณ์ด๋ค.
class Person {
public:
void CallCat() {
cat_ -> Move(); // Error๊ฐ ๋๋ค.
}
private:
Hand hands_[2];
Leg legs_[2];
Cat* cat_;
friend Cat; // ๋๋ง ์น๊ตฌ์ธ ๊ด๊ณ
}
class Cat {
public:
void TouchHuman() {
// ๋ ์น๊ตฌ๋ก ์๊ฐํ๋ ์น๊ตฌ์ ๊ฒ์ ์ฌ์ฉํ ์ ์์.
Hand left_hand = owner_ -> hands_[0];
Leg right_hand = owner_ -> legs_[0];
}
private:
Leg legs_[4];
Person* owner;
void Move() { ... }
}
C++์์์ ์ ์ธ๊ณผ ์ ์
Class์์์ ํจ์์ ์ ์ธ
private๋ก ์ง์ ๋ ๋ฉค๋ฒ ํ๋์ ๋ํ ์กฐ์์ ์ํด ํจ์๋ฅผ ์ ์ธํด ์ค ์๋ ์๋ค. ํฌ๊ฒ ์ด๋ ค์ด ๊ฒ์ ์๊ณ ๊ฐ๋จํ๊ฒ Return ํ์ ๊ณผ ํจ์ ์ด๋ฆ, ๊ทธ๋ฆฌ๊ณ ํ๋ผ๋ฏธํฐ ์ ๋ณด๋ง ์์ฑํด์ฃผ๋ฉด ๋๋ค.
class Car {
public:
Car(std::string name);
void set_name(std::string name);
std::string name();
public:
std::string name_;
}
Class์์์ ํจ์์ ์ ์
์์ class์ ๋ํ ์ ์ธํ์ผ์ .h ํ์ผ์์ ์์ฑํ๋ค. ์ค์ง์ ์ผ๋ก ์๋ ๊ณผ์ ์ ๋ํ ๋ถ๋ถ์ .cc ํ์ผ ํน์ .cpp์์ ์งํํ ์ ์๋ค. ์์ , ์ ์์ ๊ตฌ์กฐ๊ฐ ๋์ผํ๋๋ก ์์ฑํด์ฃผ๋ฉด ๋๋ค.
ReturnType className::FunctionName(parameters { Body statement; }
์ฆ, ์์ ๊ฐ์ด clasName๊ณผ "::" ๋ฅผ ํตํด์ ๊ทธ class์ ์ ์๋ Function ๋ด์ฉ์ ์์ฑํด์ค ์ ์๋ค.
์กฐ๊ธ ๊ธฐ์ตํด์ผ ํ ๊ฒ์ h ํ์ผ ๋ด์์ include ์ํจ ๋ด์ฉ์ ๋ํด์๋ ๊ตณ์ด h ํ์ผ์ ํฌํจ ์ํจ cc ํ์ผ ๋ด์์ ๋ค์ ์์ฑํ ํ์๋ ์๋ค๋ ๊ฒ์ด๋ค. ์ด๋ ๋ฏ, h ํ์ผ๊ณผ cc ํ์ผ์ ๋๋๋ ์ด์ ๋ ๋ชจ๋ํ์ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, ์๋์ ๊ฐ์ด cc ํ์ผ์์ h ํ์ผ์ ํฌํจ ์์ผ์ค๋ค.
#include <iostream>
#include "car.h"
int main() {
Car car("mycar");
std::cout << car.name() << std::endl;
return 1;
}
Class์์์ ์ข์ Pratice
- Class์ ์ด๋ฆ์ Pascal cases์ด๋ค.
class Cat { ... };
class Person { ... };
class ChungnamUniv { ... };
์ด๋ ๊ณณ์ ๊ฐ๋ , ์ฝ๋ ์ปจ๋ฒค์ ์ ์งํค๋ ๊ฒ์ด ์ ์์ ์ข๋ค. C++์์ class์ ์ด๋ฆ์ Pascal Case๋ก ์์ฑํด์ฃผ์.
- ์ค์ง ๋ฉค๋ฒ ํ๋์ ๋ํ public access๋ง์ ๊ฐ์ง๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์๋ clsss ๋์ ์ struct๋ฅผ ์ฌ์ฉํ์.
struct Point {
int x_;
int y_;
}
์ฌ์ค ๋์ ์์ฒด๋ Class๋ Struct๋ ๋์ผํ์ง๋ง, publicํ ์ ๊ทผ๋ง์ ๊ฐ์ง๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ผ๋ฉด struct๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ๋ฉค๋ฒ ๋ณ์๋ snake_case์ด๋ฉฐ, ๋ง์ง๋ง์๋ _(underscore)๋ฅผ ๋ถ์ฌ์ค๋ค.
class Person {
int age_;
std::string home_address_;
};
์ฌ์ฉํ๋ ์ด์ ๋ local์ ์๋ ๋ณ์์ member ๋ณ์ ๊ฐ์ ๊ตฌ๋ถ์ ์ํด์์ด๋ค.
- ๋ฉค๋ฒ ํจ์๋ Upper-Carmel-Case๋ฅผ ์ฌ์ฉํ๋ค.
์ฌ์ค ์ Pascal๊ณผ ๋์ผํ๊ฒ ์์ฑํ๋ค. ๊ธฐ์ตํ ๋งํ ์ฐจ์ด์ ์ด ์๋ค๋ฉด, ๋ฉค๋ฒ ๋ณ์์ ๋ํ getter ํจ์๊ฐ ์์ ๋๋ ๊ทธ ๋ฉค๋ฒ ๋ณ์์ ์ผ๋ฆ๊ณผ ๋์ผํ๊ฒ ํจ์ ์ด๋ฆ์ ์์ฑํด์ค๋ค.
class Person {
int DoSomthing() { ... }
int age() { return age_; }
int age_;
};
- ๋ฉค๋ฒ ํ๋๋ฅผ ์์ฑํ ๋, ์ ๊ทผ ์ ์ด์๋ public์์ private ์์ผ๋ก ์์ฑํ๋๋ก ํ๋ค.
class Person {
public:
int age() { return age_; }
int DoSomething1() { ... }
protected:
int DoSomething2() { ... }
private:
int age_;
std::string home_address_;
}
- ๋น์ฐํ์ง๋ง, ์ ์ธ๊ณผ ์ ์์ ๋ํ ํ์ผ์ ๋๋์ด ๋์.(์ฆ, ccํ์ผ๊ณผ hํ์ผ์ ๊ตฌ๋ถํ์ฌ ๋์.)
- ๋ชจ๋ constructor๋ Explicitํ๊ฒ ์์ฑํ์.
์์ ๋ฐฐ์ ๋ฏ, implicit์ ํ์ ์ ๋ํ conversion์ด ์๋์ผ๋ก ์ด๋ฃจ์ด์ง์ง๋ง, Explicit์ ๊ทธ๊ฒ์ ์ ํํ๋ค. ์ธ๋ป๋ณด๋ฉด ํธํ๊ฒ ์๋๊ฐ ์๊ฐํ ์ ์์ง๋ง ์ด๋ ์น๋ฉด์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ค๋ฅ๋ก ์ด์ด์ง ์ ์๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ธํด ์ ๋งํ๋ฉด constructor๋ Explicitํ๊ฒ ์์ฑํ์.
Class Person {
public:
explicit Person(int age);
explicit Person(int age, std::string addr);
private:
int age_;
std::string home_address_;
}
// Person p(3)์ผ๋ก ํ๋ฉด, int ๊ฐ์ด ํ๋ผ๋ฏธํฐ ๊ฐ์ผ๋ก ๋ค์ด์ด์ด ๋ช
๋ฐฑํ๋ค.
// Person p = 3์ ์๋ฌต์ ์ผ๋ก ํ์
์ ๋ณํํ์ฌ object๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ค.
object๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์ด ํท๊ฐ๋ฆฐ๋ค๋ฉด ์์ ๋ฐฐ์ด object ์์ฑ ๋ฐฉ๋ฒ์ ๋ํด ๋ค์ํ๋ฒ ๋ณด๊ณ ์ค๊ธธ ๋ฐ๋๋ค.
Namespace
namespace๋ ํจ์, ๋ณ์, class๋ค์ ํฌํจํ๋ ํน์ํ ์ฝ๋ ์์ญ์ด๋ค. C++ ๋ด์์๋ ๊ฐ์ ์๋ณ์๋ฅผ ์ ์ํ ์ ์์ง๋ง ์ด namespace๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ฐ๋ฅํด์ง๋ค.
ํ์ง๋ง, ๊ฐ์ namespace ์์์๋ ์๋ณ์๊ฐ ์ค๋ณต๋๋ฉด ์๋๋ค. ๋ํ main function์ ๋ค๋ฅธ namespaces์ ์ํ ์ ์๋ค.
#include <iostream>
namespace ns1 {
int value = 3;
}
namespace ns2 {
std::string value("Hi there");
}
int main() {
std::cout << ns1::value << std::endl;
std::cout << ns2::value << std::endl;
}
Nested namespace
namespace์์๋ ์ฌ๋ฌ namespace๋ฅผ ์ค์ฒฉ๋ ๊ตฌ์กฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
์ญ์๋, ๊ฐ์ ์๋ณ์์ ๋ณ์๋ฅผ ๋์์ ์ ์ธํ ์ ์๋ค.
#include <iostream>
namespace ns1 {
void foo() {
std::cout << "foo() in ns1" << std::endl;
}
namespace ns2() {
void foo() {
std::cout << "foo() in ns2" << std::endl;
}
namespace ns3() {
void foo() {
std::cout << "foo() in ns3" << std::endl;
}
}
}
namespace ns4() {
void foo() {
std::cout << "foo() in ns3" << std::endl;
}
}
}
int main() {
ns1::foo();
ns1::ns2::foo();
ns1::ns2::ns3::foo();
ns1::ns4::foo();
}
๋ํ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ ๊ฒ nested๋๊ฒ ์์ฑ๋ namespace์์์ ์๋ณ์๋ฅผ ์ฐพ์ ๋๋ ์์์ ๋ถํฐ ๋ฐ์ผ๋ก ์ฐพ๋๋ค.
๊ฐ์ namespace์ ๋ถ๋ฆฌ๋ ์์ฑ
์๋์ ๊ฐ์ด namespace๋ฅผ ์ธ ๋ ๊ตณ์ด ํ๋ฒ์ ๋ค์ฐ์ง ์์๋ ์ข๋ค.
namespace ns1 {
void foo() {
std::cout << "foo() in ns1" << std::end;
}
}
namespace ns1 {
void bar() {
std::cout << "bar() in ns1" << std::end;
}
}
int main() {
ns1::foo();
ns1::bar();
return 0;
}
namespace์์์ ์ข์ Pratice
- namespace๋ snake-cases ์์ฑํ๋ค.
namespace theory { ... }
namespace object_oriented { ... }
namespace good_practice_in { ... }
- ์ด๋ค namespace์ธ์ง์ ๋ํ comment๋ฅผ ๋ช ๋ฐฑํ ๋จ๊ฒจ์ผ ํ๋ค.
namespace object_oriented {
namespace good_pratice_in{
...
} // namespace good_pratice_in
} // namespace object_oriented
- "using namespace::์ฌ์ฉํ๊ณ ์ ํ๋ identifiers" ๋ก ์์ฑํด์ผ ํ๋ค.
๊ทธ๋์ผ ์ด๋ค namespace์์ ์ด๋ค identifier๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ธ์ง ๋ช ํํด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
namespace theory{
void foo() { ... }
void bar() { ... }
}
namespace practice{
void foo() { ... }
void bar() { ... }
}
using theory::foo();
using pratice::bar();
foo(); bar();;