programing

변수가 상수여야 한다는 것을 이미 알고 있으면 const 키워드를 사용하는 이유는 무엇입니까?

sourcetip 2022. 7. 16. 09:09
반응형

변수가 상수여야 한다는 것을 이미 알고 있으면 const 키워드를 사용하는 이유는 무엇입니까?

내가 읽고 있는 많은 책들은 키워드를 사용한다.const변수 값을 수정하지 않아야 할 경우.이 변수를 수정할 경우 오류가 발생할 수 있음을 코드 판독기에 명시하는 것 외에(이를 위해 주석을 사용할 수 있습니다), 해당 키워드를 프로그래밍 언어에 포함시킬 필요가 있는 이유는 무엇입니까?변수를 수정하지 않으려면 수정하지 마십시오.

누가 이것 좀 설명해 주시겠어요?

이 변수를 수정할 경우 오류가 발생할 수 있음을 코드 판독기에 명시하는 것 외에(댓글을 사용하여 이 작업을 수행할 수 있습니다)

"가능"하지 않습니다. 프로그램에서 오류가 발생합니다.

  • C++ 컴파일러는 컴파일 실패 및 진단 메시지("컴파일러 오류")를 표시하므로 코멘트는 필요 없습니다.
  • C 컴파일러는 대부분의 경우 이를 강제하지만 표준 라이브러리는 다음과 같은 레거시 덕분에 구멍이 있습니다.strchr그리고, 이것은 당신이 드롭할 수 있는 다소 관대한 암묵적인 변환 규칙을 가지고 있습니다.const쉽게 깨닫지 못한 채 말이야그러나 컴파일에 성공했다고 해서 오류가 없는 것은 아닙니다.불행히도 프로그램의 미세한 버그뿐만 아니라 크고 화려한 크래쉬가 발생할 수 있습니다.

어느 쪽이든, 프로그램의 내부에 에러가 포함되어 있는 것이 보증합니다.

변수를 수정하지 않으려면 수정하지 마십시오.

뭐, 그건 다 좋지만, 완벽한 사람은 없어요.프로그래머는 실수를 한다.이것에 의해, (적어도 통상은 아니고) 실수를 저지르지 않는 컴파일러가 지적할 수 있습니다.

이 기능은 데이터 변수가 생성된 위치에서 여러 줄의 코드를 사용할 때 특히 유용합니다.멀리 떨어져 있을수록 수정해서는 안 되는 것을 깨닫지 못하고 수정하는 것이 쉬워집니다.크고 복잡한 코드 베이스의 경우, 이것은 필수입니다.

코드 베이스의 프로바이더빌리티, 정확성, 안정성에 관한 새로운 척도를 얻을 수 있을 뿐만 아니라 매우 미묘하고 고약한 버그의 원인도 크게 파악할 수 있습니다.컴파일러가 컴파일 후에도 값이 변경되지 않는다는 것을 알고 있는 경우(경우에 따라서는) 컴파일러에게 최적화할 수 있는 기회는 매우 많습니다.

하루 종일 장점을 나열할 수는 있지만, 실제로 코드 베이스에 대해 작업해야 충분히 이해할 수 있습니다.

사실, 완벽한 세계에서는 모든 변수가 기본적으로 설정되며 키워드와 함께 선언해야 합니다.mutable바꿀 수 있을 것 같아요.C++는 거꾸로 되어 있다.

적어도 C++에서는,const다른 프로그래머에게 자신의 의도를 문서화하는 것 이상의 용도가 있습니다.

const컴파일러에게 몇 가지 정보를 전달할 수도 있습니다.예를 들어 다음과 같은 참조를 사용하는 함수입니다.void f(T &t);임시 개체를 매개 변수로 사용할 수 없습니다.그렇게 하려면 , 당신은 그것을 할 필요가 있습니다.const다음과 같은 레퍼런스를 검증합니다.void f(T const &t).

마찬가지로 const 객체에서 멤버 함수를 호출하려면 멤버 함수는 다음과 같아야 합니다.const다음과 같은 자격:void T::foo() const {}.

임베디드 시스템에서는const 컴파일러에 문제의 오브젝트를 어디에 배치해야 하는지(ROM과 RAM에 배치)를 지시하는 것이 더 중요합니다.const그 자체로는 "이 오브젝트를 ROM에 넣는다"고 말할 수 없지만 여전히 전제조건이 되는 경우가 많습니다.

마찬가지로 (C++11 아래)const 는 스레드 안전에 대해 컴파일러에게 설명합니다.

(다른 면에서) 사용하지 않는 C 또는 C++와 비슷한 언어를 정의할 수 있다는 것은 의심의 여지가 없습니다.const이런 식으로.그 결과는 어느 쪽과도 다소 다른 언어가 될 것이다.의도를 모르면 결과가 어떻게 나올지 알 수 없지만 Java 또는 C#에 가까워질 수 있습니다(몇 가지 예에서는 C 및 C++와 어느 정도 비슷합니다만, 이것은 사용하지 말아 주세요).const예를 들어 C++가 하는 것처럼).

IMO는 신념에 기반을 두고 있기 때문에 이것은 어려운 질문입니다.이러한 믿음 중 하나는 코드를 추가하는 것만으로 코드를 어떤 종류의 변경으로부터 보호할 수 있다는 것입니다.물론 그 추가 코드는 컴파일러가 모든 것이 정상인지 확인하기 위해 사용합니다.

키워드만 추가하는 것은 자기 자신이나 개발팀으로부터 코드를 보호할 수 없다고 생각합니다.사실 const, public, private, protected, internal, int, float, double 키워드가 없는 언어가 많습니다.

일부 코드 패턴에서도 동일한 현상이 발생하는데, 왜 사람들은 싱글톤에 대해 논의하느라 그렇게 많은 시간을 낭비하는 걸까요?하나의 인스턴스만 가지려면 하나의 인스턴스만 생성하면 됩니다.10년 전에 발표된 방어적 프로그래밍 기사를 보면 코드로 코드를 보호한다는 생각을 다시 한 번 알 수 있습니다.

어느 시점에서는 개발자의 책임인지 컴파일러의 책임인지를 결정해야 합니다.그러나 컴파일러나 다른 툴은 개발자에게 코드를 저장할 수 없습니다.따라서 많은 키워드는 가치가 없거나 다른 개발자에게 무언가를 전달하는 수단일 뿐입니다.

다른 답변에서 이미 논의된 일반적인 프로그래밍 고려 사항 외에, 한 가지 우려되는 점은 다음과 같은 태도입니다.

변수를 수정하지 않으려면 수정하지 마십시오.

일반적으로 코드 작성 비용의 20%는 개발 단계에서 지출됩니다.나머지 80%는 코드 업그레이드, 유지 보수 등의 수명 동안 소비됩니다.즉, 자신 이외의 많은 사람이 코드를 사용하여 작업할 수 있습니다.

개발 중에 몇 년 후에 문제가 발생하지 않도록 하는 데 소비하는 시간은 좋은 투자입니다.이 작업에는 코멘트 작성, 상수인 상수 정의, 불분명한 언어 구조에 의존하지 않는 명시적 코드 작성 등이 포함됩니다.

또, @worlboss, 꽤 참을 수 없는 소리를 듣습니다.다른 일부에서 언급했듯이, 탄소 단위는 실수를 저지르고 실리콘 단위가 실수를 피하기 위해 할 수 있는 모든 것은 감사히 여겨집니다.

이 명령어는 변수를 수정하지 않도록 컴파일러에 지시합니다.그러면 누군가 변수를 수정하는 코드를 작성하면 컴파일러는 오류를 플래그로 표시합니다.

두 가지 이유:

  1. 컴파일러 강제 문서
  2. 컴파일러 최적화

여기 이안 랜스 테일러의 좋은 설명이 있다.gcc그리고.gold링커):

const의 첫 번째 의미는 프로그램에 실질적인 영향을 미칩니다.const로 선언된 변수는 const로 선언되지 않은 변수와 다르게 컴파일될 수 있습니다.

반면 const의 두 번째 의미는 사실상 컴파일러에 의해 강제된 문서입니다.const 수식 포인터를 사용하여 값을 변경하려고 하면 컴파일러는 오류를 발생시키지만 이러한 포인터를 선언해도 생성된 코드는 변경되지 않습니다.

다음으로 간단한 C의 예를 제시하겠습니다.

void PrintList(const struct List *l);
void SortList(struct List *l);
int  CmpList(const struct List *a, const struct List *b);
void AppendList(struct List *l, struct List *m);
void PushList(struct List *l, struct ListNode *n);
void PopList(struct List *l, struct ListNode *n);

여기에는 노드 목록과 함께 작동하는 작은 기능 집합이 있습니다.첫째, 함수의 이름조차 모르면 어떤 함수가 목록을 바꾸고 어떤 함수가 그렇지 않은지 바로 알 수 있습니다.const표준 라이브러리와 같이 기능은 데이터를 변경하지 않으며 사용자가 해당 기능을 사용하여 데이터를 변경할 수 없습니다.C 컴파일러는 이 명령어를const- 함수에 전달할 데이터에 적용되는 포인터의 크기.따라서 이 경우 실행 시 디버깅을 할 때 두 목록을 비교하는 기능은 데이터가 잘못 수정되지 않도록 보호했기 때문에 이 기능을 망치는 것이 아니라고 확신할 수 있습니다.;)

컴파일러는 변수가 변경되지 않는다는 것을 알고 큰 최적화를 할 수 있습니다.변수는 메모리에 저장하는 대신 실행 가능한 opcode에 직접 입력됩니다.

예: a와 b가 있고, 그것들을 더하려면 a + b를 만듭니다.a가 일정하고 값 3이라고 선언하면 프로그램은 대신 3+b를 만듭니다.이것에 의해, a값을 취득할 필요가 없기 때문에, 메모리와 사이클이 절약됩니다.

문제는 변수가 일정한지 아닌지를 컴파일러가 미리 알 수 없다는 것입니다.물론 코드 전체를 분석하여 변수를 수정했는지 여부를 확인할 수 있지만, 미래의 코드도 수정할 수 있기 때문에 100% 확신할 수 없습니다.

키워드const팀이나 장기 프로젝트에 매우 유용합니다.예를 몇 가지 들겠습니다.이것들은 이 제품의 가치를 설명해 줄 것입니다.const키워드를 지정합니다.

다음 프로젝트에서 사용할 lib를 만들고 있다고 가정해 보겠습니다.즉, 오늘 작성된 코드는 몇 년 후에 신뢰할 필요가 있으며, 그 기간 동안 수정해서는 안 되는 변수를 잊어버릴 가능성이 높습니다(동료들은 수정할 수 있는 변수와 변경할 수 없는 변수조차 모릅니다).이 간단한 예에서는 왜 이 기능을 사용해야 하는지 설명합니다.const.

코멘트라고 하면, 기한이 다가오고, 아직 모든 기능에 코멘트가 기능하지 않는 것은 시간낭비일 뿐입니다.그러나 첫 번째 문제(데드라인) 때문에 코멘트가 필수인 경우도 있습니다.대부분의 코멘트는 쓸모없지만 중요한 코멘트는 생략됩니다.그래서 사용하는 것이 좋다.const키워드: 컴파일 오류를 표시하고 문제를 지적한 후 많은 코멘트를 쓰고 읽습니다.

상수 변수를 사용하면 보다 읽기 쉬운 코드를 작성할 수 있습니다.

가장 많이 사용하는 것은const거의 모든 언어에서 이름을 사용하여 상수 값을 참조할 수 있도록 하는 것입니다. 따라서 당신은 유창한 언어를 사용하여 코드에 코멘트를 퍼트리지 않고도 이 이름이 무엇을 의미하는지 다른 사람에게 말할 수 있습니다.또한 파라미터의 종류와 특수성을 알기 위한 독자들의 시간과 노력을 절약할 수 있습니다.물론 상수 값이 코드 전체에서 재사용되는 경우에도 이점이 있습니다.음, 이런 코드가 더 읽기 쉬울 수 있습니다.

processPages(LETTER_PAPER_WIDTH, LETTER_PAPER_HEIGHT);

...이것보다 더:

processPages(215.9, 279.4); // 8.5 x 11 Inches in millimeters for Letter Papers

위의 예에서는 값을 해석하기 위한 각 파라미터, 그 단위 및 유형을 이해하고 코멘트에 대해 검증할 필요가 있습니다.이는 다음과 같은 장황한 코멘트는 신뢰할 수 있고 유용한 코멘트가 아니기 때문입니다(Clean Code의 Robert Martin에 대한 악평입니다).http://goo.gl/5EyY) 를 참조해 주세요.

전체 프로젝트에서 동일한 상수를 여러 번 사용하고 모든 위치에서 하드 코딩하는 시나리오를 고려해 보십시오.이제 갑자기 상수 값을 다른 값으로 변경해야 하므로 모든 위치에서 변경 작업을 수행해야 합니다.

따라서 코드를 보다 쉽게 유지 관리할 수 있도록 하는 것이 그 이유 중 하나라고 생각합니다.

언급URL : https://stackoverflow.com/questions/18157523/why-would-you-use-the-keyword-const-if-you-already-know-variable-should-be-const

반응형