Cλ‘ νλ OOP
C μΈμ΄λ μ μ°¨ μ§ν₯μ λνμ£Όμμ§λ§, κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(OOP)μ κ°λ ₯ν κ°λ λ€μ Cμμλ ꡬνν΄λ³Ό μ μμκΉμ? λλκ²λ, μ°½μμ μΈ μ κ·Όκ³Ό μ½κ°μ κΈ°λ²μ ν΅ν΄ C μΈμ΄μμλ OOPμ ν΅μ¬ κ°λ λ€μ ꡬννλ κ²μ΄ κ°λ₯ν©λλ€. μ΄ κΈμμλ C μΈμ΄λ‘ OOP μ€νμΌμ μ€κ³λ₯Ό μ΄λ»κ² μλν μ μλμ§, κ·Έλ¦¬κ³ κ·Έ κ³Όμ μμ μ€μν κ°μ²΄ μ§ν₯μ ν΅μ¬ μμΉλ€μ μ΄λ»κ² ꡬνν μ μλμ§ μ΄ν΄λ΄ λλ€.
μ Cμμ κ°μ²΄ μ§ν₯μΈκ°?
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ν΄λμ€, κ°μ²΄, μμ, λ€νμ±, μλν λ±μ κ°λ μ ν΅ν΄ 볡μ‘ν μμ€ν μ λͺ¨λννκ³ μ μ§λ³΄μλ₯Ό μ©μ΄νκ² ν©λλ€. C++μ΄λ Java κ°μ μΈμ΄μμλ μ΄λ¬ν κΈ°λ₯λ€μ΄ λ΄μ₯λμ΄ μμ§λ§ Cμμλ κ·Έλ μ§ μμ΅λλ€.
κ·ΈλΌμλ λΆκ΅¬νκ³ Cλ‘ κ°μ²΄ μ§ν₯μ μ² νμ μ μ©νλ μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
- μΈλ°ν μ μ΄ νμ: μλ² λλ μμ€ν μ΄λ μμ€ν νλ‘κ·Έλλ° λ± λ©λͺ¨λ¦¬ μ μ΄λ μ±λ₯ μΈ‘λ©΄μμ μΈλ°ν κ΄λ¦¬κ° νμν λ μ μ©ν©λλ€.
- κΈ°μ‘΄ C νλ‘μ νΈ νμ©: μ΄λ―Έ Cλ‘ μμ±λ μμ€ν μ λͺ¨λμ±κ³Ό μ μ°μ±μ λνκ³ μ ν λ μ μ©λ μ μμ΅λλ€.
- OOP μ리 νμ΅: μΈμ΄μ λμ μμ΄ OOP κ°λ μ μ§μ ꡬνν΄λ³΄λ©° κ·Έ μ리λ₯Ό κΉμ΄ μ΄ν΄ν μ μμ΅λλ€.
Cμμ κ°μ²΄ μ§ν₯ ν΅μ¬ μμΉ κ΅¬ννκΈ°
κ°μ²΄ μ§ν₯μ κ·Όκ°μ μ΄λ£¨λ ν΅μ¬ μμΉμΈ μλν, μμ, λ€νμ±μ CμΈμ΄μμ μ΄λ»κ² ꡬνν μ μλμ§ μμλ΄ μλ€. μ΄λ C++κ³Ό κ°μ λ€μ΄ν°λΈ μ§μμ΄ μλ, Cμ κΈ°λ₯μ νμ©ν ꡬνμμ κΈ°μ΅νλ κ²μ΄ μ€μν©λλ€.
μλν (encapsulation)
- μ μ: λ°μ΄ν°μ ν΄λΉ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ ν¨μ(λ©μλ)λ₯Ό νλμ λ¨μλ‘ λ¬Άκ³ , μΈλΆμλ λΆνμν λ΄λΆ ꡬν μμΈλ₯Ό κ°μΆλ κΈ°λ²μ λλ€. μ 보 μλ(information hiding)κ³Ό κ΄λ ¨μ΄ κΉμ΅λλ€.
- C ꡬν:
structλ₯Ό μ¬μ©νμ¬ κ΄λ ¨ λ°μ΄ν°λ₯Ό λ¬Άμ΅λλ€.- κ΄λ ¨ ν¨μλ€μ ν΄λΉ ꡬ쑰체λ₯Ό λ€λ£¨λλ‘ μ€κ³νλ©°, ν¨μ ν¬μΈν°λ₯Ό ꡬ쑰체 λ©€λ²λ‘ ν¬ν¨μμΌ βλ©μλβμ²λΌ λμνκ² ν μ μμ΅λλ€.
- ν€λ νμΌ(
.h)μλ ꡬ쑰체 μ μΈ(λλ‘λ opaque ν¬μΈν° κΈ°λ² νμ©)κ³Ό ν¨μ νλ‘ν νμ (κ³΅κ° μΈν°νμ΄μ€)λ§ λ ΈμΆνκ³ , μ€μ ꡬνμ μμ€ νμΌ(.c)μ μμ±νμ¬ λ΄λΆ ꡬνμ κ°μΆ₯λλ€..cνμΌ λ΄μμstaticν€μλλ₯Ό μ¬μ©νμ¬ νμΌ λ²μ λ΄μμλ§ μ κ·Ό κ°λ₯ν ν¨μλ λ³μλ₯Ό λ§λ€μ΄ μ 보 μλμ κ°νν μ μμ΅λλ€. (μ£Όμ: Cμλ μ κ·Ό μ μ΄μκ° μμ΄ μμ ν μλμ μ΄λ ΅μ΅λλ€. μλ βκ³ λ €ν μ β μ°Έκ³ )
μμ (inheritance)
- μ μ: κΈ°μ‘΄ κ°μ²΄(λΆλͺ¨ ν΄λμ€)μ μμ±κ³Ό κΈ°λ₯μ μλ‘μ΄ κ°μ²΄(μμ ν΄λμ€)κ° λ¬Όλ €λ°μ μ½λ μ€λ³΅μ μ€μ΄κ³ νμ₯μ±μ λμ΄λ λ°©μμ λλ€.
- C ꡬν:
- ꡬ쑰체 ν¬ν¨: νμ(μμ) ꡬ쑰체μ 첫 λ²μ§Έ λ©€λ²λ‘ κΈ°λ°(λΆλͺ¨) ꡬ쑰체 λ³μλ₯Ό ν¬ν¨μν΅λλ€. μ΄λ κ² νλ©΄ λ©λͺ¨λ¦¬ λ μ΄μμμ μμ ꡬ쑰체 ν¬μΈν°λ₯Ό λΆλͺ¨ ꡬ쑰체 ν¬μΈν°λ‘ μμ νκ² ν λ³ν(casting)ν μ μμ΄, λΆλͺ¨μ λ©€λ²μ μ κ·Όνκ±°λ λΆλͺ¨ νμ μ μꡬνλ ν¨μμ μμ κ°μ²΄λ₯Ό μ λ¬νλ λ± μμμ ꡬνν μ μμ΅λλ€.
λ€νμ± (polymorphism)
- μ μ: λμΌν μΈν°νμ΄μ€(ν¨μ νΈμΆ λ°©μ)λ₯Ό μ¬μ©νλ, μ€μ κ°μ²΄μ νμ μ λ°λΌ μ€ν μμ μ μλ‘ λ€λ₯Έ λμμ μννκ² λ§λλ νΉμ±μ λλ€.
- C ꡬν:
- ν¨μ ν¬μΈν° (function pointer): ꡬ쑰체 λ΄μ ν¨μ ν¬μΈν° λ©€λ²λ₯Ό ν¬ν¨μν΅λλ€. (μ΄λ₯Ό νμ©ν΄ βvtableβ λλ κ°μ ν¨μ ν μ΄λΈμ ꡬννκΈ°λ ν©λλ€). κ°μ²΄λ₯Ό μμ±ν λ ν΄λΉ κ°μ²΄ νμ μ λ§λ μ€μ ν¨μμ μ£Όμλ₯Ό μ΄ ν¬μΈν°μ ν λΉν©λλ€. μ΄ν, κ³΅ν΅ μΈν°νμ΄μ€(μ: λΆλͺ¨ ꡬ쑰체 ν¬μΈν°)λ₯Ό ν΅ν΄ μ΄ ν¨μ ν¬μΈν°λ₯Ό νΈμΆνλ©΄, κ°μ²΄μ μ€μ νμ μ λ§λ ν¨μκ° μ€νλ©λλ€.
μ΄ μμΉλ€μ Cμμ ꡬννλ©΄ μ½λμ λͺ¨λνμ μ μ°μ±μ ν₯μμν¬ μ μμ΅λλ€.
μ½λ μμ λ‘ λ³΄λ C μΈμ΄μ κ°μ²΄ μ§ν₯
μ΄μ μμ μ€λͺ
ν μμΉλ€μ΄ μ€μ μ½λλ‘ μ΄λ»κ² ꡬνλλμ§ κ°λ¨ν Shapeμ Circle μμ λ₯Ό ν΅ν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
#include <stdio.h>
#include <stdlib.h>
// κΈ°λ³Έ "ν΄λμ€": Shape
typedef struct _Shape Shape; // μ λ°© μ μΈ
struct _Shape {
// κ°μ ν¨μ μν μ ν¨μ ν¬μΈν° (λ€νμ±)
void (*draw) (Shape* self);
// κ³΅ν΅ λ°μ΄ν° (μλνμ λμ)
int color;
};
// Shapeμ κΈ°λ³Έ draw ν¨μ (μ€λ²λΌμ΄λλ μ μμ)
void shape_draw (Shape* self)
{
printf ("Drawing Shape with color %d\n", self->color);
}
// Shapeμ μμ±μ μν μ μννλ ν¨μ (μλν)
// κ°μ²΄ μνλ₯Ό μ΄κΈ°ννλ―λ‘ Shape* νμ
μ ν¬μΈν°λ₯Ό μ¬μ©
// μ΄ μμ μμλ νΈμμ λ³λμ shape_new ν¨μλ ꡬννμ§ μμ
void shape_init (Shape* self, int color)
{
self->draw = shape_draw; // κΈ°λ³Έ draw ν¨μ μ°κ²°
self->color = color;
}
// νμ "ν΄λμ€": Circle
typedef struct {
Shape base; // μμ ꡬν: Shape ꡬ쑰체λ₯Ό 첫 λ²μ§Έ λ©€λ²λ‘ ν¬ν¨
double radius; // Circleλ§μ λ°μ΄ν°
} Circle;
// Circleμ draw ν¨μ: Shapeμ drawλ₯Ό μ€λ²λΌμ΄λ (λ€νμ±)
void circle_draw (Shape* self)
{
Circle* circle = (Circle*) self; // μμ νμ
μΌλ‘ λ€μ΄μΊμ€ν
printf ("Drawing a circle with radius: %.2f and color %d\n",
circle->radius, circle->base.color); // λΆλͺ¨ λ©€λ² μ κ·Ό
}
// Circle μμ±μ μν ν¨μ: λμ λ©λͺ¨λ¦¬ ν λΉ λ° vtable μν μ΄κΈ°ν
Circle* circle_new (double radius, int color)
{
Circle* circle = (Circle*) malloc (sizeof (Circle)); // λ©λͺ¨λ¦¬ ν λΉ
if (circle == NULL)
{
fprintf (stderr, "λ©λͺ¨λ¦¬ ν λΉ μ€ν¨\n");
abort ();
}
shape_init ((Shape*) circle, color); // λΆλͺ¨ μ΄κΈ°ν (μ€μ!)
// λ€νμ±: Circleμ draw ν¨μλ‘ μ¬μ§μ (μ€λ²λΌμ΄λ)
circle->base.draw = circle_draw;
circle->radius = radius; // μμ μ΄κΈ°ν
return circle;
}
// λ©λͺ¨λ¦¬ ν΄μ ν¨μ (μλ©Έμ μν )
void circle_free (Circle* circle)
{
// λ§μ½ Circle λ΄λΆμ λμ ν λΉλ λ€λ₯Έ λ©€λ²κ° μλ€λ©΄ μ¬κΈ°μ ν΄μ ν΄μΌ ν¨
free (circle); // κ°μ²΄ μ체μ λ©λͺ¨λ¦¬ ν΄μ
}
// μμ μ¬μ©
int main ()
{
// κ°μ²΄ μμ±
Circle* myCircle = circle_new (5.0, 1); // λ°μ§λ¦ 5.0, μμ 1μΈ μ μμ±
/* λ€νμ±μ μ΄μ©νμ¬ base ν¬μΈν°λ‘ draw νΈμΆ */
// myCircleμ Shape* νμ
μΌλ‘ μ λ¬
Shape* shape = (Shape*) myCircle;
if (shape && shape->draw)
shape->draw(shape); // μ€μ λ‘λ circle_drawκ° νΈμΆλ¨
// λ©λͺ¨λ¦¬ ν΄μ
circle_free (myCircle);
return 0;
}
μ€λͺ :
Shapeꡬ쑰체λ κ³΅ν΅ λ°μ΄ν°(color)μ λμ(drawν¨μ ν¬μΈν°)μ κ°μ§λ©° κΈ°λ³Έ μΈν°νμ΄μ€ μν μ ν©λλ€. (μλν, λ€νμ± κΈ°λ°)Circleꡬ쑰체λShapeλ₯Ό 첫 λ©€λ²λ‘ ν¬ν¨νμ¬Shapeμ μμ±κ³Ό κΈ°λ₯μ βμμβλ°λ ν¨κ³Όλ₯Ό λ λλ€. (μμ ꡬν)circle_newν¨μλ κ°μ²΄λ₯Ό μμ±νκ³drawν¨μ ν¬μΈν°λ₯Όcircle_drawλ‘ μ€μ νμ¬,Shapeν¬μΈν°λ₯Ό ν΅ν΄drawλ₯Ό νΈμΆν΄λCircleμ λμμ΄ μνλλλ‘ ν©λλ€. (λ€νμ±)shape_init,circle_new,circle_freeν¨μλ κ°μ²΄μ μμ±κ³Ό μλ©Έμ κ΄λ¦¬νλ©°, κ°μ²΄μ μλͺ μ£ΌκΈ°λ₯Ό κ΄λ¦¬νλ μν μ ν©λλ€.
Cλ‘ OOP ꡬν μ κ³ λ €ν μ
- μλ λ©λͺ¨λ¦¬ κ΄λ¦¬: Cλ κ°λΉμ§ 컬λ μ
μ΄ μμΌλ―λ‘
malloc,freeλ±μ μ¬μ©ν λͺ μμ λ©λͺ¨λ¦¬ κ΄λ¦¬κ° νμμ μ λλ€. κ°μ²΄ μμ± μ ν λΉνκ³ , μλ©Έ μ λ°λμ ν΄μ ν΄μΌ ν©λλ€. νΉν, κ°μ²΄ λ΄λΆμ λ λ€λ₯Έ λμ ν λΉ λ©€λ²κ° μκ±°λ 볡μ‘ν μμ ꡬ쑰μμλ μλ©Έ(_free) ν¨μμ μν κ³Ό νΈμΆ μμκ° μ€μν΄μ§λ©° κ΄λ¦¬κ° 볡μ‘ν΄μ§ μ μμ΅λλ€. - μ κ·Ό μ νμμ λΆμ¬ (μλνμ νκ³):
private,protectedκ°μ μ κ·Ό μ νμκ° μμ΅λλ€. ν€λ νμΌμλ 곡κ°ν μΈν°νμ΄μ€λ§ μ μΈνκ³ λ΄λΆ ꡬνμ μμ€ νμΌμ μ¨κΈ°λ λ°©μ(.cνμΌ λ΄staticνμ© λ±)μΌλ‘ μ 보 μλμ ꡬνν μλ μμ§λ§, C++μ²λΌ μΈμ΄ μ°¨μμμ μ격νκ² κ°μ λλ κ²μ΄ μλλλ€. μ¦, μ¬μ ν μΈλΆ μ½λμμ ꡬ쑰체 λ©€λ²μ μ§μ μ κ·Όνλ κ²μ λ§μ μ μμ΄ μμ ν μλνλ μ΄λ ΅κ³ , νλ‘κ·Έλλ¨Έμ κ΄λ‘(convention)μ μμ‘΄νκ² λ©λλ€. - μ½λ 볡μ‘μ± μ¦κ°: μμ, λ€νμ± λ±μ μλμΌλ‘ ꡬννλ©΄ 보μΌλ¬νλ μ΄νΈ μ½λκ° λμ΄λκ³ κ΅¬μ‘°κ° λ³΅μ‘ν΄μ§ μ μμ΅λλ€. ν λ΄ μ½λ© κ΄λ‘(μ: λΆλͺ¨ ꡬ쑰체λ νμ 첫 λ²μ§Έ λ©€λ²λ‘, ν¨μ λͺ λͺ κ·μΉ λ±)μ μ νκ³ μ£Όμ, λ¬Έμνλ₯Ό ν΅ν΄ ꡬν λ°©μμ λͺ νν νλ κ²μ΄ μ€μν©λλ€.
- νμ μμ μ± λΆμ‘±: μ»΄νμΌ νμμ μ격ν νμ 체ν¬κ° μ΄λ£¨μ΄μ§μ§ μμ μ μμΌλ©°, νΉν ν¬μΈν° μΊμ€ν μ μ£Όμκ° νμν©λλ€.
κ²°λ‘ λ° λ λμκ°κΈ°
C μΈμ΄λ‘ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ꡬννλ κ²μ κ°λ₯νμ§λ§, μΈμ΄ μ체μ μ§μμ΄ μλλ―λ‘ C++ λ±μ λΉν΄ λ λ§μ λ Έλ ₯κ³Ό μ£Όμκ° νμνλ©° λͺ νν νκ³μ μ κ°μ§λλ€. νμ§λ§ μ΄ κ³Όμ μ C μΈμ΄μ κΉμ μ΄ν΄μ μ€κ³ λ₯λ ₯ ν₯μμ ν° λμμ΄ λ μ μμ΅λλ€.
νΉν μλ² λλ μμ€ν μ΄λ μ±λ₯μ΄ μ€μν νκ²½μμ κ°μ²΄ μ§ν₯ 3μμΉ(μλν, μμ, λ€νμ±)μ Cλ‘ κ΅¬ννλ κ²½νμ λͺ¨λνλκ³ μ¬μ¬μ© κ°λ₯ν μ½λλ₯Ό μμ±νλ λ° μ μ©ν μ μμ΅λλ€.
μ¬κΈ°μ λ λμκ°, ν¨μ ν¬μΈν° ν μ΄λΈ(vtable)μ λͺ μμ μΌλ‘ μ¬μ©νμ¬ λ€νμ±μ ꡬννλ μ’ λ μ κ΅ν λ°©λ²μ΄λ, μ±κΈν΄ ν¨ν΄, ν©ν 리 λ©μλ ν¨ν΄ λ± λ€μν λμμΈ ν¨ν΄μ C μΈμ΄λ‘ ꡬνν΄λ³΄λ κ²λ μ’μ νμ΅μ΄ λ κ²μ λλ€. C μΈμ΄μ μ μ½ μμμλ λμ μμ€μ μ€κ³ μμΉμ μ€ννλ λ°©λ²μ κ³ λ―Όνλ©° νλ‘κ·Έλλ° μλμ ν€μλκ°μκΈΈ λ°λλλ€.