OOPμ μμ± μ€, μΊ‘μνλ
μ¨κ²¨μΌ ν λ΄μ©μ μ¨κΈ°κ³ νμν λ΄μ©μ νμνλ λ°©μμΌλ‘ μ 보λ₯Ό ν¨ν€μ§νλ κΈ°μ μΈλ°,
ν΄λμ€λ μΊ‘μν(+μ 보μλ : information hiding)μ λνμ μΈ μμ΄λ€.
ν΄λμ€ λ΄λΆμλ λ°μ΄ν°μ λ©μλκ° ν¬ν¨λμ΄ μμΌλ©°,
μ΄λ₯Ό μΈλΆμμ μ κ·Όν μ μλμ§ μ¬λΆλ μ κ·Ό μ νμ(private, public, protected)μ λ°λΌ κ²°μ λλ€.
μ κ·Όμ νμκ° μμΌλ©΄ defaultλ‘, private μ κ·Ό μ νμκ° μ μ©λλ€
ν΄λμ€ λ΄λΆμμ μ μλ λ©€λ²ν¨μ : inline ν¨μ
ν΄λμ€ λ΄λΆμμ μ μλ λ©€λ² ν¨μλ κΈ°λ³Έμ μΌλ‘ inline ν¨μκ° λλ€.
inline ν¨μλ ν¨μλ₯Ό νΈμΆν λ λ°μνλ μ€λ²ν€λλ₯Ό μ€μ΄κΈ° μν΄ μ¬μ©λλ€. μΌλ°μ μΌλ‘ ν¨μκ° νΈμΆλλ©΄ ν¨μμ μ€νμ μν΄ νΈμΆλ ν¨μμ μ£Όμλ‘ μ ννλ κ³Όμ μ΄ νμνλ°, inline ν¨μλ μ»΄νμΌλ¬μκ² ν¨μ νΈμΆμ μ€μ΄κ³ , ν¨μμ μ½λλ₯Ό νΈμΆ μ§μ μ μ§μ μ½μ νλΌκ³ μμ²νλ κ²μ΄λ€.
C++μμλ ν΄λμ€ λ΄λΆμμ μ μλ λͺ¨λ λ©€λ² ν¨μλ μλμΌλ‘ inline ν¨μλ‘ κ°μ£Όλλ€. μλ₯Ό λ€μ΄:
class MyClass {
public:
void myFunction() {
// ν¨μ λ΄μ©
}
};
μ μ½λμμ myFunction ν¨μλ ν΄λμ€ μ μ λ΄μμ μ§μ ꡬνλμ΄ μμΌλ―λ‘ μλμΌλ‘ inline ν¨μκ° λλ€.
ν΄λμ€ μ μ λ΄λΆμμ ν¨μλ₯Ό μ μνλ κ²μ λ³΄ν΅ μ§§κ³ κ°λ¨ν ν¨μλ€μ ν΄λΉνλ€. μ΄λ¬ν ν¨μλ€μ λ€μκ³Ό κ°μ μ΄μ λ‘ inlineμΌλ‘ μ²λ¦¬λλ€.
- ν¨μ¨μ±: 짧μ ν¨μμ λν΄μλ ν¨μ νΈμΆμ μ€λ²ν€λκ° μ½λ μμ²΄λ³΄λ€ λ ν° λΉμ©μ΄ λ μ μλ€. μ΄λ° κ²½μ° inline ν¨μλ‘ μ²λ¦¬νλ©΄ μ±λ₯μ κ°μ ν μ μλ€.
- νΈλ¦¬ν¨: κ°λ°μλ ν΄λμ€ μ μ μμμ ν¨μλ₯Ό μ§§κ² μ μνκ³ μΆμ΄νλ κ²½μ°κ° λ§λ€. μ΄λ inlineμ΄ μλμΌλ‘ μ μ©λλ©΄ λ³λμ inline ν€μλλ₯Ό λΆμ΄μ§ μμλ λλ―λ‘ νΈλ¦¬νλ€.
C++μμλ ν΄λμ€ λ΄λΆμμ μ μλ λ©€λ² ν¨μκ° κΈ°λ³Έμ μΌλ‘ inline ν¨μκ° λλ©°, μ΄λ ν¨μ νΈμΆμ μ€λ²ν€λλ₯Ό μ€μ΄κ³ μ½λλ₯Ό κ°κ²°νκ² μμ±ν μ μλλ‘ λλλ€. κ·Έλ¬λ μ΅μ’ μ μΌλ‘ inline μ¬λΆλ μ»΄νμΌλ¬μ νλ¨μ λ°λΌ κ²°μ λλ©°, 무쑰건 inlineμΌλ‘ μ²λ¦¬λμ§λ μλλ€. μ΄ κΈ°λ₯μ μ½λ ν¨μ¨μ±μ λμ΄λ λ° μ€μν μν μ νλ€.
λ€μ€ν°λ ν΄λμ€(Nested Classes)
λ€μ€ν°λ ν΄λμ€(Nested Class)λ ν΄λμ€ λ΄λΆμ λ λ€λ₯Έ ν΄λμ€λ₯Ό μ μνλ κ²μ λ§νλ€. λ€μ€ν°λ ν΄λμ€λ μΈλΆ ν΄λμ€μ λ©€λ²λ‘ μ·¨κΈ(μ μ)λλ©°, μΈλΆ ν΄λμ€μ λ°μ ν κ΄κ³λ₯Ό κ°μ§λ ν΄λμ€λ₯Ό μ μν λ μ μ©νλ€
μ΄ ν΄λμ€λμΈλΆ ν΄λμ€μ λͺ¨λ λ©€λ²(λΉκ³΅κ°(private), 보νΈ(protected), 곡κ°(public))μ μ κ·Όν μ μμ§λ§, μΈλΆ ν΄λμ€λ κΈ°λ³Έμ μΌλ‘ λ€μ€ν°λ ν΄λμ€μ λ©€λ²μ μ κ·Όν μ μλ€λ κ²μ΄ νΉμ§μ΄λ€.
λν λ€μ€ν°λ ν΄λμ€λ λ ν΄λμ€ κ°μ κ°ν κ΄κ³λ₯Ό ννν μ μλ€. μΈλΆ ν΄λμ€μ ꡬνμ λλ 보쑰 ν΄λμ€λ₯Ό μ μνλ λ° μ μ©νλ€. μΈλΆ ν΄λμ€μ κ°μ²΄ μμ΄λ λ 립μ μΌλ‘ μ¬μ©λ μ μλ€λ νΉμ§λ μλ€. λ€μ€ν°λ ν΄λμ€μ κ°μ²΄λ₯Ό μμ±ν λ, μΈλΆ ν΄λμ€μ κ°μ²΄λ₯Ό λ°λμ μμ±ν νμλ μλ€.
λ Όλ¦¬μ μΈ κ·Έλ£Ήν: μΈλΆ ν΄λμ€μ λ°μ ν κ΄λ ¨μ΄ μλ ν΄λμ€λ€μ λ Όλ¦¬μ μΌλ‘ κ·Έλ£Ήνν μ μλ€. μλ₯Ό λ€μ΄, νΉμ ν΄λμ€μλ§ κ΄λ ¨λ ν¬νΌ ν΄λμ€λ μμ μ νΈλ¦¬ν° ν΄λμ€λ€μ λ€μ€ν°λ ν΄λμ€λ‘ λ§λ€ μ μλ€.
μΊ‘μν κ°ν: λ€μ€ν°λ ν΄λμ€λ μΈλΆ ν΄λμ€μ ꡬν μΈλΆ μ¬νμ κ°μΆκ³ , ν΄λμ€ μΈλΆμμ μ κ·Όν μ μκ² ν μ μλ€. μ΄λ κ² νλ©΄ ν΄λμ€λ₯Ό λ μμ νκ³ κ΄λ¦¬νκΈ° μ½κ² λ§λ€ μ μλ€.
μ΄λ¦ μΆ©λ λ°©μ§: λ€μ€ν°λ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ ν΄λμ€ μ΄λ¦μ΄ μΈλΆ ν΄λμ€ λ΄μ κ΅νλλ―λ‘, μ μ λ€μμ€νμ΄μ€μμμ μ΄λ¦ μΆ©λμ νΌν μ μλ€.
class Rectangle {
public :
class Point { // Nested Classes ν΄λμ€ λ΄ ν΄λμ€
public :
int x, y;
void print() const { cout << x << '\t' << y ; }
bool isEqual(const Point& p) const {return x == p.x && y == p.y ; }
};
Point leftTop, rightBottom ;
void setLeftTop(int x, int y) { leftTop.x = x ; leftTop.y = y ; }
void setRightBottom(int x, int y) { rightBottom.x = x ; rightBottom.y = y ; }
bool isEqual(const Rectangle& r) const {
return leftTop.isEqual(r.leftTop) && rightBottom.isEqual(r.rightBottom) ;
}
const Rectangle& print() const {
leftTop.print() ; cout << '\t' ; rightBottom.print();
return *this ;
}
...
}
friend ν¨μ/ν΄λμ€
friend ν¨μ
C++μμ friend ν€μλλ νΉμ ν¨μλ ν΄λμ€κ° λ€λ₯Έ ν΄λμ€μ λΉκ³΅κ°(private) λλ 보νΈλ(protected) λ©€λ²μ μ κ·Όν μ μλλ‘ νμ©νλ κΈ°λ₯μ μ 곡νλ€. μ΄ κΈ°λ₯μ ν΄λμ€ μ€κ³μμ νΉμν κ΄κ³λ₯Ό νννκ±°λ, ν΄λμ€ μΈλΆμ ν¨μκ° ν΄λμ€ λ΄λΆμ κΉμ΄ μ°κ΄λ μμ μ μνν νμκ° μμ λ μ¬μ©λλ€.
friend ν¨μλ νΉμ ν΄λμ€μ λΉκ³΅κ° λ©€λ²μ μ κ·Όν μ μλλ‘ νμ©λ ν¨μμ΄λ€. friendλ‘ μ μΈλ ν¨μλ κ·Έ ν΄λμ€μ λ©€λ² ν¨μλ μλμ§λ§, ν΄λΉ ν΄λμ€μ λͺ¨λ λ©€λ²(곡κ°, 보νΈ, λΉκ³΅κ°)μ μ κ·Όν μ μλ€.
#include <iostream>
class Box {
private:
double width;
public:
// μμ±μ
Box(double w) : width(w) {}
// friend ν¨μ μ μΈ
friend void printWidth(Box& b);
};
// friend ν¨μ μ μ
void printWidth(Box& b) {
// Box ν΄λμ€μ private λ©€λ²μ μ κ·Ό κ°λ₯
std::cout << "Width of box: " << b.width << std::endl;
}
int main() {
Box box(10.0);
printWidth(box); // Box ν΄λμ€μ private λ©€λ²μ μ κ·Όν μ μμ
return 0;
}
μ μ½λμμ printWidth ν¨μλ Box ν΄λμ€μ width λ©€λ²μ μ κ·Όν μ μλ€. μ΄ ν¨μλ Box ν΄λμ€ μΈλΆμ μ μλμ΄ μμ§λ§, friend ν€μλλ‘ μΈν΄ Box ν΄λμ€μ private λ©€λ²μ μ κ·Όν μ μλ€.
friend ν΄λμ€
friend ν΄λμ€λ λ€λ₯Έ ν΄λμ€μ λͺ¨λ λ©€λ²(곡κ°, 보νΈ, λΉκ³΅κ°)μ μ κ·Όν μ μλ ν΄λμ€μ΄λ€. μ¦, ν΄λμ€ Aκ° ν΄λμ€ Bλ₯Ό friendλ‘ μ μΈνλ©΄, ν΄λμ€ Bλ ν΄λμ€ Aμ λͺ¨λ λ©€λ²μ μ κ·Όν μ μλ€.
#include <iostream>
class Engine {
private:
int horsepower;
public:
Engine(int hp) : horsepower(hp) {}
friend class Car; // Car ν΄λμ€λ Engine ν΄λμ€μ λͺ¨λ λ©€λ²μ μ κ·Ό κ°λ₯
};
class Car {
public:
void displayEnginePower(Engine& eng) {
std::cout << "Engine horsepower: " << eng.horsepower << std::endl;
}
};
int main() {
Engine engine(300);
Car car;
car.displayEnginePower(engine); // Car ν΄λμ€κ° Engine ν΄λμ€μ private λ©€λ²μ μ κ·Ό
return 0;
}
μ΄ μμ μμ Car ν΄λμ€λ Engine ν΄λμ€μ friendλ‘ μ μΈλμκΈ° λλ¬Έμ Engine ν΄λμ€μ private λ©€λ²μΈ horsepowerμ μ κ·Όν μ μλ€.
this ν¬μΈν°
this ν¬μΈν°λ C++μμ κ°μ²΄ μμ μ κ°λ¦¬ν€λ ν¬μΈν°λ‘, ν΄λμ€μ λ©€λ² ν¨μ λ΄μμ μ¬μ©λλ€. this ν¬μΈν°λ κ°μ²΄μ λ©€λ² ν¨μκ° νΈμΆλ λ, κ·Έ ν¨μκ° νΈμΆλ κ°μ²΄μ μ£Όμλ₯Ό μλμΌλ‘ μ λ¬λ°μ μ¬μ©λλ€. μ΄λ νΉν λ©€λ² ν¨μμμ ν΄λμ€μ λ©€λ² λ³μλ₯Ό λͺ νν κ°λ¦¬ν€κ±°λ, λ©μλ 체μ΄λμ ꡬννκ±°λ, μκΈ° μμ μ λ°ννλ κ²½μ°μ μ μ©νλ€
- λ©€λ² ν¨μ λ΄μμλ§ μ¬μ©: this ν¬μΈν°λ ν΄λμ€μ λ©€λ² ν¨μ λ΄μμλ§ μ¬μ©ν μ μλ€. κ°μ²΄κ° λ©€λ² ν¨μλ₯Ό νΈμΆνλ©΄, thisλ κ·Έ κ°μ²΄μ μ£Όμλ₯Ό κ°λ¦¬ν¨λ€.
- ν΄λμ€ νμ ν¬μΈν°: this ν¬μΈν°λ ν΄λΉ ν΄λμ€ νμ μ ν¬μΈν°μ΄λ€. μλ₯Ό λ€μ΄, MyClassλΌλ ν΄λμ€κ° μλ€λ©΄, thisλ MyClass* νμ μ΄λ€.
(1) λ©€λ² λ³μμ 맀κ°λ³μ ꡬλΆ
ν΄λμ€μ λ©€λ² λ³μμ λ©€λ² ν¨μμ 맀κ°λ³μ μ΄λ¦μ΄ λμΌν λ, this ν¬μΈν°λ₯Ό μ¬μ©νμ¬ λ©€λ² λ³μλ₯Ό λͺ νν ꡬλΆν μ μλ€
class MyClass {
private:
int value;
public:
MyClass(int value) {
this->value = value; // this->valueλ λ©€λ² λ³μ, valueλ 맀κ°λ³μ
}
void setValue(int value) {
this->value = value; // λ©€λ² λ³μμ 맀κ°λ³μ κ°μ ν λΉ
}
void printValue() {
std::cout << "Value: " << this->value << std::endl;
}
};
(2) λ©μλ 체μ΄λ
λ©μλ 체μ΄λμ νλμ κ°μ²΄μ λν΄ μ¬λ¬ λ©μλλ₯Ό μ°μμ μΌλ‘ νΈμΆν μ μκ² ν΄μ£Όλ κΈ°μ μ΄λ€. μ΄λ₯Ό μν΄ λ©€λ² ν¨μλ this ν¬μΈν°λ₯Ό λ°νν μ μλ€.
class MyClass {
private:
int value;
public:
MyClass& setValue(int value) {
this->value = value;
return *this; // νμ¬ κ°μ²΄λ₯Ό λ°ν
}
MyClass& incrementValue() {
++(this->value);
return *this;
}
void printValue() {
std::cout << "Value: " << this->value << std::endl;
}
};
int main() {
MyClass obj;
obj.setValue(5).incrementValue().printValue(); // λ©μλ 체μ΄λ
return 0;
}
(3) μκΈ° μμ μ λ°ννλ ν¨μ
μ’ μ’ λ©€λ² ν¨μκ° κ°μ²΄ μμ μ λ°νν΄μΌ νλ κ²½μ°κ° μλ€. μ΄λ this ν¬μΈν°λ₯Ό μ¬μ©ν΄ νμ¬ κ°μ²΄μ μ°Έμ‘°λ₯Ό λ°νν μ μλ€
class MyClass {
public:
MyClass* getThisPointer() {
return this; // μκΈ° μμ μ κ°λ¦¬ν€λ ν¬μΈν° λ°ν
}
};
int main() {
MyClass obj;
MyClass* p = obj.getThisPointer(); // objμ μ£Όμλ₯Ό κ°λ¦¬ν€λ ν¬μΈν° p
return 0;
}