_ 접두사 관례
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 31번째.
언더스코어 접두사 _는 멤버를 private으로 표시하는 Dart의 방식입니다. private과 같은 키워드를 사용하는 언어들과 달리, Dart는 가시성을 제어하기 위해 이 명명 규칙에 의존합니다.
언더스코어(_)를 필드와 메서드 모두에 적용할 수 있습니다:
class Counter {
int _count = 0; // 프라이빗 필드
void _increment() { // 프라이빗 메서드
_count++;
}
void increase() { // 퍼블릭 메서드
_increment();
print('Count: $_count');
}
}언더스코어(_)는 변수, 메서드, getter, setter, 심지어 클래스 이름까지 모든 식별자에 사용할 수 있습니다. _Helper라는 이름의 클래스는 해당 라이브러리에 대해 private(비공개)이 됩니다.
class Person {
String _name; // 비공개
int _age; // 비공개
Person(this._name, this._age);
String get name => _name; // 공개 getter
void _validateAge(int age) { } // 비공개 메서드
}동일한 클래스 내에서는 프라이빗 멤버에 정상적으로 접근할 수 있습니다. 이 제한은 라이브러리 외부의 코드에만 적용됩니다. 이 관습은 코드를 읽을 때 어떤 멤버가 내부 전용인지 즉시 명확하게 해줍니다. _로 시작하는 모든 것은 구현 세부 사항입니다.
챌린지
쉬움내부 구현 세부 사항은 숨기면서 깔끔한 공개 인터페이스를 노출하기 위해 언더스코어 접두사가 어떻게 사용되는지 보여주는 게임용 점수 추적기를 만들어 보겠습니다.
코드를 두 개의 파일로 구성합니다:
score_tracker.dart: 적절한 캡슐화를 통해 플레이어의 점수를 관리하는ScoreTracker클래스를 만듭니다. 클래스는 다음을 포함해야 합니다:- 공개
String playerName- 누구나 누가 플레이 중인지 볼 수 있습니다. 0으로 초기화된 비공개int _score- 원본 점수는 보호되어야 합니다.1로 초기화된 비공개int _bonusMultiplier- 이것은 내부 게임 메커니즘입니다.- 플레이어 이름을 받는 생성자
- 비공개
_score를 반환하는 공개 게터score points * _bonusMultiplier를 반환하는 비공개 메서드_applyBonus(int points)- 내부적으로
_applyBonus를 사용하여 실제 추가될 점수를 계산하고,_score를 업데이트하며,Added [calculated] points!를 출력하는 공개 메서드addPoints(int points) _bonusMultiplier를2로 설정하고Double bonus activated!를 출력하는 공개 메서드activateDoubleBonus()- 플레이어의 현재 상태를 보여주는 공개 메서드
displayStats()
- 공개
main.dart: 점수 추적기를 임포트하고 게임 세션을 시뮬레이션합니다:- 플레이어
'Alex'를 위한ScoreTracker를 생성합니다. displayStats()를 호출합니다.10점을 추가합니다.25점을 추가합니다.- 더블 보너스를 활성화합니다.
15점을 추가합니다 (이 점수는 두 배가 되어야 합니다).displayStats()를 호출합니다.- 공개 게터를 사용하여
Final score: [score]를 출력합니다.
- 플레이어
displayStats() 메서드는 다음 형식으로 출력해야 합니다:
=== Player Stats ===
Player: [playerName]
Current Score: [_score]비공개 _applyBonus 메서드와 _bonusMultiplier 필드가 내부적으로 보너스 계산을 어떻게 처리하는지 주목하세요. 외부 코드는 공개 메서드만 볼 수 있으며 배수 시스템에 대해서는 전혀 알지 못합니다. 이것이 바로 언더스코어 관례 뒤에 숨겨진 구현 세부 사항입니다.
예상 출력:
=== Player Stats ===
Player: Alex
Current Score: 0
Added 10 points!
Added 25 points!
Double bonus activated!
Added 30 points!
=== Player Stats ===
Player: Alex
Current Score: 65
Final score: 65치트 시트
Dart에서 밑줄 접두사 _는 멤버를 private으로 표시합니다. 이 명명 규칙은 private과 같은 키워드를 사용하지 않고 가시성을 제어합니다.
필드와 메서드에 밑줄을 적용하세요:
class Counter {
int _count = 0; // Private 필드
void _increment() { // Private 메서드
_count++;
}
void increase() { // Public 메서드
_increment();
print('Count: $_count');
}
}밑줄은 변수, 메서드, getter, setter, 클래스 이름 등 모든 식별자에 작동합니다:
class Person {
String _name; // Private
int _age; // Private
Person(this._name, this._age);
String get name => _name; // Public getter
void _validateAge(int age) { } // Private 메서드
}Private 멤버는 동일한 클래스 내에서 접근할 수 있지만 라이브러리 외부의 코드에서는 제한됩니다. _로 시작하는 모든 것은 구현 세부 사항입니다.
직접 해보기
import 'score_tracker.dart';
void main() {
// TODO: 'Alex' 플레이어를 위한 ScoreTracker를 생성하세요
// TODO: displayStats()를 호출하세요
// TODO: 10점을 추가하세요
// TODO: 25점을 추가하세요
// TODO: 더블 보너스를 활성화하세요
// TODO: 15점을 추가하세요 (이 점수는 두 배가 되어야 합니다)
// TODO: displayStats()를 호출하세요
// TODO: 공개 getter를 사용하여 'Final score: [score]'를 출력하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.