[C/C++] const keyword

2019. 1. 4. 13:50·Language/C C++
반응형

[C/C++] const keyword

const 키워드를 적절히 사용할 수 있으면 유용하다. 코드 작성 중 발생할 수 있는 실수를 컴파일 단계에서 확인가능하기 때문에 활용하면 좋다.
const의 개념은 간단하다. 이 키워드를 통해 선언되면 프로그램 실행 중 변경할 수 없음을 지정한다. 이를 통해 할 수 있는 기능 중 하나는 상수 지정이다. 상수를 지정하는 다른 방법은 #define을 이용하는 것이다. const는 #define보다 이점을 가지고 있다. 먼저 #define을 사용할 경우는 단순 대체만 수행하기 때문에 타입 확인을 할 수 없는 반면 const를 사용하면 컴파일러에서 확인이나 검사가 가능하다. 또한 const변수를 이용하면 디버거에서 변수를 이용할 수 있어 디버깅에 유용하다.

포인터와 const가 결합되면 확인이 다소 어렵다.

int* p1;
const int* p2;
int* const p3;
const int* const p4;

p2와 p3의 경우 const 키워드에 영향을 받는 것이 어느 부분인지 헷갈린다.

(const int*) p2;
int* (const p3);

cosnt는 바로 오른쪽의 내용을 제한한다고 보면 된다. p2는 p2의 값은 바꿀 수 있지만 p2가 가리키는 값은 변경하지 못한다. p3는 p3의 값을 바꿀 수 없지만 p3가 가리키는 값은 바꿀 수 있다.

p2 = #
*p2 = 1;    //compile error
p3 = #    //compile error
*p3 = 1;

const의 또 다른 활용은 함수 인자와 반환 값에 적용하는 것이다. 함수 호출 시 인자에 매우 큰 값이 올경우 복사가 일어나면 비효율적일 것이다. 이 때 참조나 포인터형을 받으면 복사에 필요한 비용이 줄지만 인자의 변경 가능성이 생긴다. const는 이 가능성을 제한해준다. const를 통해 인자의 포인터가 성능상의 이유로 쓰인건지, 값을 변경하려는지 의도를 파악할 수 있다. 또한 함수 작성 중 실수로 인자 변경이 일어날 경우 컴파일 단계에서 제한해준다.
리턴값에도 const를 지정해 줄 수 있다.

class Player{
private:
    char name[32];
pulbic:
    void SetName(char* name);
    char* GetName() {
        return name;
    }
}

GetName 호출을 통해 Player.name을 가리키는 배열을 받게 된다. Player 클래스의 의도는 SetName() 호출을 통해서만 name을 수정할 수 있다. 하지만 GetName()의 반환값이 char*이기 때문에 포인터 접근을 통한 값의 변경이 일어날 수 있다. 이런 경우를 방지하고자 return값에 const를 붙여준다.

C++에서는 const의 의미를 확장하여 클래스 멤버 함수들에 이용할 수 있도록 하였다.

class Player{
private:
    char name[32];
pulbic:
    void SetName(char* name);
    const char* GetName() const {
        return name;
    }
}

GetName() 멤버함수 인자 괄호 뒤에 const가 추가 되었다. 이것은 해당 멤버함수가 멤버 변수를 변경하지 않음을 지정해 준다. 만일 멤버변수를 변경하는 시도를 하면 컴파일 오류를 낸다.

const를 제대로 활용하기 위해서는 적용해야할 모든 곳에 const를 적용해야 한다. 코딩을 하며 실수를 많이 하는 입장에서 이런 실수를 줄여줄 수 있는 방법을 잘 사용해야겠다.

반응형
저작자표시 비영리 변경금지 (새창열림)
'Language/C C++' 카테고리의 다른 글
  • [C/C++]std::mutex
  • [C/C++] 소켓 프로그래밍
  • [C++]optional
  • 아이템선택
덴마크초코우유
덴마크초코우유
IT, 알고리즘, 프로그래밍 언어, 자료구조 등 정리
    반응형
  • 덴마크초코우유
    이것저것끄적
    덴마크초코우유
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • Spring Framework (9)
        • Spring (5)
        • JPA (2)
        • Spring Security (0)
      • Language (51)
        • Java (11)
        • Python (10)
        • JavaScript (5)
        • NUXT (2)
        • C C++ (15)
        • PHP (8)
      • DB (16)
        • MySQL (10)
        • Reids (3)
        • Memcached (2)
      • 개발 (3)
      • 프로젝트 (2)
      • Book (2)
      • PS (15)
        • 기타 (2)
        • 백준 (2)
        • 프로그래머스 (10)
      • 딥러닝 (8)
        • CUDA (0)
        • Pytorch (0)
        • 모델 (0)
        • 컴퓨터 비전 (4)
        • OpenCV (1)
      • 기타 (16)
        • 디자인패턴 (2)
        • UnrealEngine (8)
        • ubuntu (1)
        • node.js (1)
        • 블로그 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    클래스
    CPP
    웹
    딥러닝
    Python
    memcached
    php
    redis
    JS
    FPS
    PS
    게임
    게임 개발
    Unreal Engine
    Unreal
    MySQL
    select
    언리얼엔진4
    프로그래머스
    NUXT
    블루프린트
    map
    C++
    C
    mscoco
    JavaScript
    자바
    알고리즘
    pytorch
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
덴마크초코우유
[C/C++] const keyword
상단으로

티스토리툴바