Const 키워드를 사용시 에러가 발생하게 하는 요인은?

chosy1010의 이미지

const는 일반적으로 상수를 정의할 때 사용되는 것으로 알고있습니다.

예를 들어

const int A = 10;

int A =5; //error

를 하면 에러가 발생하는데

A를 10이라는 고정된 상수로 정의했으니 그 뒤에 다시 대입연산을 시키면 오류가 나는 것은 이론적으로 배워서 알고있으나

도대체 왜, 어떤 과정에 의해서 int A에 5를 대입했을 때 '어떤 요인에 의해' , '무엇때문에' 오류가 발생하는 지

그 과정을 좀 자세히 알고싶습니다ㅠ

ifree의 이미지

const 변수 A에 아예 메모리 자체가 할당되지 않을 수도 있습니다.
이 겨우 define과의 차이는 타이프 체킹이 된다는 정도.

chosy1010의 이미지

const int A가 메모리에 할당이 되지 않는다면

어디에 저장이 되는건가요?

ifree의 이미지

저장이 되지 않습니다. 그냥 상수 입력한 것과 똑같도록 컴파일러가 처리합니다.
별도로 extrn 으로 선언하면 메모리가 할당되나, 이 경우도 변수를 변경하려 하면 에러가 발생합니다.
어떤 메카니즘에 의해 에러가 발생하는 것이 아니고 상수로 선언해 놓고 변경을 시도하니까 컴파일러가 에러를 내 주는 거죠.

planetarium의 이미지

애초에 const는 기계적인 차이를 가지기 위해서보다는
프로그래머의 실수를 막기 위한 장치라고 생각하는게 편합니다.

익명 사용자의 이미지

애초에 const로 선언한 것은, 변수가 아닌 상수로 쓰겠다고 정의한 것입니다.
그런 상수에 값을 변화시키려고 하니 컴파일러가 화를 낼 수 밖에요.
프로그래머가 변수로 선언해놓고, 상수처럼 사용해도 아무런 문제가 없습니다만, 코딩을 하다보면 실수를 하게 마련이고,
바뀌지 말아야할 상수가 값이 바껴서 버그를 생산하기도 합니다.

const는 상수변수를 지정할 때 쓰이기도하지만, 함수의 파라미터 전달시에도 많이 사용됩니다.
예를 들어
int A(const int b, int* c);
라고 한다면, b는 함수 내에서 변화되지 않는 값이라는걸 함수정의만 보고도 알 수 있습니다.
학교 숙제정도의 간단한 코딩이 아니면, 여러명이서 개발 하는 경우가 많습니다. 서로가 서로의 코드를 사용하면서, 함수 정의와 명세서만 보지 내부 구현을 보지 않기 때문에,
"const를 써서 여기는 상수값만 입력해주세요." 하고 다른 개발자에게 알려주는 역할을 하는 매우 중요한 예약어입니다.
특히 C++에서 상수성이라는 개념은 매우 중요하니깐 잘 알아 두시는게 좋습니다. (예를 들면, int const* const ** b; 이런 변수도 정의가 가능합니다.)

#define 문으로 상수를 치환할 수 도 있습니다만, 그럴 경우에는 gdb같은 툴을 사용해서 디버깅할 때 symbol을 볼 수가 없습니다. 그런 경우에도 const 상수변수가 유리하구요.
그냥 단지 상수의 역할만 하기 위해서는 enum을 쓰는 것도 좋은 방법입니다.

익명 사용자의 이미지

#define은 프리프로세싱 단계에서 처리하는 부분이고
const는 C컴파일 단계에서 처리하는 부분이라는게 근본적인 차이구요.

#define과 const의 실용적인(?) 차이는
#define으로 해놓으면 자료형이 불분명한데
(자료형이 있긴 있는데 딱봐서 무슨 자료형인지 알아보기 쉽지 않습니다.)

const로 해놓으면 자료형이 확실하죠.

익명 사용자의 이미지

답글을 달고 보니 질문글의 제목이 바뀌는군요...
질문 내용도 바뀐거 같고 ;;;;

const 키워드를 붙히고 값을 바꾸면 오류가 나는 이유는 문법오류입니다.

chosy1010의 이미지

질문은 define과 const 차이가 궁금하다고 썻었는데요

결국 제가 궁금했던 건 const에서 에러가 나는 근본적 원인이 궁금한거여서

제목을 조금 수정했습니다. 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.