게터와 세터
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 28번째.
클래스 멤버가 private인 경우, 외부 코드에서 직접 접근할 수 없습니다. Getter와 setter는 이러한 private 멤버에 대한 제어된 접근을 제공하는 public 메서드입니다. getter는 값을 가져오고, setter는 값을 수정합니다.
class Temperature {
double celsius; // Private - 직접 접근할 수 없음
public:
// Getter - 값을 반환함
double getCelsius() const {
return celsius;
}
// Setter - 유효성 검사를 거쳐 값을 수정함
void setCelsius(double value) {
if (value >= -273.15) { // 절대 영도 확인
celsius = value;
}
}
};세터(setters)의 진정한 힘은 유효성 검사입니다.
어떤 값이든 할당되도록 허용하는 대신, 규칙을 강제할 수 있습니다. 위의 예시에서 절대 영도 미만의 온도는 거부됩니다. 세터(setter)가 없으면 누구든지 유효하지 않은 데이터를 직접 할당할 수 있습니다.
게터(Getter)는 데이터를 반환하기 전에 변환할 수도 있습니다:
class Temperature {
double celsius;
public:
double getCelsius() const { return celsius; }
// 계산된 게터 - 화씨를 저장하지 않고 계산합니다
double getFahrenheit() const {
return celsius * 9.0 / 5.0 + 32.0;
}
void setCelsius(double value) { celsius = value; }
};getter에 있는 const 키워드를 주목하세요. 이는 해당 함수가 객체를 수정하지 않음을 나타냅니다. setter의 목적은 멤버 값을 변경하는 것이므로 const가 될 수 없습니다. 이러한 getter와 setter 사용 패턴은 캡슐화의 기본이며, 클래스 데이터가 액세스되고 수정되는 방식을 완벽하게 제어할 수 있게 해줍니다.
챌린지
쉬움게터(getters)와 세터(setters)가 유효성 검사 및 계산된 속성을 포함하여 프라이빗 데이터에 대한 제어된 액세스를 어떻게 제공하는지 보여주는 플레이어 프로필 시스템을 구축해 보겠습니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
Player.h: 보호된 데이터 액세스를 통해 게임 캐릭터의 프로필을 관리하는Player클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:- 프라이빗 멤버:
name(string),level(int),experience(int) - 이름을 매개변수로 받고
level을1로,experience를0으로 초기화하는 생성자 - 플레이어의 이름을 반환하는 게터
getName() - 현재 레벨을 반환하는 게터
getLevel() - 현재 경험치 포인트를 반환하는 게터
getExperience() - 최소 3자 이상의 이름만 허용하는 세터
setName()— 유효하지 않은 경우 현재 이름을 변경하지 않고 유지합니다. - 양수 값만 허용하는 세터
addExperience(int points). 경험치가100에 도달하거나 초과하면 플레이어의 레벨이 올라갑니다: 레벨을 1 증가시키고 경험치에서 100을 뺍니다. 충분한 경험치가 추가되면 이 과정이 여러 번 발생할 수 있습니다. - 다음 레벨에 도달하기 위해 필요한 경험치 포인트가 얼마인지 반환하는 계산된 게터
getExperienceToNextLevel()(항상100 - current experience)
모든 게터는 객체를 수정하지 않으므로
const로 표시하십시오.- 프라이빗 멤버:
main.cpp: 게터와 세터가 작동하는 모습을 보여줍니다. 입력에서 플레이어 이름과 추가할 경험치 포인트를 읽은 다음(각각 별도의 줄에 입력됨):- 입력받은 이름으로
Player를 생성합니다. "Player: <name>, Level: <level>, XP: <experience>"를 출력합니다.addExperience()를 사용하여 입력받은 경험치 포인트를 추가합니다.- 업데이트된 상태를 보여주기 위해 동일한 상태 라인을 다시 출력합니다.
"XP to next level: <amount>"를 출력합니다.- 이름을
"Al"로 변경을 시도합니다 (유효성 검사에 실패해야 함). "Name after invalid change: <name>"를 출력합니다.- 이름을
"Champion"으로 변경합니다 (성공해야 함). "Name after valid change: <name>"를 출력합니다.
- 입력받은 이름으로
경험치 입력은 문자열로 제공되므로 정수로 변환해야 합니다. #include "Player.h"를 사용하여 main.cpp에 헤더 파일을 포함하십시오.
치트 시트
Getter와 Setter는 비공개(private) 클래스 멤버에 대한 제어된 접근을 제공하는 공개(public) 메서드입니다.
기본적인 Getter와 Setter 패턴:
class Temperature {
double celsius; // Private 멤버
public:
// Getter - 값을 반환 (const로 표시)
double getCelsius() const {
return celsius;
}
// Setter - 값을 수정
void setCelsius(double value) {
celsius = value;
}
};유효성 검사가 포함된 Setter:
void setCelsius(double value) {
if (value >= -273.15) { // 설정하기 전에 유효성 검사
celsius = value;
}
}계산된 Getter:
// 값을 저장하지 않고 계산된 값을 반환
double getFahrenheit() const {
return celsius * 9.0 / 5.0 + 32.0;
}주요 포인트:
- Getter는 객체를 수정하지 않으므로
const로 표시해야 합니다. - Setter는 멤버 값을 변경하므로
const가 될 수 없습니다. - Setter를 통해 유효성 검사를 수행하여 잘못된 데이터가 입력되는 것을 방지할 수 있습니다.
- Getter는 값을 반환하기 전에 변환하거나 계산할 수 있습니다.
직접 해보기
#include <iostream>
#include <string>
#include "Player.h"
using namespace std;
int main() {
// 플레이어 이름 읽기
string playerName;
getline(cin, playerName);
// 추가할 경험치 읽기 (문자열로 읽고 int로 변환)
string expString;
getline(cin, expString);
int expToAdd = stoi(expString);
// TODO: 입력받은 이름으로 Player 생성
// TODO: 초기 상태 출력: "Player: <name>, Level: <level>, XP: <experience>"
// TODO: addExperience()를 사용하여 입력받은 경험치 추가
// TODO: 업데이트된 상태 정보 출력
// TODO: "XP to next level: <amount>" 출력
// TODO: 이름을 "Al"로 변경 시도 (유효성 검사 실패해야 함)
// TODO: "Name after invalid change: <name>" 출력
// TODO: 이름을 "Champion"으로 변경 (성공해야 함)
// TODO: "Name after valid change: <name>" 출력
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.