Menu
Coddy logo textTech

게터와 세터

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.0

areaperimeter는 필드처럼 접근되지만, 매번 계산된다는 점에 유의하세요. 괄호는 필요하지 않습니다.

세터(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)는 입력을 저장하기 전에 검증하며, 심지어 단위 간의 변환도 수행할 수 있습니다. 이를 통해 클래스 사용자에게 깔끔한 프로퍼티와 같은 구문을 제공하면서도 데이터에 대한 제어권을 가질 수 있습니다.

challenge icon

챌린지

쉬움

유효성 검사 및 계산된 값을 사용하여 플레이어 통계를 관리하는 getter와 setter를 사용하는 게임용 점수 추적기를 만들어 보겠습니다.

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

  • player.dart: 플레이어의 게임 성적을 추적하는 Player 클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:
    • 플레이어 이름을 위한 String name 필드
    • 0으로 시작하는 프라이빗 int _score 필드
    • 3으로 시작하는 프라이빗 int _lives 필드
    • 플레이어 이름을 매개변수로 받는 생성자
    • 현재 점수를 반환하는 getter score
    • 0 이상의 값만 허용하는 setter score (음수 값은 무시)
    • 현재 생명 수(lives)를 반환하는 getter lives
    • 0에서 5 사이(포함)의 값만 허용하는 setter lives (이 범위를 벗어나는 값은 무시)
    • 점수를 기반으로 플레이어의 레벨을 계산하는 getter level: 점수를 100으로 나눈 값(정수 나눗셈)에 1을 더함
    • 생명 수가 0보다 크면 true를 반환하는 getter isAlive
    • 플레이어의 현재 상태를 출력하는 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.0

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는 깔끔한 속성 스타일의 구문을 유지하면서 입력을 검증하고 단위 간 변환을 수행할 수 있습니다.

직접 해보기

import 'player.dart';

void main() {
  // TODO: 'Alex'라는 이름의 플레이어 생성

  // TODO: score를 250으로 설정하고 displayStatus() 호출

  // TODO: score를 -50으로 설정을 시도(무시되어야 함)하고 displayStatus() 호출

  // TODO: lives를 1로 설정하고 displayStatus() 호출

  // TODO: lives를 10으로 설정을 시도(무시되어야 함)하고 displayStatus() 호출
}
quiz icon실력 점검

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

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