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 μ–Έμ–΄μ˜ μ œμ•½ μ†μ—μ„œλ„ 높은 μˆ˜μ€€μ˜ 섀계 원칙을 μ‹€ν˜„ν•˜λŠ” 방법을 κ³ λ―Όν•˜λ©° ν”„λ‘œκ·Έλž˜λ° μ—­λŸ‰μ„ ν‚€μ›Œλ‚˜κ°€μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.