[C++ 기초질문] const에 대해 간단한 질문드립니다.

junyul1994의 이미지

아래 코드에서 sum 함수 정의할 때, const가 없어도 잘 컴파일되고 실행되는걸 확인했습니다.
그래도 const를 굳이 쓰는 특별한 의도나 이유가 있을까요?

0   #include <iostream>
1   using namespace std;
2
3   int sum(const int array[], const int length) {
4     long sum = 0;
5     for(int i = 0; i < length; sum += array[i++]);
6     return sum;
7   }
8
9   int main() {
10    int arr[] = {1, 2, 3, 4, 5, 6, 7};
11    cout << "Sum: " << sum(arr, 7) << endl;
12    return 0;
13  }

* 코드 출처: MIT C++ Open Course Lecture Note 4 "Arrays and Strings"
* URL: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-096-introduction-to-c-january-iap-2011/lecture-notes/MIT6_096IAP11_lec04.pdf

mirheekl의 이미지

함수 내에서 해당 변수가 변하지 않는다는 걸 가정하고 있다는 걸 컴파일러에게 알리는 것인데,

만약 실수라도 해서 변경하는 코드를 넣었을 경우 컴파일러가 이를 알려주므로 문제를 빨리 파악할 수 있겠죠.

해당 함수를 사용하는 프로그래머 입장에서도 아 이건 안 변하는 거구나 하고 빨리 판단할 수 있고..

값이 변하지 않는다는 걸 가정할 경우 컴파일러 입장에서도 추가 최적화의 여지가 있습니다.

쓰지 않아도 되기야 하지만 적극적으로 사용했을 경우 이득이 있는 셈이죠.

--

HDNua의 이미지

+1

저는 이렇게 생각했습니다.

twinwings의 이미지

const로 선언한 변수의 경우, 컴파일러+운영체제 조합에 따라서, 별도의 구역에 메모리를 할당하고,

그래서 문법상 제약뿐만 아니라, 실제로 운영체제상으로 보호해주는걸로 알고 있습니다.

자세한건 [Effective C++ . 스콧 마이어스 저] item 2, item 3. 참조하세요. 최적화등 여러가지 방면에서 왜 좋은지 설명해 줍니다.

jick의 이미지

그건 const로 선언한 global 변수의 경우에는 가능하지만 지금처럼 함수 인자를 const로 받는 경우에는 해당되지 않습니다.

함수를 부르는 쪽에서 인자로 global 변수든 스택의 로컬 변수든 new로 할당한 변수든 아무 거나 넘겨줄 수 있으니 "별도 구역의 메모리"가 성립하지 않지요.

익명 사용자의 이미지

const 사용의 필요성을 두고 컴파일 최적화까지 생각할 필요가 없어보입니다
그런 기능까지 있는 컴파일러가 존재한다면 좋겠지만 말이죠

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.