디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

LLM) C 언어 const 보고가~~ 싫음 말구

*루비*갤로그로 이동합니다. 2025.03.20 09:07:52
조회 92 추천 2 댓글 7

 

const

const는 C 언어에서 불변(immutable)을 보장하는 핵심 키워드로, 변수나 데이터가 의도치 않게 수정되는 것을 방지하는 역할을 합니다. 이 개념은 코드의 안전성과 명확성을 높이며, 특히 대규모 시스템이나 라이브러리를 작성할 때 중요한 역할을 합니다. 아래에서는 다양한 상황에서 const가 어떻게 사용되는지, 그리고 왜 유용한지에 대해 자세히 설명하겠습니다.

기본 개념

불변성 보장: const로 선언된 변수는 초기화된 후 값이 변경되지 않습니다. 컴파일러는 읽기 전용 변수에 대한 수정 시도를 오류로 처리하여, 실수나 의도치 않은 부작용을 줄여줍니다.

가독성과 유지보수: 데이터가 실수로 변경되지 않도록 명시적으로 표현함으로써 코드의 의도를 더 명확하게 이해할 수 있습니다.

최적화 기회: 컴파일러는 const로 선언된 데이터가 변경되지 않는다는 정보를 활용하여 최적화를 진행할 수 있습니다. 예를 들어, 글로벌 const 변수는 읽기 전용 메모리 영역에 저장될 수 있습니다.

기본 사용 예시

상수 변수 선언

#include <stdio.h>

int main(void) {
    const int MAX_SIZE = 100;
    
    // MAX_SIZE = 200;  // 오류: const 변수는 수정할 수 없음.
    
    printf("MAX_SIZE는 %d 입니다.\n", MAX_SIZE);
    return 0;
}

위 예제에서 MAX_SIZE는 초기값 100으로 설정되며, 이후 변경이 불가능합니다. 전처리기#define MAX_SIZE 100와 달리, const 변수는 타입 체킹이 이루어지므로 타입 안정성을 보장합니다.

포인터와 const의 조합

const는 포인터와 결합할 때 다양한 의미를 가집니다. 크게 두 가지 경우가 있습니다.

  1. 포인터가 가리키는 대상의 데이터(*ptr)가 변경 불가능한 경우
  2. 포인터 변수(ptr) 자체가 변경 불가능한 경우

데이터 상수 (Pointer to Constant)

형태: const int* ptr; 또는 int const* ptr;
의미: 포인터를 통해 접근하는 데이터(*ptr)는 읽기 전용이며, 수정이 금지됩니다. 단, 포인터 자체(ptr)는 다른 주소를 가리킬 수 있습니다.

#include <stdio.h>

int main(void) {
    int num = 42;
    const int *p = #  // 또는 int const *p = #

    // *p = 100;  // 오류: p를 통해 접근하는 데이터는 변경할 수 없음.
    
    int num2 = 84;
    p = &num2;   // OK: 포인터 p 자체는 다른 주소를 가리킬 수 있음.
    
    printf("*p = %d\n", *p);
    return 0;
}

상수 포인터 (Constant Pointer)

형태: int* const ptr;
의미: 포인터 변수 자체가 상수여서 다른 주소(ptr)를 가리킬 수 없지만, 가리키는 데이터(*ptr)를 수정하는 것은 가능합니다.

#include <stdio.h>

int main(void) {
    int num = 42;
    int *const p = #  // p는 반드시 num의 주소를 가리켜야 함.

    *p = 100;  // OK: p가 가리키는 데이터를 변경하는 것은 허용.
    
    // int num2 = 84;
    // p = &num2;  // 오류: p는 상수 포인터이므로 다른 주소를 가리킬 수 없음.
    
    printf("num = %d\n", num);
    return 0;
}

상수 포인터를 통한 상수 데이터 (Const Pointer to Const Data)

형태: const int* const ptr;
의미: 포인터 자체와 포인터가 가리키는 데이터 모두 변경할 수 없습니다.

#include <stdio.h>

int main(void) {
    int num = 42;
    const int *const p = #

    // *p = 100;  // 오류: 데이터는 수정할 수 없음.
    // p = &another;  // 오류: 포인터 자체도 다른 주소를 가리킬 수 없음.
    
    printf("*p = %d\n", *p);
    return 0;
}

const의 활용 예

함수 매개변수: 읽기 전용으로 사용될 값들을 함수 인자로 전달할 때 const를 사용하면, 함수 내부에서 원본 데이터가 변경되는 것을 방지할 수 있습니다. 함수의 의도가 “읽기 전용”임을 명시적으로 나타냅니다.

#include <stdio.h>

// 배열의 내용을 수정하지 않음을 보장
void printValues(const int* array, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", array[i]);
        // array[i] = 0;  // 오류 발생: const로 인해 수정 불가
    }
    printf("\n");
}

int main(void) {
    int numbers[] = {1, 2, 3, 4, 5};
    printValues(numbers, 5);
    return 0;
}

인터페이스 명확화: API 설계 시, 입력 데이터나 내부 상태가 수정되지 않도록 보장하는 용도로 사용하면, 사용자는 해당 데이터가 안전하다는 것을 알 수 있습니다.

읽기 전용 글로벌 상수: 전역에서 자주 사용되는 상수 값들은 const로 선언하여, 의도치 않은 변경을 막을 수 있습니다.

최적화에 도움: 컴파일러가 const로 선언된 데이터를 변경하지 않는다고 보장할 수 있기 때문에, 최적화 측면에서 내부적으로 도움을 받을 수 있습니다.

상수 표현식과 초기화: C에서는 const 변수도 초기화 시 반드시 값이 할당되어야 합니다. (만약 초기화 없이 선언되면, 그 값은 예측할 수 없고 컴파일러에 따라 경고 또는 오류가 발생할 수 있습니다.)

주의사항

const는 엄격하게 값이 변경되지 않음을 보장하지만, 포인터를 사용하는 상황에서는 다른 변수에 대한 간접적인 접근을 통해 값을 수정할 위험이 있으므로 올바른 사용법에 주의해야 합니다.

추천 비추천

2

고정닉 0

1

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 어떤 상황이 와도 가족 안 굶길 것 같은 생활력 강해 보이는 스타는? 운영자 25/03/24 - -
2833438 이 세계가 맞는건가... 넥도리아(222.233) 03.22 35 0
2833436 유데미 파이썬 강의 추천 해주세요 [4] 프갤러(180.71) 03.22 85 0
2833435 자전거 국토종주 발명도둑잡기갤로그로 이동합니다. 03.22 22 0
2833433 cpp는 rust처럼 의존성관리 쉽게 하는 방법 없나? [1] ㅇㅇ(1.240) 03.22 62 0
2833432 프론트에서 TS 많이씀 ㅇㅅㅇ? [8] 강유현갤로그로 이동합니다. 03.22 82 0
2833431 이직 못했으면 물경력으로 ㅈ댈뻔 했노 [3] ㅇㅇ(121.135) 03.22 93 0
2833428 Wii에 리눅스, MacOS 깔기 [1] 발명도둑잡기갤로그로 이동합니다. 03.22 37 0
2833426 일본 경제의 몰락 근황, 더이상 일본이 롤모델이 아닌 이유 발명도둑잡기갤로그로 이동합니다. 03.22 30 0
2833425 커서 좋다는건 유료버전 말하는거지? [2] 프갤러(221.167) 03.22 48 0
2833424 NextJS 타입스크립트로 해보니까 은근 귀찮네 ㅇㅅㅇ [6] 강유현갤로그로 이동합니다. 03.22 76 0
2833422 adhd 자가 진단 결과 4점 정상 발명도둑잡기갤로그로 이동합니다. 03.22 70 0
2833420 NextJS 이거 SPA맞음 ㅇㅅㅇ? [6] 강유현갤로그로 이동합니다. 03.22 74 0
2833418 오늘 좆빡세게 작업했다 [4] ㅆㅇㅆ(124.216) 03.22 53 0
2833416 23살 노베이스인데 냉절하게 공부하기엔 너무 늦은 나이일까요 [1] ㅇㅇ(223.38) 03.22 60 0
2833414 “알트만, 이제 취업하려면 ai활용 능력 길러야” ㅇㅇ(211.219) 03.22 53 0
2833413 담뱃재 밞으러 간다. 산불로 건조하데 봄철 넥도리아(112.170) 03.22 24 1
2833412 지금은 뭐 경기도에있으니까... [3] 피치피(211.219) 03.22 42 0
2833411 GPT로 공부하는 거 효율 ㅈㄴ 좋은듯 [3] 프갤러(58.141) 03.22 79 0
2833408 구미가 땅값 뒤지게 싼데 MES일자리없나 ㅇㅅㅇ [19] 강유현갤로그로 이동합니다. 03.22 111 0
2833406 제발 한국인이면 구글 씁시다 [3] ㅇㅇ(211.234) 03.22 66 0
2833405 부산 집값보면 일찍결혼하게도 생김 [3] 피치피(211.219) 03.22 102 0
2833404 요즘 공채는 커녕 수시채용도 잘안보이네 RyuDOG갤로그로 이동합니다. 03.22 52 0
2833403 불리언 발음 어디까지 하는거 들어봣냐 [2] 키보드맨갤로그로 이동합니다. 03.22 43 0
2833402 소프트웨어 개발자인데 성격은 하드웨어인 사람들 [4] jonny갤로그로 이동합니다. 03.22 87 0
2833401 pie 왜 안되나요? 넥도리아(112.170) 03.22 28 0
2833399 전 회사가 개발자를 뭔 핫산으로 다뤘었는디 ㅇㅅㅇ [5] 강유현갤로그로 이동합니다. 03.22 82 0
2833398 취업함 4명따리 [3] 피치피(211.219) 03.22 112 0
2833397 일본은 대기업 일자리비율리 40%래 ㄷ [4] ㅇㅇ(211.219) 03.22 87 0
2833395 니네들 공무원 왜 안함? [3] ㅇㅇ(211.234) 03.22 64 0
2833394 팀원들때매 팀장하기 존나 빡시네 ㅅㅂ [2] ㅇㅇ(210.178) 03.22 75 0
2833392 학의천 특징 청둥오리 교미 집합소 오리가 오리위에 올라탐 넥도리아(112.170) 03.22 28 0
2833391 adhd 검사 2점 나오셨다 [2] 헬마스터갤로그로 이동합니다. 03.22 67 0
2833390 리액트 이새끼 Node에서 호스팅 해야함 ㅇㅅㅇ? [6] 강유현갤로그로 이동합니다. 03.22 83 0
2833388 왜 프갤 글리젠 죽음?? 나트륨찡갤로그로 이동합니다. 03.22 35 0
2833387 헬쓰 끊고 냥덩 따라서 달리기 하기로 했다 발명도둑잡기갤로그로 이동합니다. 03.22 32 0
2833385 나능 초고함량 고나트륨 나톨스얌 ㅋ 나트륨찡갤로그로 이동합니다. 03.22 26 0
2833384 윈도우 서버 여부는 둘째치고 IIS는 쓰레기다 ㅇㅅㅇ [4] 강유현갤로그로 이동합니다. 03.22 46 0
2833381 llm) zfs 무결성 *루비*갤로그로 이동합니다. 03.22 32 0
2833379 llm) 너무 배고파서 제발 400원만 도와주실분2 *루비*갤로그로 이동합니다. 03.22 26 0
2833377 nginx 윈도우용 64비트 빌드 찾기 너무 귀찮음 ㅇㅅㅇ [12] 강유현갤로그로 이동합니다. 03.22 45 0
2833376 너무 배고파서 제발 400원만 도와주실분? 주제로 글을 작성하시오. *루비*갤로그로 이동합니다. 03.22 32 0
2833375 여기가 모솔 갤러리의 또 다른 이름이라는데.. [2] *루비*갤로그로 이동합니다. 03.22 37 0
2833372 고정닉으로 디시 운영자한테 풀어달라고 문의 메일 보냈는데 답이 없습니다. 넥도리아(112.170) 03.22 58 0
2833365 09:30~17:30 잤다 [1] 발명도둑잡기갤로그로 이동합니다. 03.22 45 0
2833352 뉴진스 대박임 ㅋㅋ [5] *루비*갤로그로 이동합니다. 03.22 107 0
2833349 글 쓰다 잤다 ㅎㅎ *루비*갤로그로 이동합니다. 03.22 26 0
2833348 wsl을 왜 씀?? ㅋㅋ [1] *루비*갤로그로 이동합니다. 03.22 71 0
2833347 개쥐포새끼들은 내수용 앱만 만들줄 알지 절대 미국이나 중국 못 따라감 ㅋ [1] 프갤러(218.146) 03.22 42 0
2833346 니들 WSL 주로 어떤용도로 쓰냐 ㅇㅅㅇ? [3] 강유현갤로그로 이동합니다. 03.22 62 0
2833341 효과적으로 LLM 써먹는 최상의 질의 ㅋㅋ *루비*갤로그로 이동합니다. 03.22 56 0
뉴스 ‘갓세븐’ 잭슨, 멤버에 분노하며 햇반 던진 사연은…“JYP 잘리면 큐브 가야지” 디시트렌드 03.25
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2