cpp_static - 8BitsCoding/RobotMentor GitHub Wiki

static

  • ๋ฒ”์œ„์˜ ์ œํ•œ์„ ๋ฐ›๋Š” ์ „์—ญ ๋ณ€์ˆ˜(ํ•ต์‹ฌ์€ ์ „์—ญ๋ณ€์ˆ˜๋กœ์„œ ์ง€์›Œ์ง€์ง€ ์•Š๋Š” ๋‹ค๋Š”์ ~)
  • ๋ฒ”์œ„?
    • ํŒŒ์ผ ์†
    • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์†
    • ํด๋ž˜์Šค ์†
    • ํ•จ์ˆ˜ ์†

extern์€ ๋ญ”๋ฐ?

  • ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ์ „์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.
  • extern์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค๋ฉด? ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ–์€ gloval value๋Š” ์•„๋‹ˆ์ง€๋งŒ ์–ด๋”˜๊ฐ€ ์„ ์–ธ์ด ๋˜์–ด ์žˆ๋‹ค. ์ฐพ์•„๋ณด์ž.
// ExternTest.h
extern int globalValue; // ์–ด๋””์—”๊ฐ€ ์„ ์–ธ์ด ๋˜์–ด ์žˆ๋‹ค๊ณ  ์•Œ๋ฆฐ๋‹ค.

void IncreaseValue();

// ExternTest.cpp
int globalValue = 2;

void IncreaseValue() {
    globalValue++;
}

static์€ extern์„ ๋ง‰๋Š”๋ฐ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

// ExternTest.h
extern int globalValue;

void IncreaseValue();

// ExternTest.cpp
static int globalValue = 2;     // ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ์‹œ ๋งํฌ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ, static์€ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•œ ์ „์—ญ ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

void IncreaseValue() {
    globalValue++;
}

static์˜ ์‚ฌ์šฉ 1 - ํ•จ์ˆ˜ ์† Static

void Accumulate(int number)
{
    static int result = 0;
    result += number;           // ํ•จ์ˆ˜์— ๋“ค์–ด์˜ฌ๋•Œ๋งˆ๋‹ค ๋ˆ„์ ๋œ๋‹ค.

    std::cout << "result = " << result << std::endl;
}

// main
result = 1; // ์ ‘๊ทผ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ

static์˜ ์‚ฌ์šฉ 2 - ์ •์  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜

class Cat {
public:
    Cat();
private:
    static int mCount;
};

// Cat.cpp
int Cat::mCount = 0;    // ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ํ•จ์ˆ˜์•ˆ์—์„œ ์ •์ ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์ง€๋ง ๊ฒƒ

    ํด๋ž˜์Šค ์•ˆ์—์„œ ๋„ฃ์ž.

  • ์ „์—ญ๋ณ€์ˆ˜ ๋Œ€์‹  ์ •์  ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์“ฐ์ž.

  • C์Šคํƒ€์ผ์˜ ์ •์ ๋ณ€์ˆ˜๋ฅผ ์“ธ ์ด์œ ๊ฐ€ ์—†์Œ.


์งˆ๋ฌธ

์•„๋ž˜์ฝ”๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š” mCount๋ณ€์ˆ˜๊ฐ€ ๋ช‡๊ฐœ ์ผ๊นŒ? mCount์˜ ๊ฐ’์€?? new๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹นํ•จ์„ ๊ธฐ์–ตํ•ด๋ณด์ž

class Cat {
public:
    Cat(int age, const string& name);
private:
    static int mCount;
};

// Cat.cpp
int Cat::mCount = 0;
Cat::Cat(int age, const string& name) {
    ++mCount;
}


// Main
Cat* myCat = new Cat(2, "Coco1");
Cat* yoursCat = new Cat(5, "Coco2");
Cat* hisCat = new Cat(7, "Coco3");
Cat* herCat = new Cat(9, "Coco4");

๋‹ต์€ 4๊ฐœ ๋ฉ”๋ชจ๋ฆฌ๋Š” 1๊ฐœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์„œ ์„ ์–ธํ•˜๋”๋ผ๋„ ๊ฒฐ๊ตญ์€ static์ž„์„ ๊ธฐ์–ตํ•˜์ž~


static์˜ ์‚ฌ์šฉ 3 - ์ •์  ๋ฉค๋ฒ„ ํ•จ์ˆ˜

  • ๋…ผ๋ฆฌ์  ๋ฒ”์œ„์— ์ œํ•œ ๋œ ์ „์—ญ ํ•จ์ˆ˜
  • ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ •์  ๋ฉค๋ฒ„์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ๊ฐœ์ฒด๊ฐ€ ์—†์ด๋„ ์ •์ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋‹ค.(์ด๊ฑธ์œ„ํ•ด์„œ ์“ด๋‹ค.)

Math::Square(10);

class Math {
public:
    static int Square(int number);
};

// Math.cpp
int Math::Square(int number) {
    return number * number;
}

์ด๋Ÿฐ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋‚˜??

class Cat {
public:
    Cat(const std::string& name);
    static const char* GetName();       // ์ •์  ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ๋“ฑ๋ก
private:
    char* mName;
    static int mCount;
};

// Cat.cpp
const char* Cat::GetName() {
    return mName;                       // ?? mName์€ static์ด ์•„๋‹Œ๋ฐ? ๋ฆฌํ„ด์ด ๊ฐ€๋Šฅํ•œ๊ฐ€ ??
}

์šฐ์„  ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ! ์ปดํŒŒ์ผ๋Ÿฌ์— ๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•  ๊ฒƒ!


Example

// Math.h
class Math {
    // ...
    static int Ceil(float value);
    static int Floor(float value);
    static float Power(float value);
    static int Round(float value);
}

static ์‚ฌ์šฉ

static ๋ณ€์ˆ˜:

  • ๊ฐ™์€ ํด๋ž˜์Šค ํ˜•์œผ๋กœ ์„ ์–ธ๋œ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋“ค์ด ๋™์ผํ•œ ํ•˜๋‚˜์˜ ์ž๋ฃŒ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.
  • ์‚ฌ์šฉ์€ ํด๋ž˜์Šค ์ •์˜ ์‹œ ๋ฉค๋ฒ„๋ฅผ static์ด๋ž€ ํ‚ค์›Œ๋“œ๋กœ ์ •์˜ํ•œ๋‹ค.
  • ํด๋ž˜์Šค ๋‚ด์— ์„ ์–ธ๋œ ์ •์ •๋ฉค๋ฒ„๋Š” ์ •์ ๋ฉค๋ฒ„๊ฐ€ ์„ ์–ธ๋œ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ ์˜์—ญ์ด ์ œํ•œ๋œ ์ „์—ญ๋ณ€์ˆ˜๋ผ ์ƒ๊ฐํ•˜์ž.
  • ํด๋ž˜์Šค ๋‚ด์—์„œ ์ •์ ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ •์  ๋ฉค๋ฒ„ ์ž์ฒด๊ฐ€ ์ •์˜๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ๋ฐ–์—์„œ ์ •์  ๋ฉค๋ฒ„๋ฅผ ์ •์˜ํ•˜๋Š” ์„ ์€์€ ํ•„์š”ํ•˜๋‹ค.
  • ๋ชจ๋“  ์ •์ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ํŠน๋ณ„ํžˆ ์ดˆ๊ธฐ๊ฐ’์„ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค.
class Person {
  char name[20];
  int age;
  int count; // Person ๊ฐ์ฒด๊ฐ€ ๋ช‡๊ฐœ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”์ง€ countํ•˜๊ณ  ์‹ถ์Œ

  Person() {
    count++;  // ๋ชฉ์ ์€ ์š”๊ฒƒ.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€...

class Person {
  char name[20];
  int age;
  static int count; // Person ๊ฐ์ฒด๊ฐ€ ๋ช‡๊ฐœ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”์ง€ countํ•˜๊ณ  ์‹ถ์Œ

  Person() {
    count++;  // ๋ชฉ์ ์€ ์š”๊ฒƒ.

static ํ•จ์ˆ˜:

์ฐธ๊ณ ์‚ฌ์ดํŠธ ์ฐธ๊ณ ์‚ฌ์ดํŠธ