Menu
Coddy logo textTech

게터와 세터

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

opaque 포인터를 사용하면 구조체의 member가 외부 코드에 숨겨집니다. 하지만 외부 코드가 데이터에 직접 액세스할 수 없다면, 데이터를 어떻게 읽거나 수정할까요? 답은 gettersetter 함수입니다. 이는 private 데이터에 대한 제어된 액세스를 제공하는 public 인터페이스입니다.

A getter는 숨겨진 member의 값을 반환합니다:

// counter.h
int counter_get_value(const Counter *c);

// counter.c
int counter_get_value(const Counter *c) {
    return c->value;
}

setter는 숨겨진 member를 수정합니다:

// counter.h
void counter_set_value(Counter *c, int new_value);

// counter.c
void counter_set_value(Counter *c, int new_value) {
    c->value = new_value;
}

명명 규칙에 주목하세요. 충돌을 방지하고 API를 명확하게 만들기 위해 함수 이름 앞에 유형 이름(counter_)을 접두사로 붙입니다. getter는 객체를 수정하지 않으므로 const 포인터를 사용합니다.

이제 외부 코드는 숨겨진 데이터와 안전하게 상호 작용할 수 있습니다.

// main.c
Counter *c = create_counter(10);
printf("%d\n", counter_get_value(c));  // 10
counter_set_value(c, 25);
printf("%d\n", counter_get_value(c));  // 25

이 pattern을 사용하면 데이터에 액세스하는 방식을 완전히 제어할 수 있습니다. 다음 레슨에서는 setter에 유효성 검사 로직을 추가하며 이를 기반으로 확장해 나갑니다.

challenge icon

챌린지

쉬움

getter 및 setter 함수를 사용하는 opaque pointer 패턴으로 Score 모듈을 만들어 봅시다. 외부 코드가 제공하는 public interface를 통해서만 데이터와 상호 작용할 수 있는 숨겨진 score 추적기를 만들게 됩니다.

세 개의 파일을 만듭니다:

  • score.h: public interface입니다. forward declaration을 사용하여 opaque Score 타입을 선언합니다(struct 본문은 작성하지 않습니다!). 다음 함수들을 선언합니다:
    • create_score: initial points를 위한 integer를 받고 Score pointer를 반환합니다
    • free_score: Score pointer를 받고 memory를 해제합니다
    • score_get_points: const Score *를 받고 current points를 반환하는 getter입니다
    • score_set_points: Score *와 integer를 받고 points 값을 업데이트하는 setter입니다
    SCORE_H 기호를 사용하여 include guards를 적용합니다.
  • score.c: 단 하나의 hidden member인 int points를 포함하는 실제 struct Score를 Define합니다. 네 함수를 모두 Implement합니다. getter는 hidden 값을 반환하고 setter는 해당 값을 업데이트해야 합니다. getter는 object를 수정하지 않으므로 const pointer를 사용한다는 점을 Remember하세요.
  • main.c: score를 생성하고, 그 값을 읽고, setter를 통해 수정한 다음, 다시 읽어 모듈을 Demonstrate합니다.

두 개의 입력을 받습니다. 하나는 initial points(integer)이고, 다른 하나는 설정할 new points value(integer)입니다.

main file에서 initial points로 Score를 생성하고, getter를 사용하여 current value를 Print한 다음, setter와 new value를 사용하여 업데이트하고, updated value를 Print한 후 score를 free하고 확인 메시지를 Print합니다.

다음 형식으로 출력을 Print합니다:

Initial: {points}
Updated: {points}
Freed

예를 들어 입력이 100250이면 출력은 다음과 같습니다:

Initial: 100
Updated: 250
Freed

main.cpoints에 직접 액세스할 수 없다는 점에 주목하세요. 반드시 getter 및 setter 함수를 거쳐야 합니다. 이것이 바로 encapsulation의 실제 적용입니다. hidden data를 읽고 수정하는 방식을 정확히 제어할 수 있습니다.

직접 해보기

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

int main() {
    int initial_points, new_points;
    scanf("%d", &initial_points);
    scanf("%d", &new_points);
    
    // TODO: initial_points로 Score 생성
    
    // TODO: getter를 사용하여 초기 값 출력
    // 형식: "Initial: {points}"
    
    // TODO: setter를 사용하여 new_points로 점수 업데이트
    
    // TODO: getter를 사용하여 업데이트된 값 출력
    // 형식: "Updated: {points}"
    
    // TODO: score를 해제하고 "Freed" 출력
    
    return 0;
}
quiz icon실력 점검

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

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

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