Menu
Coddy logo textTech

정적 메서드와 변수

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 31번째.

정적 멤버는 모든 객체에서 공유된다는 것을 배웠습니다. 이제 정적 변수와 함께 정적 메서드를 올바르게 정의하고 사용하는 방법을 살펴보겠습니다.

클래스 내부에 선언된 정적 변수는 일반적으로 소스 파일과 같이 클래스 외부에서 정의되어야 합니다. 이는 정적 멤버가 모든 객체에 의해 공유되는 단 하나의 저장 공간을 필요로 하기 때문입니다:

class Counter {
    static int count;    // 선언만 함
    
public:
    Counter() { count++; }
    ~Counter() { count--; }
    
    static int getCount() {    // 정적 메서드
        return count;
    }
};

// 정의 - 클래스 외부에서 필요함
int Counter::count = 0;

정적 메서드(static method)는 클래스에 속하며, 특정 객체에 속하지 않습니다. 이로 인해 중요한 결과가 발생합니다. 정적 메서드는 특정 객체에서 호출되지 않기 때문에 인스턴스 멤버에 접근하거나 this 포인터를 사용할 수 없습니다.

class MathUtils {
    static double pi;
    
public:
    static double circleArea(double radius) {
        return pi * radius * radius;    // 정적 멤버에 접근할 수 있습니다
    }
};

double MathUtils::pi = 3.14159;

// 객체 없이 호출됨
double area = MathUtils::circleArea(5.0);

정적 메서드는 객체 상태가 필요 없는 유틸리티 함수, 객체를 생성하는 팩토리 메서드 또는 정적 데이터에 액세스하는 데 이상적입니다. 객체 인스턴스가 필요하지 않으므로 클래스 이름과 범위 지정 연산자를 사용하여 호출합니다: ClassName::methodName().

challenge icon

챌린지

쉬움

객체 인스턴스 없이도 클래스 수준의 기능을 제공하기 위해 정적(static) 메서드와 변수가 어떻게 함께 작동하는지 보여주는 고유 ID 생성기 시스템을 구축해 보겠습니다.

코드를 구성하기 위해 두 개의 파일을 생성합니다:

  • IDGenerator.h: 순차적인 고유 ID를 생성하는 IDGenerator 클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:
    • 할당될 다음 ID를 추적하는 private 정적 멤버 nextId (1000에서 시작)
    • 모든 ID에 대한 사용자 정의 가능한 접두사를 저장하는 private 정적 멤버 prefix (string)
    • 접두사를 변경하는 정적 메서드 setPrefix(const std::string& p)
    • 접두사와 현재 ID 번호를 결합한 문자열을 반환한 다음, 다음 호출을 위해 nextId를 증가시키는 정적 메서드 getNextId()
    • 카운터를 증가시키지 않고 다음 ID가 무엇인지 반환하는 정적 메서드 peekNextId()
    • 생성된 ID의 개수를 반환하는 정적 메서드 getGeneratedCount() (힌트: 시작 값과 현재 nextId를 사용하여 계산)
    • nextId를 다시 1000으로 재설정하는 정적 메서드 reset()

    클래스 정의 뒤의 클래스 외부에서 정적 멤버를 정의해야 함을 기억하세요. prefix"ID-"로 초기화하십시오.

  • main.cpp: 객체를 생성하지 않고 클래스 이름을 사용하여 정적 메서드를 호출하는 것을 보여줍니다. 입력에서 사용자 정의 접두사를 읽은 후 다음을 수행합니다:
    • peekNextId()를 사용하여 "Peek: <peeked_id>"를 출력합니다.
    • getNextId()를 사용하여 3개의 ID를 생성하고 각각 "Generated: <id>"로 출력합니다.
    • 생성된 ID 개수를 보여주는 "Count: <count>"를 출력합니다.
    • setPrefix()를 사용하여 입력받은 값으로 접두사를 변경합니다.
    • ID를 2개 더 생성하고 각각 "Generated: <id>"로 출력합니다.
    • "Count: <count>"를 다시 출력합니다.
    • reset()을 호출합니다.
    • "After reset - Peek: <peeked_id>"를 출력합니다.
    • "After reset - Count: <count>"를 출력합니다.

IDGenerator 객체를 전혀 생성하지 않는다는 점에 유의하세요. 모든 메서드는 IDGenerator::methodName()을 사용하여 클래스에서 직접 호출됩니다. 이것이 정적 메서드의 핵심 특징입니다. 즉, 특정 인스턴스가 아니라 클래스 자체에 속합니다.

헤더 파일에 <string><iostream>을 포함하고, 헤더 가드(header guards)를 잊지 마세요.

치트 시트

클래스 내부에 선언된 정적 변수는 반드시 클래스 외부에서 정의되어야 합니다. 정적 멤버는 모든 객체가 공유하는 단 하나의 저장 공간이 필요합니다:

class Counter {
    static int count;    // 선언만 함
    
public:
    Counter() { count++; }
    
    static int getCount() {
        return count;
    }
};

// 정의 - 클래스 외부에서 필수적으로 수행
int Counter::count = 0;

정적 메서드(static method)는 특정 객체가 아닌 클래스에 속합니다. 정적 메서드는 특정 객체에서 호출되지 않기 때문에 인스턴스 멤버에 접근하거나 this 포인터를 사용할 수 없습니다:

class MathUtils {
    static double pi;
    
public:
    static double circleArea(double radius) {
        return pi * radius * radius;    // 정적 멤버에 접근 가능
    }
};

double MathUtils::pi = 3.14159;

// 객체 없이 클래스 이름을 사용하여 호출
double area = MathUtils::circleArea(5.0);

정적 메서드는 클래스 이름과 범위 지정 연산자를 사용하여 호출합니다: ClassName::methodName(). 정적 메서드는 객체의 상태가 필요 없는 유틸리티 함수, 팩토리 메서드 또는 정적 데이터에 접근하는 용도로 사용하기에 이상적입니다.

직접 해보기

#include <iostream>
#include <string>
#include "IDGenerator.h"

using namespace std;

int main() {
    // 입력으로부터 사용자 정의 접두사(prefix) 읽기
    string customPrefix;
    cin >> customPrefix;
    
    // TODO: peekNextId()를 사용하여 "Peek: <peeked_id>" 출력
    
    // TODO: getNextId()를 사용하여 3개의 ID를 생성하고 각각 "Generated: <id>"로 출력
    
    // TODO: 생성된 ID의 개수를 보여주는 "Count: <count>" 출력
    
    // TODO: setPrefix()를 사용하여 입력받은 값으로 접두사 변경
    
    // TODO: 2개의 ID를 더 생성하고 각각 "Generated: <id>"로 출력
    
    // TODO: "Count: <count>"를 다시 출력
    
    // TODO: reset() 호출
    
    // TODO: "After reset - Peek: <peeked_id>" 출력
    
    // TODO: "After reset - Count: <count>" 출력
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨