Menu
Coddy logo textTech

게터와 세터

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

클래스 멤버가 private인 경우, 외부 코드에서 직접 접근할 수 없습니다. Gettersetter는 이러한 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 사용 패턴은 캡슐화의 기본이며, 클래스 데이터가 액세스되고 수정되는 방식을 완벽하게 제어할 수 있게 해줍니다.

challenge icon

챌린지

쉬움

게터(getters)와 세터(setters)가 유효성 검사 및 계산된 속성을 포함하여 프라이빗 데이터에 대한 제어된 액세스를 어떻게 제공하는지 보여주는 플레이어 프로필 시스템을 구축해 보겠습니다.

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

  • Player.h: 보호된 데이터 액세스를 통해 게임 캐릭터의 프로필을 관리하는 Player 클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:
    • 프라이빗 멤버: name (string), level (int), experience (int)
    • 이름을 매개변수로 받고 level1로, experience0으로 초기화하는 생성자
    • 플레이어의 이름을 반환하는 게터 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;
}
quiz icon실력 점검

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

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