Menu
CoddyTech

세터에서의 유효성 검사

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

이전 강의에서는 값을 단순히 할당하는 기본 setter를 만들었습니다. 하지만 이렇게 하면 캡슐화의 중요한 이점, 즉 검증 로직을 추가해 데이터를 보호하는 기능을 놓치게 됩니다.

음수가 되면 안 되는 Counter를 생각해 보세요. 캡슐화하지 않으면 누구나 c->value = -50라고 작성해 상태를 손상시킬 수 있습니다. setter를 사용하면 허용되는 값을 제어할 수 있습니다:

// counter.c
void counter_set_value(Counter *c, int new_value) {
    if (new_value < 0) {
        return;  // 유효하지 않은 입력은 알리지 않고 거부합니다
    }
    c->value = new_value;
}

이제 음수 값은 단순히 무시됩니다.

성공 또는 실패를 나타내기 위해 상태 코드를 반환할 수도 있습니다.

int counter_set_value(Counter *c, int new_value) {
    if (new_value < 0) {
        return 0;  // 실패
    }
    c->value = new_value;
    return 1;  // 성공
}

이 패턴을 사용하면 호출자가 작업의 성공 여부를 알 수 있습니다. 핵심은 세터가 단순히 값을 할당하는 것만이 아니라는 점입니다. 세터는 객체의 상태가 어떤 값을 가질 수 있는지에 대한 규칙을 적용하는 문지기입니다. 이것이 바로 캡슐화의 진정한 힘입니다. 외부 코드가 무엇을 하려고 하든 객체는 자체 무결성을 유지합니다.

challenge icon

챌린지

쉬움

setter에서 유효성 검사를 사용해 데이터를 보호하는 Temperature 모듈을 만들어 봅시다. 유효한 범위 내의 값만 허용하는 온도 추적기를 만들면서 setter가 객체 상태의 문지기 역할을 하는 방식을 살펴보겠습니다.

세 개의 파일을 만듭니다.

  • temperature.h: 불투명 포인터 패턴을 사용하는 공개 인터페이스입니다. 전방 선언만으로 Temperature 타입을 선언합니다. 다음 함수를 선언합니다.
    • create_temperature: 초기 온도를 정수로 받아 Temperature 포인터를 반환합니다.
    • free_temperature: 할당된 메모리를 해제합니다.
    • temp_get_degrees: 현재 온도 값을 반환하는 getter입니다.
    • temp_set_degrees: int를 반환하는 setter입니다(성공 시 1, 실패 시 0).
    TEMPERATURE_H 기호를 사용해 include guard를 작성합니다.
  • temperature.c: 숨겨진 int degrees 멤버를 가진 실제 struct Temperature를 정의합니다. 모든 함수를 구현합니다. 핵심은 setter입니다. setter는 -50에서 150 사이의 값(양 끝값 포함)만 허용해야 합니다. 값이 이 범위를 벗어나면 0을 반환하고 온도는 변경하지 않습니다. 유효한 값이면 값을 업데이트하고 1을 반환합니다.
  • main.c: 유효한 온도와 유효하지 않은 온도를 모두 설정해 보면서 유효하지 않은 값은 거부되고 유효한 값은 허용되는 유효성 검사 과정을 보여줍니다.

입력은 세 개입니다. 초기 온도, 설정할 유효한 온도(범위 내), 그리고 설정을 시도할 유효하지 않은 온도(범위 밖)입니다.

main 파일에서 초기값으로 Temperature를 만들고 출력합니다. 그런 다음 거부되어야 하는 유효하지 않은 온도를 설정해 보고, 결과를 출력하여 값이 그대로 유지되는 것을 보여줍니다. 마지막으로 유효한 온도를 설정하고, 성공 결과를 출력한 뒤 업데이트된 값을 보여줍니다. 메모리를 해제하고 정리가 완료되었음을 확인합니다.

다음 형식으로 출력합니다.

Initial: {degrees}
Set {invalid}: {0 or 1}
After invalid: {degrees}
Set {valid}: {0 or 1}
After valid: {degrees}
Freed

예를 들어 입력이 25, 100, 200이면 출력은 다음과 같습니다.

Initial: 25
Set 200: 0
After invalid: 25
Set 100: 1
After valid: 100
Freed

이것은 캡슐화의 진정한 힘을 보여줍니다. setter는 유효한 온도를 구성하는 규칙을 적용하여 외부 코드가 어떤 값을 할당하려 하더라도 객체의 무결성을 보호합니다.

직접 해보기

#include <stdio.h>
#include "temperature.h"

int main() {
    // 입력값 읽기
    int initial, valid_temp, invalid_temp;
    scanf("%d", &initial);
    scanf("%d", &valid_temp);
    scanf("%d", &invalid_temp);
    
    // TODO: 초기값으로 Temperature 생성하기
    
    // TODO: 초기 온도 출력하기
    // 형식: "Initial: {degrees}"
    
    // TODO: 유효하지 않은 온도로 설정 시도하기
    // 결과를 출력하고 값이 변경되지 않았음을 보여주기
    // 형식: "Set {invalid}: {0 or 1}"
    // 형식: "After invalid: {degrees}"
    
    // TODO: 유효한 온도로 설정하기
    // 성공 결과를 출력하고 갱신된 값을 보여주기
    // 형식: "Set {valid}: {0 or 1}"
    // 형식: "After valid: {degrees}"
    
    // TODO: 메모리를 해제하고 "Freed" 출력하기
    
    return 0;
}
quiz icon실력 점검

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

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

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