게터와 세터
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 28번째.
class 멤버가 private이면 외부 코드는 해당 멤버에 직접 accessed할 수 없습니다. Getters와 setters는 이러한 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;
}
}
};setter의 진정한 강력함은 유효성 검사입니다.
어떤 값이든 할당되도록 허용하는 대신 규칙을 적용할 수 있습니다. 위의 예에서는 Absolute zero보다 낮은 온도가 거부됩니다. 세터가 없다면 누구나 잘못된 데이터를 직접 할당할 수 있습니다.
Getter는 반환하기 전에 데이터를 변환할 수도 있습니다:
class Temperature {
double celsius;
public:
double getCelsius() const { return celsius; }
// 계산된 getter - fahrenheit를 저장하지 않고 계산함
double getFahrenheit() const {
return celsius * 9.0 / 5.0 + 32.0;
}
void setCelsius(double value) { celsius = value; }
};Getter의 const 키워드에 주목하세요. 이는 Getter가 객체를 수정하지 않음을 나타냅니다. Setter는 멤버 값을 변경하는 것이 목적이므로 const일 수 없습니다. Getter와 Setter를 사용하는 이 패턴은 캡슐화의 기본으로, 클래스 데이터에 액세스하고 데이터를 수정하는 방식을 완전히 제어할 수 있게 해 줍니다.
챌린지
쉬움getter와 setter가 검증 및 계산된 속성을 포함하여 private 데이터에 대한 제어된 접근을 제공하는 방식을 보여 주는 player profile 시스템을 만들어 봅시다.
코드를 구성하기 위해 두 개의 파일을 만듭니다:
Player.h: 보호된 데이터 접근을 통해 게임 캐릭터의 profile을 관리하는Playerclass를 정의합니다. class에는 다음이 포함되어야 합니다:- private 멤버:
name(문자열),level(int),experience(int) - 이름을 받고
level을1로,experience를0으로 initializes하는 Constructor - 플레이어의 이름을 반환하는 getter
getName() - current level을 반환하는 getter
getLevel() - current experience points를 반환하는 getter
getExperience() - 3 characters 이상인 이름만 accepts하고, invalid한 경우 current name을 변경하지 않고 유지하는 setter
setName() - positive values만 accepts하는 setter
addExperience(int points). experience가100에 도달하거나 이를 exceeds하면 플레이어의 level이 올라갑니다: level을 1 증가시키고 experience에서 100을 뺍니다. 충분한 experience가 추가되면 이 일이 여러 번 happen할 수 있습니다. - 다음 level에 도달하는 데 필요한 추가 experience points가 얼마인지 반환하는 Computed getter
getExperienceToNextLevel()(항상100 - current experience)
모든 getter는 object를 수정하지 않으므로
const로 표시합니다.- private 멤버:
main.cpp: getter와 setter가 실제로 작동하는 모습을 보여 줍니다. input에서 player name과 추가할 experience points를 읽습니다(각각 별도의 줄). 그런 다음:- input name으로
Player를 Create합니다 "Player: <name>, Level: <level>, XP: <experience>"를 출력합니다addExperience()를 사용하여 input experience points를 추가합니다- updated state를 보여 주기 위해 동일한 상태 줄을 다시 출력합니다
"XP to next level: <amount>"를 출력합니다- 이름을
"Al"로 change하려고 시도합니다 (validation에 fail해야 함) "Name after invalid change: <name>"을 출력합니다- 이름을
"Champion"으로 Change합니다 (성공해야 함) "Name after valid change: <name>"을 출력합니다
- input name으로
experience input은 문자열로 제공되며, 이를 정수로 convert해야 합니다. #include "Player.h"를 사용하여 main.cpp에 header file을 include합니다.
직접 해보기
#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: Print "XP to next level: <amount>"
// TODO: 이름을 "Al"로 변경 시도 (유효성 검사 실패해야 함)
// TODO: Print "Name after invalid change: <name>"
// TODO: 이름을 "Champion"으로 변경 (성공해야 함)
// TODO: Print "Name after valid change: <name>"
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러