C++ 에서의 변수선언 스타일

gurumong의 이미지

언제 C++에서의 코딩 스타일에서
변수는 사용되기 직전에 변수선언을 한다고 들었습니다

저의 초보적인 생각에는
그렇게 변수선언을 하면 변수들이 모여있질 않아서 (소스내 흩어져있어서) 변수들을 관리하기 힘들꺼같은데요

위와 같은 C++에서의 변수선언 스타일을 따르면 어떤점이 좋은것인지요?
그리고 상대적으로 함수내에서 사용하는 변수들을 함수의 처음부분에 몽땅 선언하는 C 스타일의 변수선언은 어떤점이 안좋은지 알고싶습니다

ktd2004의 이미지

제 개인적인 생각은 이렇습니다.

int a;
.... a변수 사용....

int b;
.... b변수 사용....

이 경우와

int a;
int b;

...변수 a 사용...
...변수 b 사용...

이 경우를 비교해보면

하나의 함수내부를 기능별로 분리할 수 있지 않을까요?

익명 사용자의 이미지

처음에 몽땅 변수 선언해서 쓰는방법이나,
중간중간에 필요에 의해서 선언해서 쓰는방법모두 안좋은 방법입니다.

제가 항시 생각하면서 coding하는 부분은
"사용하는 변수는 최대한 가까이에"입니다.

C도 그랬고, C++도 그랬고
학부에서 얼마안하고 뚝딱만들만한 크기가 아니면 디자인이나 구조에 공을 많이 들이게 됩니다.
당연히 그러다보면 함수가 자기가 하는 역할만 딱딱 나눠지게 되고,
그 함수의 길이는 얼마 커지지 않게 되지요.

일예로 리눅스의 kernel소스중 module쪽이 아닌 순수 kernel쪽코드를 보게되면 한 함수가 아무리 커도 20줄을 넘지 않는 경우가 대부분입니다. 각각의 함수는 무슨역할을 하는지 명확하고, 또한 상당히 직관적으로 되어있습니다.
그리하여 그함수에서 쓰는변수는 많지도 않고, 실제 쓰여지는 부분과 많이 떨어져 있지도 않게되지요.

회사에 취직을 해서 큰 프로젝트를 하게되는 경우나 잘짜논 코드를 분석하다보면 위와같은 룰이 적용되어있는걸 심심치않게 보실수 있을겁니다.^^

IsExist의 이미지

코딩할때는 지금 당장보다는 나중을 위한다는 생각으로 해야합니다.
자신이 짠 코드도 몇일,몇주,몇달 지나면 어색합니다.
그런걸 생각해서 코딩하는게 PL에서는 readability를 생각해서 코딩한다는건데요
위에분이 설명한것 처럼. 소스를 볼때 변수 이름을 보고 변수의 타입이나
용도를 파악해야 합니다. 이럴경우 사용되는 위치에서 가까이 선언된경우가
편하겠죠. 요즈은 컴파일러나 에디터들이 좋아서 변수 검색이 쉽습니다.
어떻게 보면 위치도 문제가 안될 수 있습니다. 자신만의 스타일로 해서
위에서 예로들었듯이 두가지 중에 한가지를 선택을 할 수도 있고 아니면
혼용을 해서 사용할 수도 있습니다.

저는 주로 앞에쪽 몰아서 사용하는데 변수 관리가 편해서 그럽니다.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

M.W.Park의 이미지

조건문 같은 곳에서는 allocation을 하지 않고 지나 갈 수도 있는 이점이 있다고 알고 있습니다만... ^^;

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

나는오리의 이미지

KTD wrote:
제 개인적인 생각은 이렇습니다.
int a;
.... a변수 사용....

int b;
.... b변수 사용....

이 경우와

int a;
int b;

...변수 a 사용...
...변수 b 사용...

이 경우를 비교해보면

하나의 함수내부를 기능별로 분리할 수 있지 않을까요?

예전의 어떤책에서는 전자는 C++스타일 후자는 C스타일로 정의를 내렸던걸로 기억합니다.
(그것이 틀렸다는건 아니고요.)

C++에서 변수선언은 말그대로 개성이라 생각합니다.
단지 일관성이 필요하겠지요.

저같은경우 함수 전체에 쓰이는 변수는 함수 첫부분에 선언하고
단순히 루프 몇번 돌리기 위한건 루프문 바로 앞에 선언을 합니다.

rhizome의 이미지

Meyers의 Effective C++의 항목 32에 변수 정의 관련된 내용이 있습니다. 제목이

Item 32: Postpone variable definitions as long as possible

입니다.

제목에 나온 것처럼 변수를 사용하기 직전에 정의하고 사용할 것을 권하고 있습니다.

그리고 본문을 읽어보면 아시겠지만, 이런 방식을 추천하는 이유는 정의만 하고 쓰이지 않는 변수(unused variable)가 생길 가능성 때문입니다. -- 변수가 객체인 경우 쓰이지 않는 변수는 불필요한 생성자와 소멸자의 호출 때문에 프로그램 성능 저하의 요인이 될 수 있습니다.

자세한 설명은 Effective C++의 본문을...

거짓말이 없다는 것은 현대성보다도 사상보다도
백배나 더 중요한 일이다.

ㅡ,.ㅡ;;의 이미지

변수사용하기직전이 좋은경우도 있고 그렇지 않은경우도 있죠

예를들어볼까요..
변수가 국부적으로 사용되는 변수를 첫머리에 선언하고 나중에가서 한번사용한다면 불편할것이 분명합니다.

반대로 지금당장은 국부적으로 사용하지만 언제 다른곳에 사용될지 모를변수가 있습니다. 예를들면 불특정 임시사용목적의 buf, i 등이죠..
어떤사람이 중간쯤에 보니 buf 가 사용되었는데 앞쪽에 한번더 사용하려고 생각한다면 사용과 선언의 순서가 뒤집힐우려가 있고
혼돈을가져와 불편하겠죠..

그리고 개인적으로 국부적으로 쓸변수라면 대괄호로 해주는게 더이치적으로 맞다고 생각되는데.. C에서 그렇게 하죠..


----------------------------------------------------------------------------

mirr의 이미지

TC++PL에서도 전반부에 C++에선 C와 다르게 변수선언을 조건문이나
제어문에서도 할 수 있으므로 그렇게 하는것이
다른 여러가지 문제들과 해깔림, 가독성문제 해소에 도움이 된다고
권장하곤 있습니다.
사실 이렇게하면 물론 매번 지정해줘야한다는것은 귀찮을지 몰라도
변수를 같은 이름으로 다르게 사용할 수도 있고, 훨씬 깔끔해 질 수도
있다고 생각되구요.
변수가 많이 필요로 하게 되는 프로그램같은경우엔 이 변수가 어디서
어떻게 선언되었었는지 쉽게 알 수 있어서 좋은듯 합니다.

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

죠커의 이미지

많은 분들이 이야기 해주신 것과 동일하게 storage는 쓰여질 곳에 가깝게 위치하는 것이 정답이라고 봅니다. 그렇게 하기 위해서 C99에서도 중간에 storage를 정의할 수 있게 바뀐 것이죠.

그리고 i, j와 같은 소위 임시 변수를 재활용하는 것에 대해 반대합니다. 문법적으로 반복문에서 지엽적인 정의가 허용된다면 반복문을 위한 storage를 재활용할 이유가 없다고 봅니다.

lovemyin의 이미지

Effectvie C++ 항목 32를 보시면 이 부분에 대한 자세한 내용이 나와있습니다. 예를들면,,,
string foo(const string &ss)
{
string str;
if ( ss.length() < MIN_LENGTH )
{
return -1;
}
str = ss;
return str;
}
위의 코드를 보시면 ss라는 스트링 변수의 길이가 최소길이값보다 작으면 바로 리턴을 합니다.
이렇게 될때 위의 변수 str은 선언될 필요도 없는데 선언된 거죠..
생성자 호출과 소멸자 호출이라는 불필요한 오버헤드가 추가되는 겁니다. 따라서 C++에서는 변수 선언 위치를 C와 다르게 한 것입니다.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

댓글 달기

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