전체 : 4,150,784 명
어제 : 0 명
오늘 : 0 명

c++ 강좌 #3 변수와 상수 (1)

진혼이중주 | 2008.05.28 11:55 | 조회 8850

변수에 대해 정의를 해보자.

쉽게 말해 우리가 알고 있는 변수라는 개념은 변하는 수를 가르킨다.

하지만 여기서의 변수는 데이타의 접근과 변경을 가할수 있게 메모리 공간에 이름이 있는 수를 뜻하게 한다.

예를 들면 다음과 같은 수가 함수가 있다고 생각 해보자

int add_num(void)

{

int a ;

int b ;

a = 3 + 4 ;

b = a + 2 ;

return 0 ;

}

다음과 같은 함수와 있다고 생각 해보자

여기서 int a ;와 int b ; 는 변수의 선언을 하는거다.

즉 int라는 기본자료형의 데이터의 크기만큼 메모리 용량을 할당하고 거기에 a라는 이름을 붙이는 것이다. 물론 이렇게 하면 메모리공간에 4바이트의 용량을 차지하게된다.

우리는 add_num이라는 함수가 끝날때까지 a라는 이름을 통해 접근을 할수 있는 것이다. 조금 어렵게 느껴지는 분이 있을 수도 있지만 어려운게 아니라 생소 한 것뿐이다.

반대로 상수는 어떤가 ?

상수는 변할수 없는 숫자...

주로 여기서는 이름을 가지지 못한 데이타라고 할 수 있다.

a = 3 + 4 ;

b = a + 2 ;

3과 4그리고 2라는 숫자는 확실이 우리가 알수 있는 숫자이다.

a와 b는 우리가 만든 변수이다.

자세히 보면 첫번째 줄에서 3+4를 연산해서 a에 대입하고 있다

조금 연산식이 이상한가 ?

우리가 학교에서 배우는 연산식은

3 + 4 = a 가 정확할텐데 말이다.

하지만 c++언어에서 = 의 대입연산자의 결합성은 <- 방향으로 이루어지게 되어 있다.

이것은 다음에 연산자에 대해서 이야기를 할때 미루도록 하자.

여하튼 3과 4를 더해서 a라는 변수에 대입하고 있다. 이결과 a라는 이름의 메모리 공간은 7이라는 숫자로 채워질것이다.

그것을 그 다음 줄에서 a + 2라는 계산을 하게된다.

a는 7의 값을 가지고 있다. 그럼 당연히 a+2는 7+2라고 생각해도 좋다 7+2는 당연히 9가 될것이면 9라는 숫자를 통해 b라는 변수에 대입될것이다.

만약 변수가 없다는 이러한 식이 가능할것인가?

우리는 첫번째 줄에서 a라는 변수를 썼다. 그리고 두번째 줄에서도 a라는 변수를 썼다. 이것을 가능하게 한것은 이름이 있었기때문이다 바로 a라는 이름이 있었다.

반면 일반적인 숫자는 어떨가

첫번째 줄에서 썻던 3이라는 숫자를 그대로 가져와서 2번째줄 연산에 그대로 쓸수 있을까? 물론 3이라는 숫자를 다시 쓰면 될것이다.

하지만 첫번째 줄에서 3이라는 숫자와 두번째 줄에서 3이라는 숫자가 완벽히 같을까? 물론 데이터적으로 같다.

하지만 첫번째 줄에서 3이라는 숫자가 생성되고 그줄에서 소멸되어 버린다. 그리고 두번째 줄에서 3이라는 숫자를 쓸때 다시 메모리 공간이 생성되고 3이라는 숫자가 들어간다.

그결과 그둘은 틀려지게 된다. 그냥 동명이인을 생각 하면 된다. 첫번째줄에서 철수라는 사람이 있다면 두번째줄에서는 다른 철수라는 이야기이다.

포인터를 공부하면서 메모리의 구조를 공부하면 한결 이해하기 쉬워질것이다. 아직은 너무 먼 이야기이다.

사실 변수만해도 종류는 4가지이다.

전역변수(global 변수), 지역변수 (local 변수), 스태틱 변수(static 변수), 레지스터 변수(register 변수)

요렇게 4가지 이지만 레지스터 변수는 사실상 거의 쓰여지지 않으므로 무시해도 상관 없다.

스태틱 변수는 조금 난해한 이야기가 될수 있으므로 일단 다음으로 미루고

전역변수, 지역변수에 대한 이야기를 해볼까 한다.

쉽게 말하면 전역변수 지역변수는 그렇게 어렵지가 않다.

아까침에 예제에서 쓰였던 변수는 지역변수이다.

지역변수는

int main(void)

{

int a ;

return 0 ;

}

다음과 같이 함수 내부에 들어간 변수를 보통 지역변수라고 이야기 한다.

물론 이렇게 간단한것만은 아니지만 일단은 이정도만 알아도 큰 문제는 없다.

그다음 전역변수라는 것은 다음과 같이

int a ;

int main(void)

{

return 0 ;

}

다음과 같이 함수 밖에 선언되어 있는 변수가 전역변수라고 할수 있다.

전역변수와 지역변수의 차이점은 뭘까?

지역변수는 함수가 사라지면 사라지지만 전역변수는 프로그램이 끝낼때까지 살아 있다는 것이다.

함수의 종료가 곧 프로그램의 종료를 가르키는것이 아니냐고 반문 하는 사람이 있을 수 있다.

물론 main함수의 종료는 프로그램의 끝을 가르킨다.

하지만 프로그램에서 한개의 함수만 있을 거라 생각을 하는가.

프로그램이라고 해도 결국은 수많은 함수의 조합 객체지향의 꽃이라고 하는 클래스도 사실 따져보면

변수와 함수를 하나로 묶은 것 뿐이다.

전역변수는 모든 함수가 접근 할수가 있다.

그렇기에 편하기도 하고 단점이 될수도 있는 양날의 검이라고 할수 있다.

왜냐고 생각하는가? 모든 함수에서 접근할수 있으면 좋은것이 아닌가라고 생각하지만

실상은 함수가 많다고 생각 해보자 전역변수에서 하나의 오류가 발생됬으면 모든 함수에게 접근권이 있으니 전부 찾아봐야 하지 않겠는가??

그래서 전역변수는 필요한 경우가 아니면 아끼도록 하자.

twitter facebook me2day 요즘
좋은 강좌 감사합니다.잘 봤습니다^^
좋은 강좌 감사합니다.
잘 봤습니다^^
05.28 14:39 | COOLSOFT님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
잘 보았습니다...계속 좋은 강좌 부탁드립니다.. ^^

잘 보았습니다...

계속 좋은 강좌 부탁드립니다.. ^^

07.08 11:24 | 하하모야님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
강좌 잘봤습니다 ^^

강좌 잘봤습니다 ^^

07.17 16:49 | 점핑님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
진혼이중주님 글에 부가 설명을 하려구요..진혼이중주님께서 말씀 하셨다시피..
진혼이중주님 글에 부가 설명을 하려구요..

진혼이중주님께서 말씀 하셨다시피 전역변수와 지역변수의 차이점은 함수와 프로그램의 범위 차이입니다

왜 이렇게 범위를 다르게 설정했는데 전역은 살아 있고, 지역은 사라지냐면

둘의 메모리 영역이 틀립니다.

전역 변수는 데이터 영역에, 지역변수는 스택 영역에 생성되죠

데이터 영역은 프로그램이 끝날때까지 유지되는 반면

스택 영역은 함수가 끝날때 사용한 모든 것이 사라집니다

그렇다 보니 둘의 차이가 나는거죠..

참고로 프로그램의 메모리 영역은 데이터, 스택, 힙, 코드 영역이 있습니다.
07.24 17:49 | XYZ님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
감사합니다 ^^
감사합니다 ^^
08.02 05:34 | 하야니님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
감사합니다 잘보고가요

감사합니다 잘보고가요

08.12 22:10 | 리눅시아이님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
감사합니다^^
감사합니다^^
08.20 13:59 | Zune님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
잘 보고 갑니다 ^^
잘 보고 갑니다 ^^
09.19 08:27 | QualityC님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
잘보고 갑니다.~~
잘보고 갑니다.~~
11.04 02:50 | 달봉님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
c++강좌 더 안올라 오나요 ㅎ
c++강좌 더 안올라 오나요 ㅎ
02.18 09:42 | 물티슈님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
좋은 강좌 감사합니다..
좋은 강좌 감사합니다..
02.27 22:00 | 꼴딱님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
갑사합니당
갑사합니당
04.07 19:30 | 소프레스님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
XYZ님 설명 중에 전역변수가 코드 영역에 생성된다고 하셨는데,코드 영역..
XYZ님 설명 중에 전역변수가 코드 영역에 생성된다고 하셨는데,
코드 영역을 데이터 영역까지 포괄해서 말씀하신거였나요?


http://danamoni.tistory.com/tag/%EC%8A%A4%ED%83%9D

여기에서 참고했습니다.
04.15 20:58 | 아키님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
제가 잘못 적었네요..정확한 분류가 조금씩 다르게 적혀 있긴한데아키님께서..
제가 잘못 적었네요..
정확한 분류가 조금씩 다르게 적혀 있긴한데
아키님께서 참조하신 곳을 기준으로 보면
데이터 영역에는 전역 데이터 영역(Global)과 정적 데이터 영역(static)으로 나누구요..
텍스트 영역을 코드 영역으로 보면 되겠네요.. 더이상의 변경이 불가하고 참조만을 하는 영역..
전역 데이터 영역은 말 그대로 전역 변수들을 저장하구요, 정적 데이터 영역은 static으로 생성한 모든 변수를 말합니다.
다른 영역(힙, 스택)은 적혀있는 그대로 이해하시면 되겠네요.

위에 글을 맞게 수정할께요..
04.22 17:13 | XYZ님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
잘봤습니다.

잘봤습니다.

12.06 19:06 | HooLi님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
댓글쓰기 - 로그인한 후 댓글작성권한이 있을 경우 이용하실 수 있습니다.

비밀번호 확인

댓글 등록시에 입력했던 비밀번호를 입력해 주세요.
87개(1/5페이지)
rss
C
번호 제목 작성자 작성일 조회
87 배열설정 쉽게하기 부보 2012.12.22 2089
86 [고급]연습문제[11] 권율 2010.01.10 9548
85 [고급]C언어에서 포인터 이용한 간단한 암호 ~[8] 쫭구 2009.11.11 9377
84 [중급]BOF의 개념과 BOF를 이용한 해킹 방법[10] Ezbeat 2010.03.19 10142
83 [중급]ReadProcessMemory & WriteProcessMemory사진[8] COOLSOFT 2009.06.04 9939
82 [기초]C언어의 탄생 배경[20] COOLSOFT 2007.11.03 9980
81 [기초]비주얼 C++ 설치하기사진첨부파일[15] COOLSOFT 2007.10.27 7152
80 [기초]Microsoft Visual C++ Windows Applications by Example첨부파일[4] COOLSOFT 2009.04.03 7322
79 [기초][TIP]swap함수 매크로 한줄로 끝내기[9] secretofsh 2009.03.05 10502
78 [기초]c# 화면캡쳐프로그램 -소스포함 |첨부파일[12] 야옹이 2008.12.25 12855
77 [기초]주민번호를 만들어내는 규칙에 대해서 설명과 소스[26] COOLSOFT 2008.07.12 10105
76 [기초]윈도우 기본 창 생성 소스 -주석 포함-[7] 진혼이중주 2008.05.31 10797
75 [기초]WIN 32 API 시작하기전에 간단히 알아두기[10] 진혼이중주 2008.05.31 9385
>> [기초]c++ 강좌 #3 변수와 상수 (1)[15] 진혼이중주 2008.05.28 8851
73 [기초]C++ 강좌 #2 C++언어의 기본적인 구조[6] 진혼이중주 2008.05.28 5968
72 [기초]C++ 강좌 #1[12] 진혼이중주 2008.05.28 6743
71 [기초]리스트 자료구조의 기본적인 개념[3] 진혼이중주 2008.05.16 7972
70 [기초]두 자리 수 이상의 곱셈에 대한 알고리즘[5] 진혼이중주 2008.05.16 7199
69 [기초]Turbo 2.0 설치 및 사용법첨부파일[2] 진혼이중주 2008.05.16 8862
68 [기초]삼성 프로그래머들의 C/C++ 코딩 스타일의 지침서첨부파일[41] 진혼이중주 2008.05.05 15442
처음페이지이전 10 페이지12345다음 10 페이지마지막페이지