[질문] 글로벌 변수를 쓰면 않좋은 이유를 혹시 아시나요??

kkamagui2000의 이미지

안녕하십니까 까마굽니다 (__)

제가 오늘 선배랑 이야기 하다가..

OOP에서 글로벌 변수를 쓰기를 꺼려한다는 이야기를 들었는데요..

이유가 궁금합니다.. 글로벌 변수를 사용하면 잃는 부분이 있는가요??

저는 글로벌 변수 사용에 별로 거부감을 가지고 있지 않거든요..

이유가 있나요??

그럼 좋은하루 되세요 (__)

seoleda의 이미지

kkamagui2000 wrote:
안녕하십니까 까마굽니다 (__)

제가 오늘 선배랑 이야기 하다가..

OOP에서 글로벌 변수를 쓰기를 꺼려한다는 이야기를 들었는데요..

이유가 궁금합니다.. 글로벌 변수를 사용하면 잃는 부분이 있는가요??

저는 글로벌 변수 사용에 별로 거부감을 가지고 있지 않거든요..

이유가 있나요??

그럼 좋은하루 되세요 (__)

글쎄요.. 비유가 적절할진 모르겠지만,

글로벌 별수를 사용하는 것은 화장실 벽에 낙서하는 것과 비슷하다고 생각합니다.

만일 제가 중요한 사항을 화장실 벽에 기록했다면, 그 내용은 누구라도 지우거나, 수정할 수 있습니다. 나중에 제가 같은 곳에 가서 그 내용을 확인 했을때,
그 내용이 내가 예전에 썼던 그 내용과 완전히 동일 하다고 보장 할 수 있을까요?

liongo의 이미지

OOP개념의 책을 보면 마니 나오는 내용입니다만..

모 간단히 이야기하면 의존성이겠지요..

Class로 만들고 그걸 오브젝트 개념으로 접근을 하고

사용을하기때문에 Class <-> Global 변수와는..

관계를 만드는것은 거의 불필요한관계라고 볼수있지요..

의존성이 생기면 그것은 캡슐화나 재활용성에 대해..

위협을 가하는 요소가 되니까요, 보통 그런코드들은

버그를 유발하는경우도 꽤 됩니다 ^^;;

역시 머리속으로 개념을 이해하고 감을 잡고있는거랑

또 설명을하는거랑은 엄청난 차이네요.. 휴우 객체지향은

깨달음이 중요하지요..

' 형식이 내용을 규정한다. '

지리즈의 이미지

제 경험상으로는
OOP의 3가지 원칙중에 은폐성에 위배가 되기 때문입니다.

글로벌 변수들은 보호받지 못하죠...

There is no spoon. Neo from the Matrix 1999.

세벌의 이미지

OOP가 아니라도 글로벌 변수는 되도록 쓰지 않는 게 좋습니다. 문제가 생기면 어디서 이 변수를 건드렸는지 찾기 힘들기 때문이죠.

dudungsil의 이미지

작은 프로젝트면 상관없어요. 오히려 적당한 글로벌 변수는 프로그램을 아주 쉽게 만들죠. 그래서 글로벌 변수의 유혹을 이기기 힘든거구요.

근데 파일이 좀 많아지고 프로젝트가 커지면 글로벌 변수는 독약입니다. 말그대로 소스의 모든 부분에서 그 변수를 건드릴수 있기 때문에 sebul님 말씀대로 역학조사가 아주 어려워 지죠.

산넘어 산

alsong의 이미지

소스가 방대해지면 가독성이 떨어 집니다.
사람의 기억력은 한계가 있기때문에 나중에 .......

프로그램을 짜면서 global변수의 거부감은 가지지 않아도 관계 없습니다.
그러나 여러 파일에서 global변수를 access하는데 대해서는 거부감을 가지시는게 ...

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

운형의 이미지

소스 코드 여기 저기서 접근가능 하다 !?

Quote:

글로벌 별수를 사용하는 것은 화장실 벽에 낙서하는.... 누구라도 지우거나, 수정할 수...

어떻게 내가 만든 프로그램의 변수를 아무나 와서 바꾸죠..?

OOP의 개념에 위배된다.

Quote:

OOP의 3가지 원칙중에 은폐성에 위배...

절차 지향 언어인 C를 사용해 코딩을 하는데, 객체지향의 원칙이 왜 나오죠.?

등등등.. (딴지 걸려구 했던거 아니니 기분들 상하지 마시길...)

1. 전역변수에 문제가 생기면 어디서 잘못됬는지 즉 어느 부분에서 이값을 바꿨는지 찾기 힘들다.
2. 프로젝트의 규모가 커지고 참여 인원이 늘어 나면 name space pollution 우려가 있다.
3. 코드(함수) 재활용을 어렵게 만든다.

1번의 경우 여러 분들이 지적을 했습니다.

2번 경우, 외부에서 제작한 오브젝트 파일을 가져다가 쓸때, 간혹 일어 나는데, 원인 찾기가 힘듭니다.

3번경우, 어떤 프로젝트에서 전역변수를 사용하는 함수가 있다면, 다른 프로젝트에서 이 함수를 그냥 가져다 쓰기 힘들 겁니다. 전역변수를 사용하는 함수는 거의 해당 프로젝트에서만 사용가능 하죠.(머 비슷한 예로.. 함수가 다른 함수를 호출 할경우도 그렇죠. 이런경우를 라이브러리로 만들지 않겠죠.)

지금 진행 중인 프로젝트에서 제가 확인한 전역변수 갯수가... ㅎㅎ 상상을 초월합니다. 전역변수를 사용하면서도 문제를 줄일수 있는 방법이 있더군요.

기능에 따라 계층모델을 만들고... 각 계층은 정해진 인터 페이스만으로 데이터를 주고 받는 다는... 함수 재활용쪽을 빼고는 언급되었던 부분의 문제들은 상당히 줄어 들더군요.

Do you think that's the air you are breathing now?

alsong의 이미지

Quote:
절차 지향 언어인 C를 사용해 코딩을 하는데, 객체지향의 원칙이 왜 나오죠.?

Quote:
OOP에서 글로벌 변수를 쓰기를 꺼려한다는 이야기를 들었는데요..

질문자님께서 OOP에 관한 언급을 하셔셔 나온것 같군요.
C라고 한분은 아무도 없으신데.. 또 c라고 하더라도 oop가 나올수 있습니다.
절차지향이지 절차만 된다라고 못 박을 수 없고요.

Quote:
지금 진행 중인 프로젝트에서 제가 확인한 전역변수 갯수가... ㅎㅎ 상상을 초월합니다. 전역변수를 사용하면서도 문제를 줄일수 있는 방법이 있더군요.

기능에 따라 계층모델을 만들고... 각 계층은 정해진 인터 페이스만으로 데이터를 주고 받는 다는... 함수 재활용쪽을 빼고는 언급되었던 부분의 문제들은 상당히 줄어 들더군요.

말씀하신 부분자체가 상당부분 글로벌 변수의 기능을 제한하고 있는겁니다.
기능의 일부를 제거(개발자 수준에서)해서 문제가 줄어든겁니다.
상당부분 문제가 준만큼 글로벌 변수가 문제점이 있다는 거죠..

추가로

Quote:
2. 프로젝트의 규모가 커지고 참여 인원이 늘어 나면 name space pollution 우려가 있다.

이부분의 간혹 일어났다 말씀하시는데 개발시에 각 개발자들간에 변수에대한 조율을 했기 때문에 발생을 하지 않았을 가능성이 높습니다.
global변수를 사용하지 않는다면 이에 대한 변수 조율을 위한 overhead가 발생하지 않겠죠.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

atie의 이미지

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

youlsa의 이미지

글로벌 변수를 쓰면 reentrant하지 않기 때문에 그런 이유도 큽니다.

=-=-=-=-=-=-=-=-=
http://youlsa.com

ㅡ,.ㅡ;;의 이미지

운형 wrote:
소스 코드 여기 저기서 접근가능 하다 !?

Quote:

글로벌 별수를 사용하는 것은 화장실 벽에 낙서하는.... 누구라도 지우거나, 수정할 수...

어떻게 내가 만든 프로그램의 변수를 아무나 와서 바꾸죠..?

OOP의 개념에 위배된다.

Quote:

OOP의 3가지 원칙중에 은폐성에 위배...

절차 지향 언어인 C를 사용해 코딩을 하는데, 객체지향의 원칙이 왜 나오죠.?

등등등.. (딴지 걸려구 했던거 아니니 기분들 상하지 마시길...)

1. 전역변수에 문제가 생기면 어디서 잘못됬는지 즉 어느 부분에서 이값을 바꿨는지 찾기 힘들다.
2. 프로젝트의 규모가 커지고 참여 인원이 늘어 나면 name space pollution 우려가 있다.
3. 코드(함수) 재활용을 어렵게 만든다.

1번의 경우 여러 분들이 지적을 했습니다.

2번 경우, 외부에서 제작한 오브젝트 파일을 가져다가 쓸때, 간혹 일어 나는데, 원인 찾기가 힘듭니다.

3번경우, 어떤 프로젝트에서 전역변수를 사용하는 함수가 있다면, 다른 프로젝트에서 이 함수를 그냥 가져다 쓰기 힘들 겁니다. 전역변수를 사용하는 함수는 거의 해당 프로젝트에서만 사용가능 하죠.(머 비슷한 예로.. 함수가 다른 함수를 호출 할경우도 그렇죠. 이런경우를 라이브러리로 만들지 않겠죠.)

지금 진행 중인 프로젝트에서 제가 확인한 전역변수 갯수가... ㅎㅎ 상상을 초월합니다. 전역변수를 사용하면서도 문제를 줄일수 있는 방법이 있더군요.

기능에 따라 계층모델을 만들고... 각 계층은 정해진 인터 페이스만으로 데이터를 주고 받는 다는... 함수 재활용쪽을 빼고는 언급되었던 부분의 문제들은 상당히 줄어 들더군요.

C 라하더라도 구조화를 하기위해선 오토변수쓰는게 좋습니다.
전역이 유리한점은 함수간의 값의전달이 불편하다는것인데 구조화가 잘되면
전역보다 오토변수가 훨씬편하다는걸 느낍니다.
재귀적호출구조나 함수재사용측면만보더라도 전역은 있어서는 안될존재입니다

함수하나에 if 문을 수없이 나열하는식의구조는... NO 입니다.


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

댓글 달기

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