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

ํด๋ž˜์Šค(1)

by eazuooz 2022. 8. 19.

ํด๋ž˜์Šค ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ํ™•์žฅ๋œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค . ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•จ์ˆ˜๋ฅผ ๋ฉค๋ฒ„๋กœ ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์ฒด ๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šคํ™”์ž…๋‹ˆ๋‹ค . ๋ณ€์ˆ˜์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ํด๋ž˜์Šค๋Š” ์œ ํ˜•์ด๊ณ  ๊ฐ์ฒด๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค๋Š” ๋‹ค์Œ ๊ตฌ๋ฌธ๊ณผ ํ•จ๊ป˜ ํ‚ค์›Œ๋“œ class๋˜๋Š” ํ‚ค์›Œ๋“œ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋ฉ๋‹ˆ๋‹ค.struct

class class_name {
  access_specifier_1:
    member1;
  access_specifier_2:
    member2;
  ...
} object_names;

์—ฌ๊ธฐ์„œ class_name๋Š” ํด๋ž˜์Šค์˜ ์œ ํšจํ•œ ์‹๋ณ„์ž์ด๊ณ  object_names๋Š” ์ด โ€‹โ€‹ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์„ ํƒ์  ์ด๋ฆ„ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์„ ์–ธ์˜ ๋ณธ๋ฌธ์—๋Š” ๋ฐ์ดํ„ฐ ๋˜๋Š” ํ•จ์ˆ˜ ์„ ์–ธ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ฉค๋ฒ„ ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„ ํƒ์ ์œผ๋กœ ์ง€์ •์ž์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ํด๋ž˜์Šค๋Š” ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ณ  ์•ก์„ธ์Šค ์ง€์ • ์ž๋ผ๋Š” ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

์™€ ๋™์ผํ•œ ํ˜•์‹์„ ๊ฐ– ์Šต๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ์ง€์ • ์ž๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ํ‚ค์›Œ๋“œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. , ๋˜๋Š” . ์ด๋Ÿฌํ•œ ์ง€์ •์ž๋Š” ๋’ค์— ์˜ค๋Š” ๊ตฌ์„ฑ์›์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.privatepublicprotected

  • privateํด๋ž˜์Šค์˜ ๊ตฌ์„ฑ์›์€ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์›(๋˜๋Š” "์นœ๊ตฌ" )์—์„œ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • protected๋ฉค๋ฒ„๋Š” ๊ฐ™์€ ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ๋ฉค๋ฒ„(๋˜๋Š” "์นœ๊ตฌ" )์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์—์„œ๋„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ public๊ฐœ์ฒด๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋ชจ๋“  ์œ„์น˜์—์„œ ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ธฐ๋ณธ์ ์œผ๋กœ classํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” ๋ชจ๋“  ๋ฉค๋ฒ„์— ๋Œ€ํ•ด ๋น„๊ณต๊ฐœ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์•ก์„ธ์Šค ์ง€์ •์ž ๋ณด๋‹ค ๋จผ์ € ์„ ์–ธ๋œ ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” ์ž๋™์œผ๋กœ ๊ฐœ์ธ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

class Rectangle {
    int width, height;
  public:
    void set_values (int,int);
    int area (void);
} rect;

Rectangleํ˜ธ์ถœ๋œ ํด๋ž˜์Šค(์ฆ‰, ์œ ํ˜•) ์™€ ์ด ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด(์ฆ‰, ๋ณ€์ˆ˜)๋ฅผ ๋ผ๊ณ  ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค rect. ์ด ํด๋ž˜์Šค์—๋Š” 4๊ฐœ์˜ ๋ฉค๋ฒ„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ณต๊ฐœ ์•ก์„ธ์Šค (private๊ฐ€ ๊ธฐ๋ณธ ์•ก์„ธ์Šค ์ˆ˜์ค€์ด๊ธฐ ๋•Œ๋ฌธ์— ) ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ int๋ฉค๋ฒ„ 2 width๊ฐœ์™€ ๊ณต๊ฐœ ์•ก์„ธ์Šค ๊ฐ€ ์žˆ๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜ 2๊ฐœ : ํ•จ์ˆ˜ ๋ฐ , ์ง€๊ธˆ์€ ๊ทธ ์„ ์–ธ๋งŒ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค. , ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์˜ ์ •์˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ด๋ฆ„ ๊ณผ ๊ฐ์ฒด ์ด๋ฆ„ ์˜ ์ฐจ์ด์ ์— ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค . ์ด์ „ ์˜ˆ์—์„œ ๋Š” ํด๋ž˜์Šค ์ด๋ฆ„ (์ฆ‰, ์œ ํ˜•)์ธ ๋ฐ˜๋ฉด ๋Š” ์œ ํ˜•์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.heightset_valuesarea

RectanglerectRectangle. ๋™์ผํ•œ ๊ด€๊ณ„ int์ด๋ฉฐ a๋‹ค์Œ ์„ ์–ธ์— ์žˆ์Šต๋‹ˆ๋‹ค.

int a;

์—ฌ๊ธฐ์„œ int๋Š” ์œ ํ˜• ์ด๋ฆ„(ํด๋ž˜์Šค)์ด๊ณ  a๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„(๊ฐ์ฒด)์ž…๋‹ˆ๋‹ค. ๋ฐ

์˜ ์„ ์–ธ ํ›„, object์˜ ๋ชจ๋“  public ๋ฉค๋ฒ„๋Š” object name ๊ณผ member name ์‚ฌ์ด ์— ์ ()์„ ์‚ฝ์ž…ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋‚˜ ์ผ๋ฐ˜ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด๊ฒƒ์€ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:Rectanglerectrect.

rect.set_values (3,4);
myarea = rect.area();

rectํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ์œ ์ผํ•œ ๋ฉค๋ฒ„ ๋Š” width๋ฐ height, ๋น„๊ณต๊ฐœ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๊ณ  ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ๋ฉค๋ฒ„ ๋‚ด์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Rectangle ํด๋ž˜์Šค์˜ ์ „์ฒด ์˜ˆ์ž…๋‹ˆ๋‹ค.

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

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

void Rectangle::set_values (int x, int y) {
  width = x;
  height = y;
}

int main () {
  Rectangle rect;
  rect.set_values (3,4);
  cout << "area: " << rect.area();
  return 0;
}

์ด ์˜ˆ ์—์„œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๊ด€๋ จํ•˜์—ฌ ์ด์ „ ์žฅ์—์„œ ๋ณธ ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž ( ::, ๋‘ ๊ฐœ์˜ ์ฝœ๋ก )๋ฅผ ๋‹ค์‹œ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ set_values์—์„œ ํด๋ž˜์Šค ์ž์ฒด ์™ธ๋ถ€์˜ ํด๋ž˜์Šค ๋ฉค๋ฒ„๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ ์ •์˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์˜ ์ •์˜ ๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•˜๊ธฐ ๋•Œ๋ฌธ์— areaํด๋ž˜์Šค ์ •์˜ ๋‚ด์— ์ง์ ‘ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค . Rectangle๋ฐ˜๋Œ€๋กœ, set_valuesํด๋ž˜์Šค ๋‚ด์—์„œ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋  ๋ฟ์ด์ง€๋งŒ ์ •์˜๋Š” ํด๋ž˜์Šค ์™ธ๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์™ธ๋ถ€ ์ •์˜์—์„œ ๋ฒ”์œ„( )์˜ ์—ฐ์‚ฐ์ž๋Š” ์ •์˜๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ๋น„๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ::ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์ž„์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค . ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž(Rectangle

::) ์ •์˜๋˜๋Š” ๋ฉค๋ฒ„๊ฐ€ ์†ํ•œ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ด ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ํด๋ž˜์Šค ์ •์˜ ๋‚ด์— ์ง์ ‘ ํฌํ•จ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ฒ”์œ„ ์†์„ฑ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ „ ์˜ˆ์ œ์˜ ํ•จ์ˆ˜ ๋Š” class ์˜ private ๋ฉค๋ฒ„์ธ set_values๋ณ€์ˆ˜ width๋ฐ ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ this์™€ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ๋ฉค๋ฒ„์—์„œ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ •์˜ ๋‚ด์—์„œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์™„์ „ํžˆ ์ •์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ํ•จ์ˆ˜์— ์„ ์–ธ์„ ํฌํ•จํ•˜๊ณ  ๋‚˜์ค‘์— ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์ •์˜ํ•˜๋Š” ๊ฒƒ์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์— ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ์ธ๋ผ์ธ ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.heightRectangle

์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ธ ๋ฐ˜๋ฉด ๋‘ ๋ฒˆ์งธ์—์„œ๋Š” ์ผ๋ฐ˜(์ธ๋ผ์ธ์ด ์•„๋‹Œ) ํด๋ž˜์Šค ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋™์ž‘์—๋Š” ์ฐจ์ด๊ฐ€ ์—†์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฉค๋ฒ„ width๋ฐ height๊ฐœ์ธ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ‚ค์›Œ๋“œ๋กœ ์ •์˜๋œ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” ๊ฐœ์ธ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ์Œ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค class). private๋กœ ์„ ์–ธํ•˜๋ฉด ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ๋‚ด์˜ ํ•ด๋‹น ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์ด๋ฏธ ์ •์˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.set_values. ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ์ง์ ‘ ์•ก์„ธ์Šคํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์˜ˆ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์œ ์šฉํ•œ์ง€ ์•Œ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ํฐ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฐ’์ด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ด€์ ์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ทธ ๋ฌผ์ฒด).

ํด๋ž˜์Šค์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์†์„ฑ์€ ์œ ํ˜•์ด๋ฉฐ, ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค์˜ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, class ์˜ ์ด์ „ ์˜ˆ์ œ์— ๋”ฐ๋ผ ์šฐ๋ฆฌ๋Š” object ์™ธ์— object๋ฅผ Rectangle์„ ์–ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค .rectbrect

// example: one class, two objects
#include <iostream>
using namespace std;

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

void Rectangle::set_values (int x, int y) {
  width = x;
  height = y;
}

int main () {
  Rectangle rect, rectb;
  rect.set_values (3,4);
  rectb.set_values (5,6);
  cout << "rect area: " << rect.area() << endl;
  cout << "rectb area: " << rectb.area() << endl;
  return 0;
}

์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์— ํด๋ž˜์Šค(๊ฐ์ฒด์˜ ์œ ํ˜•)๋Š” ์ด๋ฉฐ Rectangle, ๊ทธ ์ค‘ ๋‘ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค(์ฆ‰, ๊ฐ์ฒด)๊ฐ€ rect์žˆ์Šต๋‹ˆ๋‹ค rectb. ๊ทธ๋“ค ๊ฐ๊ฐ์—๋Š” ๊ณ ์œ ํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ์— ๋Œ€ํ•œ ํ˜ธ์ถœ rect.area()๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค rectb.area(). ์ด๋Š” ํด๋ž˜์Šค์˜ ๊ฐ ๊ฐœ์ฒด์— Rectangle๊ณ ์œ ํ•œ ๋ณ€์ˆ˜๊ฐ€ width์žˆ๊ณ  height, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ๊ณ ์œ ํ•œ ํ•จ์ˆ˜ ๋ฉค๋ฒ„ ๊ฐ€ set_value์žˆ๊ณ  area๊ฐœ์ฒด์˜ ๊ณ ์œ ํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์—์„œ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์™€ ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„์ด๋ฏ€๋กœ ํ•ธ๋“ค๋Ÿฌ ๋˜๋Š” ๊ธฐํƒ€ ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ๋ฉค๋ฒ„๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฐ์ฒด์˜ ์ผ๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ณ  ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. rect.area๋˜๋Š” ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์— ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค rectb.area. ์ด๋Ÿฌํ•œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ๊ฐœ์ฒด rect๋ฐ ์˜ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค rectb.

์ƒ์„ฑ์ž

area์ด์ „ ์˜ˆ์ œ์—์„œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœํ–ˆ๋‹ค๋ฉด set_values์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋ฉค๋ฒ„ width์™€ height๊ฐ’์ด ํ• ๋‹น๋œ ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ์ •๋˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์—๋Š” ํ•ด๋‹น ํด๋ž˜์Šค ์˜ ์ƒˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ์ƒ์„ฑ์ž

๋ผ๋Š” ํŠน์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํด๋ž˜์Šค๊ฐ€ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์„ ์–ธ๋˜์ง€๋งŒ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ . ์œ„ ์˜ ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

void

Rectangle

// example: class constructor
#include <iostream>
using namespace std;

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

Rectangle::Rectangle (int a, int b) {
  width = a;
  height = b;
}

int main () {
  Rectangle rect (3,4);
  Rectangle rectb (5,6);
  cout << "rect area: " << rect.area() << endl;
  cout << "rectb area: " << rectb.area() << endl;
  return 0;
}

์ด ์˜ˆ์ œ์˜ ๊ฒฐ๊ณผ๋Š” ์ด์ „ ์˜ˆ์ œ์˜ ๊ฒฐ๊ณผ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ํด๋ž˜์Šค Rectangle์—๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ์—†๊ณ  set_values๋Œ€์‹  ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ , ์ „๋‹ฌ๋œ ์ธ์ˆ˜ ๋กœ width๋ฐ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์ˆœ๊ฐ„์— ์ด๋Ÿฌํ•œ ์ธ์ˆ˜๊ฐ€ ์ƒ์„ฑ์ž์— ์–ด๋–ป๊ฒŒ ์ „๋‹ฌ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.height

Rectangle rect (3,4);
Rectangle rectb (5,6);

์ƒ์„ฑ์ž๋Š” ์ผ๋ฐ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ƒˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž ํ”„๋กœํ† ํƒ€์ž… ์„ ์–ธ(ํด๋ž˜์Šค ๋‚ด)์ด๋‚˜ ํ›„์ž์˜ ์ƒ์„ฑ์ž ์ •์˜ ๋ชจ๋‘ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ–์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์— ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค. not even void: ์ƒ์„ฑ์ž๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž ์˜ค๋ฒ„๋กœ๋”ฉ

๋‹ค๋ฅธ ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ์„ฑ์ž๋Š” ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ฒ„์ „์œผ๋กœ ์˜ค๋ฒ„๋กœ๋“œ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ธ์ˆ˜์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

// overloading class constructors
#include <iostream>
using namespace std;

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

Rectangle::Rectangle () {
  width = 5;
  height = 5;
}

Rectangle::Rectangle (int a, int b) {
  width = a;
  height = b;
}

int main () {
  Rectangle rect (3,4);
  Rectangle rectb;
  cout << "rect area: " << rect.area() << endl;
  cout << "rectb area: " << rectb.area() << endl;
  return 0;
}

์œ„์˜ ์˜ˆ์—์„œ ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค ๊ฐ์ฒด Rectangle๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: rect๋ฐ rectb. rect์ด์ „ ์˜ˆ์ œ์™€ ๊ฐ™์ด ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ์˜ˆ์ œ๋Š” ๋˜ํ•œ ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜์˜ ์ƒ์„ฑ์ž๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค: ๊ธฐ๋ณธ ์ƒ์„ฑ์ž . ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒ์„ฑ์ž์ด๋ฉฐ ๊ฐ์ฒด๊ฐ€ ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ์ธ์ˆ˜๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์„ ๋•Œ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์—์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋Š” ์— ๋Œ€ํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค rectb. ๊ฐ€ ๋นˆ ๊ด„ํ˜ธ ์„ธํŠธ๋กœ ๊ตฌ์„ฑ๋˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค rectb. ์‚ฌ์‹ค, ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ๋นˆ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Rectangle rectb;   // ok, default constructor called
Rectangle rectc(); // oops, default constructor NOT called

์ด๋Š” ๋นˆ ๊ด„ํ˜ธ ์„ธํŠธ๊ฐ€ rectc๊ฐ์ฒด ์„ ์–ธ ๋Œ€์‹  ํ•จ์ˆ˜ ์„ ์–ธ์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  type ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค Rectangle.

Uniform initialization

์œ„์™€ ๊ฐ™์ด ์ธ์ˆ˜๋ฅผ ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์„ ํ•จ์ˆ˜ํ˜• ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ์ž๋Š” ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์œผ๋กœ๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ƒ์„ฑ์ž๋Š” ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ(๋“ฑํ˜ธ ๋’ค์— ์ธ์ˆ˜๊ฐ€ ์˜ด)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ตœ๊ทผ์—๋Š” C++์—์„œ ๊ท ์ผ ์ดˆ๊ธฐํ™”

class_name object_name = initialization_value;

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

class_name object_name { value, value, value, ... }

// classes and uniform initialization
#include <iostream>
using namespace std;

class Circle {
    double radius;
  public:
    Circle(double r) { radius = r; }
    double circum() {return 2*radius*3.14159265;}
};

int main () {
  Circle foo (10.0);   // functional form
  Circle bar = 20.0;   // assignment init.
  Circle baz {30.0};   // uniform init.
  Circle qux = {40.0}; // POD-like

  cout << "foo's circumference: " << foo.circum() << '\n';
  return 0;
}

ํ•จ์ˆ˜ํ˜•์— ๋Œ€ํ•œ ๊ท ์ผ ์ดˆ๊ธฐํ™”์˜ ์žฅ์ ์€ ๊ด„ํ˜ธ์™€ ๋‹ฌ๋ฆฌ ์ค‘๊ด„ํ˜ธ๊ฐ€ ํ•จ์ˆ˜ ์„ ์–ธ๊ณผ ํ˜ผ๋™๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Rectangle rectb;   // default constructor called
Rectangle rectc(); // function declaration (default constructor NOT called)
Rectangle rectd{}; // default constructor called 

์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ๋ฌธ์˜ ์„ ํƒ์€ ์ฃผ๋กœ ์Šคํƒ€์ผ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์กด ์ฝ”๋“œ๋Š” ํ˜„์žฌ ๊ธฐ๋Šฅ์  ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์ผ๋ถ€ ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์—์„œ๋Š” ์œ ํ˜•์œผ๋กœ ์„ ํ˜ธํ•˜๋Š” ์ž ์žฌ์ ์ธ ํ•จ์ •์ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ๊ท ์ผํ•œ ์ดˆ๊ธฐํ™”๋ฅผ ์„ ํƒํ•˜๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค

์ƒ์„ฑ์ž์˜ ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™”

์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฉค๋ฒ„๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณธ๋ฌธ์˜ ๋ช…๋ น๋ฌธ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ด๋Ÿฌํ•œ ๋‹ค๋ฅธ ๋ฉค๋ฒ„๋ฅผ ์ง์ ‘ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒ์„ฑ์ž์˜ ๋ณธ๋ฌธ ์•ž์— ์ฝœ๋ก ( :)๊ณผ ํด๋ž˜์Šค ๋ฉค๋ฒ„์˜ ์ดˆ๊ธฐํ™” ๋ชฉ๋ก์„ ์‚ฝ์ž…ํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์„ ์–ธ์ด ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

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

์ด ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” ํ‰์†Œ์™€ ๊ฐ™์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Rectangle::Rectangle (int x, int y) { width=x; height=y; }

๊ทธ๋Ÿฌ๋‚˜ ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™” ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค .

Rectangle::Rectangle (int x, int y) : width(x) { height=y; }

๋˜๋Š”:

Rectangle::Rectangle (int x, int y) : width(x), height(y) { }

์ด ๋งˆ์ง€๋ง‰ ๊ฒฝ์šฐ์— ์ƒ์„ฑ์ž๋Š” ๋ฉค๋ฒ„๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋นˆ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์œ ํ˜•์˜ ๋ฉค๋ฒ„์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž ์œ„์˜ ๋ฐฉ๋ฒ• ์ค‘ ์–ด๋–ค ๊ฒƒ์ด ์ •์˜๋˜๋Š”์ง€ ์ฐจ์ด๊ฐ€ โ€‹โ€‹์—†์ง€๋งŒ ๋ฉค๋ฒ„ ๊ฐ์ฒด(์œ ํ˜•์ด ํด๋ž˜์Šค์ธ ๊ฐ์ฒด)์˜ ๊ฒฝ์šฐ ์ฝœ๋ก  ๋’ค์— ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

// member initialization
#include <iostream>
using namespace std;

class Circle {
    double radius;
  public:
    Circle(double r) : radius(r) { }
    double area() {return radius*radius*3.14159265;}
};

class Cylinder {
    Circle base;
    double height;
  public:
    Cylinder(double r, double h) : base (r), height(h) {}
    double volume() {return base.area() * height;}
};

int main () {
  Cylinder foo (10,20);

  cout << "foo's volume: " << foo.volume() << '\n';
  return 0;
}

์ด ์˜ˆ์—์„œ class ์—๋Š” ์œ ํ˜•์ด ๋‹ค๋ฅธ ํด๋ž˜์Šค( ์˜ ์œ ํ˜•์€ ) Cylinder์ธ ๋ฉค๋ฒ„ ๊ฐœ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ ์ƒ์„ฑ์ž๋Š” ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ฉค๋ฒ„ ์ด๋‹ˆ์…œ๋ผ์ด์ € ๋ชฉ๋ก ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ดˆ๊ธฐํ™”๋Š” ๊ด„ํ˜ธ ๋Œ€์‹  ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ท ์ผํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค .baseCircleCircleCylinderbase

Cylinder::Cylinder (double r, double h) : base{r}, height{h} { }

ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ

๊ฐ์ฒด๋Š” ํฌ์ธํ„ฐ๋กœ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ์„ ์–ธ๋˜๋ฉด ํด๋ž˜์Šค๋Š” ์œ ํšจํ•œ ์œ ํ˜•์ด ๋˜๋ฏ€๋กœ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

Rectangle * prect;

ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค Rectangle.

์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ํ™”์‚ดํ‘œ ์—ฐ์‚ฐ์ž( )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ์ธํ„ฐ์—์„œ ๊ฐœ์ฒด์˜ ๋ฉค๋ฒ„์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ->. ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

// pointer to classes example
#include <iostream>
using namespace std;

class Rectangle {
  int width, height;
public:
  Rectangle(int x, int y) : width(x), height(y) {}
  int area(void) { return width * height; }
};


int main() {
  Rectangle obj (3, 4);
  Rectangle * foo, * bar, * baz;
  foo = &obj;
  bar = new Rectangle (5, 6);
  baz = new Rectangle[2] { {2,5}, {3,6} };
  cout << "obj's area: " << obj.area() << '\n';
  cout << "*foo's area: " << foo->area() << '\n';
  cout << "*bar's area: " << bar->area() << '\n';
  cout << "baz[0]'s area:" << baz[0].area() << '\n';
  cout << "baz[1]'s area:" << baz[1].area() << '\n';       
  delete bar;
  delete[] baz;
  return 0;
}	

์ด ์˜ˆ์ œ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด์™€ ํฌ์ธํ„ฐ(์—ฐ์‚ฐ์ž *, &, ., ->, [])๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œํ˜„๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

expression can be read as
*x pointed to by x
&x address of x
x.y member y of object x
x->y member y of object pointed to by x
(*x).y member y of object pointed to by x (equivalent to the previous one)
x[0] first object pointed to by x
x[1] second object pointed to by x
x[n] (n+1)th object pointed to by x

์ด๋Ÿฌํ•œ ํ‘œํ˜„์˜ ๋Œ€๋ถ€๋ถ„์€ ์ด์ „ ์žฅ์—์„œ ์†Œ๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์žฅ์—์„œ๋Š” ์˜คํ”„์…‹ ์—ฐ์‚ฐ์ž( [])๋ฅผ ์†Œ๊ฐœํ–ˆ๊ณ  ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ๋Š” ํ™”์‚ดํ‘œ ์—ฐ์‚ฐ์ž( ->)๋ฅผ ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด ๋ฐ ๊ณต์šฉ์ฒด๋กœ ์ •์˜๋œ ํด๋ž˜์Šค

ํด๋ž˜์Šค๋Š” ํ‚ค์›Œ๋“œ class๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ‚ค์›Œ๋“œ struct๋ฐ ๋กœ๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค union.

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

๋ฐ˜๋Œ€๋กœ ๊ณต์šฉ์ฒดstruct ์˜ ๊ฐœ๋…์€ and ๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค์˜ ๊ฐœ๋…๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.class, ๊ณต์šฉ์ฒด๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋งŒ ์ €์žฅํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํด๋ž˜์Šค์ด๊ธฐ๋„ ํ•˜๋ฏ€๋กœ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋„ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์šฉ์ฒด ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ์•ก์„ธ์Šค๋Š” ์ž…๋‹ˆ๋‹ค public.

๋Œ“๊ธ€