Menu
Coddy logo textTech

_ 접두사 관례

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) { }      // 비공개 메서드
}

동일한 클래스 내에서는 프라이빗 멤버에 정상적으로 접근할 수 있습니다. 이 제한은 라이브러리 외부의 코드에만 적용됩니다. 이 관습은 코드를 읽을 때 어떤 멤버가 내부 전용인지 즉시 명확하게 해줍니다. _로 시작하는 모든 것은 구현 세부 사항입니다.

challenge icon

챌린지

쉬움

내부 구현 세부 사항은 숨기면서 깔끔한 공개 인터페이스를 노출하기 위해 언더스코어 접두사가 어떻게 사용되는지 보여주는 게임용 점수 추적기를 만들어 보겠습니다.

코드를 두 개의 파일로 구성합니다:

  • 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)
    • _bonusMultiplier2로 설정하고 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]'를 출력하세요
}
quiz icon실력 점검

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

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