게터와 세터
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 21번째.
게터(Getters)와 세터(Setters)는 일반 프로퍼티처럼 보이는 특수한 메서드를 통해 클래스 필드에 접근하고 수정하는 방법을 제공합니다. 필드를 직접 노출하는 대신, 값이 읽히고 쓰이는 방식을 제어할 수 있습니다.
게터(getter)는 get 키워드를 사용하여 정의되며, 계산된 값이나 저장된 값을 반환합니다:
class Rectangle {
double width;
double height;
Rectangle(this.width, this.height);
double get area => width * height;
double get perimeter => 2 * (width + height);
}
Rectangle rect = Rectangle(5, 3);
print(rect.area); // 15.0
print(rect.perimeter); // 16.0area와 perimeter는 필드처럼 접근되지만, 매번 계산된다는 점에 유의하세요. 괄호는 필요하지 않습니다.
세터(setter)는 set 키워드를 사용하며 값이 할당되는 방식을 제어할 수 있게 해줍니다:
class Temperature {
double _celsius;
Temperature(this._celsius);
double get celsius => _celsius;
set celsius(double value) {
if (value >= -273.15) {
_celsius = value;
}
}
double get fahrenheit => _celsius * 9 / 5 + 32;
set fahrenheit(double value) {
celsius = (value - 32) * 5 / 9;
}
}
Temperature temp = Temperature(25);
print(temp.fahrenheit); // 77.0
temp.fahrenheit = 100;
print(temp.celsius); // 37.78세터(setter)는 입력을 저장하기 전에 검증하며, 심지어 단위 간의 변환도 수행할 수 있습니다. 이를 통해 클래스 사용자에게 깔끔한 프로퍼티와 같은 구문을 제공하면서도 데이터에 대한 제어권을 가질 수 있습니다.
챌린지
쉬움유효성 검사 및 계산된 값을 사용하여 플레이어 통계를 관리하는 getter와 setter를 사용하는 게임용 점수 추적기를 만들어 보겠습니다.
코드를 두 개의 파일로 구성합니다:
player.dart: 플레이어의 게임 성적을 추적하는Player클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:- 플레이어 이름을 위한
String name필드 0으로 시작하는 프라이빗int _score필드3으로 시작하는 프라이빗int _lives필드- 플레이어 이름을 매개변수로 받는 생성자
- 현재 점수를 반환하는 getter
score 0이상의 값만 허용하는 setterscore(음수 값은 무시)- 현재 생명 수(lives)를 반환하는 getter
lives 0에서5사이(포함)의 값만 허용하는 setterlives(이 범위를 벗어나는 값은 무시)- 점수를 기반으로 플레이어의 레벨을 계산하는 getter
level: 점수를100으로 나눈 값(정수 나눗셈)에1을 더함 - 생명 수가
0보다 크면true를 반환하는 getterisAlive - 플레이어의 현재 상태를 출력하는
displayStatus()메서드
- 플레이어 이름을 위한
main.dart: 플레이어 클래스를 임포트하고 getter와 setter를 시연합니다:- 이름이
'Alex'인 플레이어를 생성합니다 - 점수를
250으로 설정하고displayStatus()를 호출합니다 - 점수를
-50으로 설정을 시도하고(무시되어야 함)displayStatus()를 호출합니다 - 생명 수를
1로 설정하고displayStatus()를 호출합니다 - 생명 수를
10으로 설정을 시도하고(무시되어야 함)displayStatus()를 호출합니다
- 이름이
displayStatus() 메서드는 정확히 다음 형식으로 출력해야 합니다:
[name] | Score: [score] | Level: [level] | Lives: [lives] | Alive: [isAlive]예상 출력 결과:
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true치트 시트
Getter와 Setter는 일반 속성처럼 보이는 특수 메서드를 통해 클래스 필드에 대한 제어된 액세스를 제공합니다.
Getter - get 키워드를 사용하여 정의하며, 계산되거나 저장된 값을 반환합니다:
class Rectangle {
double width;
double height;
Rectangle(this.width, this.height);
double get area => width * height;
double get perimeter => 2 * (width + height);
}
Rectangle rect = Rectangle(5, 3);
print(rect.area); // 15.0 - accessed like a field, no parentheses
print(rect.perimeter); // 16.0Setter - set 키워드를 사용하며, 값이 할당되는 방식을 제어합니다:
class Temperature {
double _celsius;
Temperature(this._celsius);
double get celsius => _celsius;
set celsius(double value) {
if (value >= -273.15) {
_celsius = value;
}
}
double get fahrenheit => _celsius * 9 / 5 + 32;
set fahrenheit(double value) {
celsius = (value - 32) * 5 / 9;
}
}
Temperature temp = Temperature(25);
print(temp.fahrenheit); // 77.0
temp.fahrenheit = 100;
print(temp.celsius); // 37.78Setter는 깔끔한 속성 스타일의 구문을 유지하면서 입력을 검증하고 단위 간 변환을 수행할 수 있습니다.
직접 해보기
import 'player.dart';
void main() {
// TODO: 'Alex'라는 이름의 플레이어 생성
// TODO: score를 250으로 설정하고 displayStatus() 호출
// TODO: score를 -50으로 설정을 시도(무시되어야 함)하고 displayStatus() 호출
// TODO: lives를 1로 설정하고 displayStatus() 호출
// TODO: lives를 10으로 설정을 시도(무시되어야 함)하고 displayStatus() 호출
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.