정적 메서드 및 필드
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 20번째.
인스턴스 멤버와 정적(static) 멤버의 차이점을 이해했으므로, 이제 정적 메서드와 필드를 효과적으로 사용하는 방법을 살펴보겠습니다. 정적 멤버는 개별 객체보다는 클래스 개념 자체에 속하는 기능에 적합합니다.
정적 필드는 모든 인스턴스 간에 공유되는 데이터를 저장합니다. 일반적인 용도로는 카운터, 설정 값 또는 캐시된 데이터 등이 있습니다:
class MathHelper {
static const double pi = 3.14159;
static int calculationCount = 0;
static double circleArea(double radius) {
calculationCount++;
return pi * radius * radius;
}
}
print(MathHelper.circleArea(5)); // 78.53975
print(MathHelper.circleArea(3)); // 28.27431
print(MathHelper.calculationCount); // 2정적 메서드는 인스턴스가 아니라 클래스 이름에서 직접 호출한다는 점에 유의하세요. MathHelper 클래스는 유틸리티처럼 작동하므로 MathHelper 객체를 생성할 필요가 없습니다.
중요한 규칙: 정적 메서드는 인스턴스 멤버에 직접 접근할 수 없습니다. 정적 메서드는 특정 객체에 연결되어 있지 않기 때문에 this에 접근할 수 없습니다:
class Counter {
int value = 0; // 인스턴스 필드
static int total = 0; // 정적 필드
void increment() {
value++; // OK - 인스턴스 메서드가 인스턴스 필드에 접근함
total++; // OK - 인스턴스 메서드는 정적 필드에 접근할 수 있음
}
static void reset() {
total = 0; // OK - 정적 메서드가 정적 필드에 접근함
// value = 0; // 에러! 인스턴스 필드에 접근할 수 없음
}
}기능이 객체 상태에 의존하지 않을 때 정적 멤버를 사용하세요. 유틸리티 함수, 팩토리 추적 또는 공유 상수가 이상적인 후보입니다.
챌린지
쉬움객체를 생성할 필요 없이 유용한 기능을 제공하기 위해 정적 메서드와 필드가 어떻게 함께 작동하는지 보여주는 문자열 연산용 유틸리티 클래스를 만들어 보겠습니다.
코드를 정리하기 위해 두 개의 파일을 생성합니다:
string_utils.dart: 유틸리티 헬퍼 역할을 하는StringUtils클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:'-'로 설정된static const String defaultSeparator- 수행된 연산 횟수를 추적하기 위해
0으로 시작하는static int operationCount operationCount를 증가시키고 뒤집힌 문자열을 반환하는 정적 메서드reverse(String text)operationCount를 증가시키고defaultSeparator를 사용하여 두 문자열을 연결해 반환하는 정적 메서드join(String first, String second)operationCount를 증가시키고 모음(a, e, i, o, u - 대소문자 구분 없음)의 개수를 반환하는 정적 메서드countVowels(String text)- 수행된 총 연산 횟수를 보여주는 문자열을 반환하는 정적 메서드
getStats()
main.dart: 유틸리티 클래스를 임포트하고 정적 메서드들을 사용합니다:'hello'를 인자로reverse()를 호출하고 결과를 출력합니다.'dart'와'lang'을 인자로join()을 호출하고 결과를 출력합니다.'Programming'을 인자로countVowels()를 호출하고Vowels: [count]형식으로 출력합니다.getStats()를 사용하여 통계를 출력합니다.
모든 메서드는 정적(static)이므로 StringUtils 객체를 생성하지 않고 클래스 이름에서 직접 호출해야 함을 기억하세요.
getStats() 메서드는 다음 형식으로 반환해야 합니다:
Operations performed: [operationCount]예상 출력 결과:
olleh
dart-lang
Vowels: 3
Operations performed: 3치트 시트
정적(Static) 멤버는 개별 인스턴스가 아닌 클래스 자체에 속합니다. 객체가 아닌 클래스 이름을 사용하여 접근하세요.
정적 필드(Static fields)는 모든 인스턴스에서 공유되는 데이터를 저장합니다:
class MathHelper {
static const double pi = 3.14159;
static int calculationCount = 0;
static double circleArea(double radius) {
calculationCount++;
return pi * radius * radius;
}
}
print(MathHelper.circleArea(5)); // 78.53975
print(MathHelper.calculationCount); // 1접근 규칙:
- 인스턴스 메서드는 인스턴스 멤버와 정적 멤버 모두에 접근할 수 있습니다.
- 정적 메서드는 정적 멤버에만 접근할 수 있습니다 (
this에 접근 불가).
class Counter {
int value = 0; // 인스턴스 필드
static int total = 0; // 정적 필드
void increment() {
value++; // OK - 인스턴스 메서드가 인스턴스 필드에 접근
total++; // OK - 인스턴스 메서드가 정적 필드에 접근
}
static void reset() {
total = 0; // OK - 정적 메서드가 정적 필드에 접근
// value = 0; // Error! 인스턴스 필드에 접근할 수 없음
}
}유틸리티 함수, 공유 상수, 카운터 또는 객체의 상태에 의존하지 않는 기능을 구현할 때 정적 멤버를 사용하세요.
직접 해보기
import 'string_utils.dart';
void main() {
// TODO: 'hello'와 함께 reverse()를 호출하고 결과를 출력하세요
// TODO: 'dart'와 'lang'과 함께 join()을 호출하고 결과를 출력하세요
// TODO: 'Programming'과 함께 countVowels()를 호출하고 "Vowels: [count]"를 출력하세요
// TODO: getStats()를 사용하여 통계를 출력하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.