정적 메서드와 변수
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 31번째.
static 멤버는 모든 객체에서 공유된다는 것을 배웠습니다. 이제 static 변수와 함께 static 메서드를 올바르게 정의하고 사용하는 방법을 살펴보겠습니다.
클래스 내부에 선언된 정적 변수는 일반적으로 소스 파일에서 클래스 외부에 정의되어야 합니다. 이는 정적 멤버가 모든 객체가 공유하는 정확히 하나의 저장 위치를 필요로 하기 때문입니다:
class Counter {
static int count; // 선언만
public:
Counter() { count++; }
~Counter() { count--; }
static int getCount() { // 정적 메서드
return count;
}
};
// 정의 - 클래스 외부에서 필요함
int Counter::count = 0;정적 메서드는 어떤 객체가 아니라 클래스에 속합니다. 여기에는 중요한 결과가 따릅니다. 정적 메서드는 인스턴스 멤버에 액세스하거나 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().
챌린지
쉬움객체 인스턴스가 없어도 클래스 수준의 기능을 제공하기 위해 static methods와 변수들이 함께 작동하는 방식을 보여 주는 고유 ID 생성 시스템을 만들어 보겠습니다.
코드를 구성하기 위해 두 개의 파일을 만듭니다:
IDGenerator.h: 순차적인 고유 ID를 생성하는IDGeneratorclass를 Define합니다. class에는 다음이 있어야 합니다:- 할당할 다음 ID를 추적하는 private static member
nextId(1000에서 시작) - 모든 ID에 사용할 사용자 지정 prefix를 저장하는 private static member
prefix(문자열) - prefix를 변경하는 static method
setPrefix(const std::string& p) - prefix와 현재 ID 번호를 결합한 문자열을 반환한 다음, 다음 Call을 위해
nextId를 증가시키는 static methodgetNextId() - counter를 증가시키지 않고 다음 ID가 무엇이 될지 반환하는 static method
peekNextId() - 생성된 ID의 개수를 반환하는 static method
getGeneratedCount()(힌트: 시작 값과 현재nextId를 사용해 계산) nextId를 다시1000으로 reset하는 static methodreset()
class Definition 후 class 외부에서 static members를 Define해야 한다는 점을 기억하세요.
prefix를"ID-"로 Initialize하세요.- 할당할 다음 ID를 추적하는 private static member
main.cpp: 객체를 생성하지 않고 class 이름을 사용해 static methods를 Call하는 과정을 보여 줍니다. input에서 custom prefix를 읽은 다음:peekNextId()를 사용하여"Peek: <peeked_id>"를 Print합니다.getNextId()를 사용해 세 개의 ID를 Generate하고 각각을"Generated: <id>"로 Print합니다.- 생성된 ID의 개수를 표시하는
"Count: <count>"를 Print합니다. - input 값을 사용하여
setPrefix()로 prefix를 Change합니다. - ID를 두 개 더 Generate하고 각각을
"Generated: <id>"로 Print합니다. - 다시
"Count: <count>"를 Print합니다. reset()을 Call합니다."After reset - Peek: <peeked_id>"를 Print합니다."After reset - Count: <count>"를 Print합니다.
IDGenerator object를 전혀 생성하지 않는다는 점에 주목하세요. 모든 methods는 IDGenerator::methodName()을 사용하여 class에서 직접 Call됩니다. 이것이 static methods의 핵심 특징입니다. static methods는 특정 인스턴스가 아니라 class 자체에 속합니다.
header file에 <string>과 <iostream>을 Include하고, header guards도 잊지 마세요.
직접 해보기
#include <iostream>
#include <string>
#include "IDGenerator.h"
using namespace std;
int main() {
// 입력에서 사용자 지정 접두사 읽기
string customPrefix;
cin >> customPrefix;
// TODO: peekNextId()를 사용하여 "Peek: <peeked_id>" 출력
// TODO: getNextId()를 사용하여 ID 세 개를 생성하고 각각을 "Generated: <id>"로 출력
// TODO: 생성된 ID 개수를 보여주는 "Count: <count>" 출력
// TODO: setPrefix()로 입력 값을 사용하여 접두사 변경
// TODO: ID 두 개를 더 생성하고 각각을 "Generated: <id>"로 출력
// TODO: "Count: <count>"를 다시 출력
// TODO: reset() 호출
// TODO: Print "After reset - Peek: <peeked_id>"
// TODO: Print "After reset - Count: <count>"
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러