๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ‘จ๐Ÿพ‍๐Ÿ’ป C++

์ƒ์† / ํ”„๋ Œ๋“œ

by eazuooz 2022. 8. 22.

friend function

์›์น™์ ์œผ๋กœ ํด๋ž˜์Šค์˜ private ๋ฐ protected ๋ฉค๋ฒ„๋Š” ์„ ์–ธ๋œ ๋™์ผํ•œ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ทœ์น™์€ "์นœ๊ตฌ" ์—๊ฒŒ๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

์นœ๊ตฌ ๋Š” friendํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ํ•จ์ˆ˜ ๋˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

๋น„๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์นœ๊ตฌ ๋กœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ ํด๋ž˜์Šค์˜ private ๋ฐ protected ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด๋Š” ํด๋ž˜์Šค ๋‚ด์— ์ด ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์„ ์–ธ์„ ํฌํ•จํ•˜๊ณ  ํ‚ค์›Œ๋“œ๋ฅผ ์•ž์— ๋‘ ์œผ๋กœ์จ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค friend.

// friend functions
#include <iostream>
using namespace std;

class Rectangle {
    int width, height;
  public:
    Rectangle() {}
    Rectangle (int x, int y) : width(x), height(y) {}
    int area() {return width * height;}
    friend Rectangle duplicate (const Rectangle&);
};

Rectangle duplicate (const Rectangle& param)
{
  Rectangle res;
  res.width = param.width*2;
  res.height = param.height*2;
  return res;
}

int main () {
  Rectangle foo;
  Rectangle bar (2,3);
  foo = duplicate (bar);
  cout << foo.area() << '\n';
  return 0;
}

duplicateํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค ์˜ ์นœ๊ตฌRectangle ์ž…๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ๋Š” ์œ ํ˜•์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ์ฒด์˜ duplicate๋ฉค๋ฒ„ width๋ฐ (๋น„๊ณต๊ฐœ)์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์˜ ์„ ์–ธ ์ด๋‚˜ ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ๋•Œ function ์€ class ์˜ ๋ฉค๋ฒ„๋กœ ๊ฐ„์ฃผ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๊ทธ๋ ‡์ง€ ์•Š๋‹ค! ํšŒ์›์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋น„๊ณต๊ฐœ ๋ฐ ๋ณดํ˜ธ๋œ ํšŒ์›์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. friend ํ•จ์ˆ˜์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‘ ํด๋ž˜์Šค์˜ private ๋˜๋Š” protected ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค ๊ฐ„์— ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.heightRectangleduplicatemainduplicateRectangle

 

friend class

friend ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜๊ฒŒ friend ํด๋ž˜์Šค๋Š” ๋ฉค๋ฒ„๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ private ๋˜๋Š” protected ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

// friend class
#include <iostream>
using namespace std;

class Square;

class Rectangle {
    int width, height;
  public:
    int area ()
      {return (width * height);}
    void convert (Square a);
};

class Square {
  friend class Rectangle;
  private:
    int side;
  public:
    Square (int a) : side(a) {}
};

void Rectangle::convert (Square a) {
  width = a.side;
  height = a.side;
}
  
int main () {
  Rectangle rect;
  Square sqr (4);
  rect.convert(sqr);
  cout << rect.area();
  return 0;
}

์ด ์˜ˆ์ œ์—์„œ class ๋Š” ์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ์˜ private ๋ฐ protected ๋ฉค๋ฒ„์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋„๋ก Rectangleํ•˜๋Š” ํด๋ž˜์Šค์˜ ์นœ๊ตฌ ์ž…๋‹ˆ๋‹ค . ๋ณด๋‹ค ๊ตฌ์ฒด์  ์œผ๋กœ, ์ •์‚ฌ๊ฐํ˜•์˜ ์ธก๋ฉด์„ ์„ค๋ช…ํ•˜๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค . ์ด ์˜ˆ์ œ์—๋Š” ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ๋ถ€๋ถ„์— class ์˜ ๋นˆ ์„ ์–ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํด๋ž˜์Šค ๊ฐ€ (๋ฉค๋ฒ„์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ) ๋ฅผ ์‚ฌ์šฉ ํ•˜๊ณ (์นœ๊ตฌ๋กœ ์„ ์–ธ) ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ์šฐ์ •์€ ์ ˆ๋Œ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ ๋Š” ์— ์˜ํ•ด ์นœ๊ตฌ ํด๋ž˜์Šค๋กœ ๊ฐ„์ฃผ ๋˜์ง€๋งŒ Square๋Š” ์— ์˜ํ•ด ์นœ๊ตฌ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ ์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š”SquareRectangleSquareRectangleSquare::side

SquareRectangleSquareconvertSquareRectangle

RectangleSquareRectangleRectangle์˜ protected ๋ฐ private ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ Square์žˆ์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํ•„์š”ํ•œ ๊ฒฝ์šฐ Square์˜ ์นœ๊ตฌ๋กœ ์„ ์–ธ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ Rectangle์ด๋Ÿฌํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ์ •์˜ ๋˜ ๋‹ค๋ฅธ ์†์„ฑ์€ ์ „์ด์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์นœ๊ตฌ์˜ ์นœ๊ตฌ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋˜์ง€ ์•Š๋Š” ํ•œ ์นœ๊ตฌ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ๊ฐ„์˜ ์ƒ์†

C++์˜ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜์—ฌ ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์ƒˆ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์†์ด๋ผ๊ณ  ํ•˜๋Š” ์ด ํ”„๋กœ์„ธ์Šค์—๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค ์™€ ํŒŒ์ƒ ํด๋ž˜์Šค ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค . ํŒŒ์ƒ ํด๋ž˜์Šค ๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค ์˜ ๋ฉค๋ฒ„๋ฅผ ์ƒ์†ํ•˜๋ฉฐ ๊ทธ ์œ„์— ์ž์ฒด ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ง์‚ฌ๊ฐํ˜•๊ณผ ์‚ผ๊ฐํ˜•์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋‹ค๊ฐํ˜•์„ ์„ค๋ช…ํ•˜๋Š” ์ผ๋ จ์˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์ƒํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ํด๋ฆฌ๊ณค์€ ๋ฉด์ ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฐ’๊ณผ ๊ฐ™์€ ํŠน์ • ๊ณตํ†ต ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋†’์ด์™€ ๋„ˆ๋น„(๋˜๋Š” ๋ฐ‘๋ณ€)๋กœ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ํŒŒ์ƒํ• 

ํด๋ž˜์Šค๋กœ ํด๋ž˜์Šค์˜ ์„ธ๊ณ„์—์„œ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .PolygonRectangleTriangle: ํด๋ž˜์Šค์—๋Š”


๋‘ Polygon๊ฐ€์ง€ ์œ ํ˜•์˜ ํด๋ฆฌ๊ณค์— ๊ณตํ†ต์ ์ธ ๋ฉค๋ฒ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ: width๊ทธ๋ฆฌ๊ณ  height. ๊ทธ๋ฆฌ๊ณ  ํด๋ฆฌ๊ณค์˜ ํ•œ ์œ ํ˜•์—์„œ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ๋‹ค๋ฅธ ํŠน์ • ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ํŒŒ์ƒ ํด๋ž˜์Šค๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค Rectangle. ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ๋œ ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ๋ฉค๋ฒ„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ์ด๋ผ๋Š” ๋‹ค๋ฅธ ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ํŒŒ์ƒํ•˜๋ฉด ํŒŒ์ƒ ํด๋ž˜์Šค์— ๋ฉค๋ฒ„ ์™€ ๋ฉค๋ฒ„ ๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค . ๋‘ ํด๋ž˜์Šค์˜ ์ƒ์† ๊ด€๊ณ„๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ƒ ํด๋ž˜์Šค ์ •์˜๋Š” ๋‹ค์Œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์€Triangle

ABAB



class derived_class_name: public base_class_name
{ /*...*/ };

derived_class_namebase_class_name๊ธฐ๋ฐ˜์ด ๋˜๋Š” ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ์ง€์ • ์ž๋Š” ๋‹ค๋ฅธ ์•ก์„ธ์Šค ์ง€์ •์ž( ๋˜๋Š” ) public์ค‘ ํ•˜๋‚˜๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด ์•ก์„ธ์Šค ์ง€์ •์ž๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋œ ๋ฉค๋ฒ„์— ๋Œ€ํ•ด ๊ฐ€์žฅ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ์ˆ˜์ค€์ด ๋” ๋†’์€ ๋ฉค๋ฒ„๋Š” ๋Œ€์‹  ์ด ์ˆ˜์ค€์œผ๋กœ ์ƒ์†๋˜๋Š” ๋ฐ˜๋ฉด, ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋” ์ œํ•œ์ ์ธ ์•ก์„ธ์Šค ์ˆ˜์ค€์„ ๊ฐ€์ง„ ๋ฉค๋ฒ„๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์ œํ•œ์ ์ธ ์ˆ˜์ค€์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. .protectedprivate

 

// derived classes
#include <iostream>
using namespace std;

class Polygon {
  protected:
    int width, height;
  public:
    void set_values (int a, int b)
      { width=a; height=b;}
 };

class Rectangle: public Polygon {
  public:
    int area ()
      { return width * height; }
 };

class Triangle: public Polygon {
  public:
    int area ()
      { return width * height / 2; }
  };
  
int main () {
  Rectangle rect;
  Triangle trgl;
  rect.set_values (4,5);
  trgl.set_values (4,5);
  cout << rect.area() << '\n';
  cout << trgl.area() << '\n';
  return 0;
}

ํด๋ž˜์Šค Rectangle๋ฐ Triangle๊ฐ๊ฐ์˜ ๊ฐœ์ฒด์—๋Š” ์—์„œ ์ƒ์†๋œ ๋ฉค๋ฒ„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค Polygon. width, height๋ฐ set_values. _

ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ ๋˜๋Š” protected์•ก์„ธ์Šค ์ง€์ • Polygon์ž๋Š” ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค private. ์‹ค์ œ๋กœ ์ƒ์†์—์„œ ์œ ์ผํ•œ ์ฐจ์ด์ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•  ๋•Œ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋œ ๋ณดํ˜ธ๋œ ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋น„๊ณต๊ฐœ ๋ฉค๋ฒ„๋Š” ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ ๋Œ€์‹  ์„

์„ ์–ธํ•จ์œผ๋กœ์จ ์ด๋Ÿฌํ•œ ๋ฉค๋ฒ„๋Š” ์˜ ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹Œ ํŒŒ์ƒ ํด๋ž˜์Šค ๋ฐ ์—์„œ๋„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ณต๊ฐœ๋œ ๊ฒฝ์šฐ ์–ด๋””์—์„œ๋‚˜ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.widthheightprotectedprivateRectangleTrianglePolygon

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์•ก์„ธ์Šค ์œ ํ˜•์„ ์š”์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ž…์žฅpublicprotectedprivate

Access public protected private
members of the same class ์˜ˆ ์˜ˆ ์˜ˆ
members of derived class ์˜ˆ ์˜ˆ ์•„๋‹ˆ์š”
not members ์˜ˆ ์•„๋‹ˆ์š” ์•„๋‹ˆ์š”

main์—ฌ๊ธฐ์„œ "๋น„ํšŒ์›"์€ ๋‹ค๋ฅธ ํด๋ž˜์Šค ๋˜๋Š” ํ•จ์ˆ˜์—์„œ ์™€ ๊ฐ™์ด ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค .

์œ„์˜ ์˜ˆ์—์„œ ๋ฉค๋ฒ„๋Š” ์— ์˜ํ•ด ์ƒ์†๋˜๊ณ  ๊ธฐ๋ณธ ํด๋ž˜์Šค์—์„œ Rectangle์™€ Triangle๋™์ผํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค Polygon.

Polygon::width           // protected access
Rectangle::width         // protected access

Polygon::set_values()    // public access
Rectangle::set_values()  // public access  

์ด๋Š” ์ƒ์† ๊ด€๊ณ„๊ฐ€ publicํŒŒ์ƒ๋œ ๊ฐ ํด๋ž˜์Šค์—์„œ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

class Rectangle: public Polygon { /* ... */ }

์ฝœ๋ก ( ) ๋’ค์˜ ์ด publicํ‚ค์›Œ๋“œ๋Š” ๋’ค์— ์˜ค๋Š” ํด๋ž˜์Šค( ์ด ๊ฒฝ์šฐ )์—์„œ ์ƒ์†๋œ ๋ฉค๋ฒ„ ๊ฐ€ ํŒŒ์ƒ ํด๋ž˜์Šค( ์ด ๊ฒฝ์šฐ )์—์„œ ๊ฐ€์งˆ :์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค . ๊ฐ€ ๊ฐ€์žฅ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์ด๋ฏ€๋กœ ์ด ํ‚ค์›Œ๋“œ๋ฅผ ์ง€์ •ํ•˜๋ฉด ํŒŒ์ƒ ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์—์„œ์™€ ๋™์ผํ•œ ์ˆ˜์ค€์„ ๊ฐ€์ง„ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค . ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ณต์šฉ ๋ฉค๋ฒ„๊ฐ€ ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ์™€ ๊ฐ™์ด ์ƒ์†๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ฐ€์žฅ ์ œํ•œ์ ์ธ ์•ก์„ธ์Šค ์ˆ˜์ค€์„ ์ง€์ • ํ•˜๋ฉด( ) ๋ชจ๋“  ๊ธฐ๋ณธ ํด๋ž˜์Šค ๋ฉค๋ฒ„๊ฐ€ ๋กœ ์ƒ์†๋ฉ๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด ๋”ธ์ด ์–ด๋จธ๋‹ˆ๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋œ ํด๋ž˜์Šค์ธ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.PolygonRectanglepublic

protectedprotectedprivateprivate

class Daughter: protected Mother;

์ด๊ฒƒ์€ ์–ด๋จธ๋‹ˆ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ protected๊ตฌ์„ฑ์›์— ๋Œ€ํ•ด ๋œ ์ œํ•œ์ ์ธ ์•ก์„ธ์Šค ์ˆ˜์ค€์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค . Daughter์ฆ‰, ์— ์žˆ๋˜ ๋ชจ๋“  ๋ฉค๋ฒ„ ๊ฐ€ ๊ฐ€ public๋ฉ๋‹ˆ๋‹ค . ๋ฌผ๋ก  ์ด๊ฒƒ์€ ์ž์‹ ์˜ public ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐ ์ œํ•œ์„ ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋œ ์ œํ•œ์ ์ธ ์•ก์„ธ์Šค ์ˆ˜์ค€ ์€ ์—์„œ ์ƒ์†๋œ ๊ตฌ์„ฑ์›์— ๋Œ€ํ•ด์„œ๋งŒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค . ์ƒ์†์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ˆ˜์ค€์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค์— ๋Œ€ํ•ด private๋กœ ๊ฐ€์ •ํ•˜๊ณ  ๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค์— ๋Œ€ํ•ด public์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค .MotherprotectedDaughterDaughterMother

classstruct

์‹ค์ œ๋กœ C++์—์„œ ์ƒ์†์˜ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๊ณต๊ฐœ ์ƒ์†์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ๋‹ค๋ฅธ ์•ก์„ธ์Šค ์ˆ˜์ค€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€์‹  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ๋” ์ž˜ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์›์น™์ ์œผ๋กœ ๊ณต๊ฐœ์ ์œผ๋กœ ํŒŒ์ƒ๋œ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ์„ ์ œ์™ธํ•œ ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒ์„ฑ์ž์™€ ์†Œ๋ฉธ์ž
  • ํ• ๋‹น ์—ฐ์‚ฐ์ž ๋ฉค๋ฒ„(operator=)
  • ๊ทธ ์นœ๊ตฌ๋“ค
  • ๊ฐœ์ธ ํšŒ์›


๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ๋ฐ ์†Œ๋ฉธ์ž์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋Š” ๊ทธ๋Œ€๋กœ ์ƒ์†๋˜์ง€ ์•Š์ง€๋งŒ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ๋ฐ ์†Œ๋ฉธ์ž์— ์˜ํ•ด ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋‹ฌ๋ฆฌ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒ์„ฑ์ž). ์ดˆ๊ธฐํ™” ๋ชฉ๋ก์—์„œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

derived_constructor_name (parameters) : base_constructor_name (parameters) {...}

// constructors and derived classes
#include <iostream>
using namespace std;

class Mother {
  public:
    Mother ()
      { cout << "Mother: no parameters\n"; }
    Mother (int a)
      { cout << "Mother: int parameter\n"; }
};

class Daughter : public Mother {
  public:
    Daughter (int a)
      { cout << "Daughter: int parameter\n\n"; }
};

class Son : public Mother {
  public:
    Son (int a) : Mother (a)
      { cout << "Son: int parameter\n\n"; }
};

int main () {
  Daughter kelly(0);
  Son bud(0);
  
  return 0;
}

Mother์ƒˆ๋กœ์šด Daughter๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์˜ ์ƒ์„ฑ์ž์™€ ๊ฐ์ฒด ์ผ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ƒ์„ฑ์ž ์˜ ์ฐจ์ด์ ์— ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค Son. Daughter์ฐจ์ด์ ์€ ๋ฐ ์˜ ์ƒ์„ฑ์ž ์„ ์–ธ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค Son.

Daughter (int a)          // nothing specified: call default constructor
Son (int a) : Mother (a)  // constructor specified: call this specific constructor

๋‹ค์ค‘ ์ƒ์†

ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ํด๋ž˜์Šค ๋ชฉ๋ก(์ฆ‰, ์ฝœ๋ก  ๋’ค)์—์„œ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋” ๋งŽ์€ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ๋‹จ์ˆœํžˆ ์ง€์ •ํ•˜์—ฌ ๋‘˜ ์ด์ƒ์˜ ํด๋ž˜์Šค์—์„œ ์ƒ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋กœ๊ทธ๋žจ์— ๋ผ๋Š” ํ™”๋ฉด์— ์ธ์‡„ํ•  ํŠน์ • ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ  ํด๋ž˜์Šค๋ฅผ Output์›ํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค ์™ธ์— ํ•ด๋‹น ๋ฉค๋ฒ„๋„ ์ƒ์†๋ฐ›๊ธฐ๋ฅผ ์›ํ•˜๋ฉด ๋‹ค์Œ Rectangle๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.TrianglePolygon

class Rectangle: public Polygon, public Output;
class Triangle: public Polygon, public Output;
// multiple inheritance
#include <iostream>
using namespace std;

class Polygon {
  protected:
    int width, height;
  public:
    Polygon (int a, int b) : width(a), height(b) {}
};

class Output {
  public:
    static void print (int i);
};

void Output::print (int i) {
  cout << i << '\n';
}

class Rectangle: public Polygon, public Output {
  public:
    Rectangle (int a, int b) : Polygon(a,b) {}
    int area ()
      { return width*height; }
};

class Triangle: public Polygon, public Output {
  public:
    Triangle (int a, int b) : Polygon(a,b) {}
    int area ()
      { return width*height/2; }
};
  
int main () {
  Rectangle rect (4,5);
  Triangle trgl (4,5);
  rect.print (rect.area());
  Triangle::print (trgl.area());
  return 0;
}

'๐Ÿ“ Development Study > ๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ป C++' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํ˜•๋ณ€ํ™˜  (0) 2022.08.22
๋‹คํ˜•์„ฑ  (0) 2022.08.22
์ƒ์„ฑ์ž/์†Œ๋ฉธ์ž  (0) 2022.08.22
ํด๋ž˜์Šค(2)  (0) 2022.08.19
ํด๋ž˜์Šค(1)  (0) 2022.08.19

๋Œ“๊ธ€