지역변수와 전역변수의 적합한 사용 예. 에 대한 질문

cococo의 이미지

음... 제목 쓰기가 애매하네요. 한글이 왜 안되는지.. -_-;

프로그램을 짜고 있었습니다.
되도록이면 전역 변수를 안 쓰려고 하는게 제 스타일입니다만....
그렇다고 해도 함수에 넘기는 인자가 많아지면 귀찮아서, 어떻게 할까 생각해 보다가,
아예, 전역 변수를 구조체로 만들고,
거기에 필요할 때 마다 변수를 추가하고,
실제로는 구조체 하나만 선언해서 쓰고 있습니다.
함수 만들때는 전역변수로 선언한 구조체 변수 포인터 하나만 전달하구요.
이렇게 하니까 파라메터도 많이 안 써도 되고 좋더군요...

근데, 생각해 보니까 바보같은 짓을 한게, 전역변수면 구조체로 만들 필요도 없이 아얘 파라메터로 전역변수를 전달하지 않아도 되잖아요. 인자로 전달하는 거 없이 그냥 함수 안에서 쓰면되지...
근데, 느낌상으로는, 전역변수를 많이 쓰면 안될것 같단 말이죠. 왠지 불안하단 느낌.....(6 sense??)

그래서, 질문입니다.
왜 전역 변수를 많이 쓰면 안좋을까요?
아니면 , 제가 단순히 잘못 알고 있고, 전역 변수 많이 써도 좋을까요?
제 막연한 느낌을 콕 찝어 지적해 주실 분 없으신지요?
언뜻 생각해 봐도... 전역 변수를 썼을 때는 ,

1. 프로그램의 가독성 저하(함수 안에서 선언 안 한 변수가 갑자기 튀어나오니까)
2. 이름 자원의 고갈(전역변수랑 같은 이름 써버리면 그 함수에서는 전역변수 못 쓰니까)

빼고는 없을 것 같긴 한데요. 저게 정확한지도 모르겠고... 음...

고수님들의 지적 부탁드립니다. -_-;

좋은 하루 되시기 바랍니다.

bus710의 이미지

전역 변수는 그 프로세스가 끝나지 않으면 안 없어지지 않습니까?

** 물론 지역 변수도 volatile 인가 static 인가로 설정하면 안 없어진다고 알고 있습니다 (실제로는 막 써대는 편이라 저도 헷갈리네요;; )

따라서 지역 변수로 설정해서 전달해 주는 방식을 이용하면 해당 함수가 끝나면서 램을 다시 확보 할 수 있으니까... 그런게 아닐까요?

실제로 PC 측에서야 왠만한 사이즈가 아니면 메모리에 목숨걸 필요야 없겠지만 원칩 프로세서 등에서는 램 때문에 환장하는 경우가 많습니다;;

life is only one time

itsocool의 이미지

하나의 함수(클래스)를 분석할때 중간에 나타나는 생뚱맞은 전역 변수때문에

이곳 저곳 뒤적 거린 경험이 있으시다면 전역 변수 남발의 폐해를 아시리라 생각합니다.

특히 남이 짠 소스이거나 자기가 짰으나 오래되어 기억이 나지 않는 경우일때

게다가 주석도 없는 경우라면 중간에 불쑥 나타나는 전역 변수는 정말 난감 합니다.

언제나 먼저 고려해야할 대상은 사람이 아니던가?
안되면 대기하라.
즐길 수 없다면 피하라.

익명 사용자의 이미지

가독성과 이름공간의 문제뿐만아니라 전체 프로그램의 여기저기에서 전역변수를 설정하고 참조하고 있다면 프로그램이 어떤식으로 돌아가고 있는지 추적이 안됩니다. 그런 상황에서는 조그만 버그라도 하나 생기게 되면 거의 수정불가상태에 빠지게 됩니다.. 변수의 범위는 최소한으로~~!!

atie의 이미지

조금 다른 이야기일 수 있는데 ckbcorp님이 생각은 패턴의 Value Object를 적용한 것으로 이해가 되는군요. 저도 자주 쓰는 때가 있습니다. 이유는 질문에 적힌 것과 거의 동일하고요. 다만 자바를 쓰니 메모리 관리 등의 일은 GC가 해주는 거죠.

----
I paint objects as I think them, not as I see them.
atie's minipage

lovewar의 이미지

ckbcorp wrote:

전역 변수를 썼을 때는 ,

1. 프로그램의 가독성 저하(함수 안에서 선언 안 한 변수가 갑자기 튀어나오니까)
2. 이름 자원의 고갈(전역변수랑 같은 이름 써버리면 그 함수에서는 전역변수 못 쓰니까)

1.명제에는 명명규칙에 의해 사라질수 있습니다;
C언어로 프로젝트할때 가장 중요하다고 생각되는 부분이 명명 규칙입니다.
한사람이 하든 수백명이 하든 명명규칙만으로도 많은 발생가능한 애매성이 사라집니다.
명명 규칙에는 여러가지의 의미를 부여할 수 있습니다
(단순 헝가리안 표기법이 아닌 특정한 규칙이 필요합니다).

2. 명제에도 명명 규칙으로 해결됩니다.

-- 덧붙이는글 --

의미없이 넘길수 있는 부분이기에 많은 분들이 고민해 주시기 바랍니다.

댓글 달기

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