Menu
Coddy logo textTech

게터와 세터

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 28번째.

class 멤버가 private이면 외부 코드는 해당 멤버에 직접 accessed할 수 없습니다. Getterssetters는 이러한 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를 사용하는 이 패턴은 캡슐화의 기본으로, 클래스 데이터에 액세스하고 데이터를 수정하는 방식을 완전히 제어할 수 있게 해 줍니다.

challenge icon

챌린지

쉬움

getter와 setter가 검증 및 계산된 속성을 포함하여 private 데이터에 대한 제어된 접근을 제공하는 방식을 보여 주는 player profile 시스템을 만들어 봅시다.

코드를 구성하기 위해 두 개의 파일을 만듭니다:

  • Player.h: 보호된 데이터 접근을 통해 게임 캐릭터의 profile을 관리하는 Player class를 정의합니다. class에는 다음이 포함되어야 합니다:
    • private 멤버: name (문자열), level (int), experience (int)
    • 이름을 받고 level1로, experience0으로 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로 표시합니다.

  • 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>"을 출력합니다

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;
}
quiz icon실력 점검

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

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

직접 연습해 보세요: 온라인 C++ 컴파일러