반응형

전체 글 2934

59. 정적 변수

프로그래밍하다보면 전체 영역에서 사용하지 않지만 값을 유지해야 할 때가 있죠. 이럴 때는 전역 변수로 선언하면 사용하지 말아야 하는 곳에서 사용하는 실수를 범하여 버그를 만드는 원인이 되기도 한답니다. 그렇다고 지역 변수로 선언하면 함수 호출했을 때 메모리를 할당하고 끝나면 해제해서 다시 호출했을 때 이전의 값이 사라져요. 이 때 정적 변수를 선언하여 사용하면 문제를 해결할 수 있어요. 정적 변수를 선언할 때는 static 키워드를 붙여서 선언해요. 정적 변수는 특정 블록 내부에 변수를 선언해도 프로그램 시작할 때 메모리를 할당하고 해제해서 값을 유지할 수 있어요. ◈ 정적 변수와 지역 변수를 비교하는 예 #include void Foo(); int main() { Foo(); Foo(); return ..

58. 지역변수

안녕하세요. 언제나 휴일, 언휴예요. 이번에는 지역변수에 관해서 알아보기로 해요. 지역 변수는 특정 블록에 선언한 변수예요. 지역 변수는 특정 함수를 구현하는데 임시적으로 값을 기억할 필요가 있을 때 사용하죠. 그리고 지역 변수를 위한 메모리는 변수를 선언한 함수를 호출하면 할당하고 함수가 끝날 때 해제한답니다. 여러분이 주의할 점은 지역 변수는 선언한 블록에서만 보인다는 것이예요. main 함수에 int 형식 변수 i를 선언하고 Foo 함수에서 변수 i를 사용하려고 하면 가시성이 없어서 컴파일 오류가 발생해요. 그리고 전역에 선언한 변수 이름과 같은 이름의 지역 변수를 선언하여 사용하면 지역 변수를 사용한답니다. 그리고 함수 내에서도 { }으로 블록을 지정할 수 있는데 블록에 변수를 선언하면 블록 내부..

57. 전역 변수

아시는 것처럼 C언어에서는 프로그램에서 관리할 데이터를 할당하고 관리하기 위해 변수에 관한 문법을 제공하고 있죠. C언어에서는 프로그램의 모든 함수에서 접근할 수 있는 전역 변수와 선언한 블록에서만 접근할 수 있는 지역 변수가 있어요. 그리고 이 외에도 정적 변수와 상수화 변수를 제공하는데 이들에 관해 하나 하나 살펴봅시다. 전역 변수 C언어에서는 변수 선언을 특정 블록 내부가 아닌 외부에 선언한 변수를 전역 변수라 불러요. 그리고 전역 변수는 프로그램 시작할 때 할당하고 프로그램 끝날 때 해제하며 프로그램 전제 영역에서 접근할 수 있죠. 예를 들어 50명의 국어 성적을 관리하는 프로그램이 있다고 가정할게요. 그리고 프로그램에 성적을 추가, 삭제, 조회, 전체 보기 메뉴를 제공합시다. 아마도 이 프로그램..

56. 매개변수 전달 원리

이번에는 함수 호출에서 종료까지 수행 원리를 간단히 알아볼게요. 함수를 호출하면 해당 함수의 지역 변수를 위한 메모리를 스택에 할당해요. 그리고 피호출 함수의 동작이 끝나면 호출한 함수의 다음 부분을 수행하는 것이 기본 동작이죠. main 함수가 시작하면 main함수의 지역 변수를 위한 메모리를 스택에 할당해요. 그리고 Add 함수를 호출하면 입력 인자를 복사한 후에 Add 함수의 지역 변수를 할당한 후에 복사한 값으로 초기화를 수행하죠. 그리고 함수의 return 문을 만나면 자신의 스택 영역 바로 밑(호출 함수 스택의 맨 위)에 반환 값을 설정해요. 그리고 자신의 스택 메모리를 해제한답니다. 호출 결과를 대입하는 구문에서는 자신의 스택 맨 위에 값(피호출 함수에서 return 문에 의해 설정한 값)으..

55. 프로그램 동작 원리

이번에는 CPU 내에서 어떻게 프로그램 코드가 동작하는지 간단히 알아볼게요. 프로그램을 실행하면 운영체제(O/S)는 프로그램 이미지를 메모리에 로딩하여 프로세스를 만들죠. 프로세스는 생성하면서 초기 작업을 수행하고 난 후에 개발자가 작성한 진입점 코드를 수행한답니다. 컴퓨터 CPU에는 수행할 코드 주소를 기억하는 PC(프로그램 카운터) 레지스터(CPU 내부의 데이터 기억 장치)가 있어요. CPU에서는 PC 레지스터에 있는 코드를 디코딩하여 수행할 명령어와 데이터를 분리하는 작업을 선행하죠. 그리고 ALU에서 실제 작업을 처리해요. ALU(Arithmetic Logic Unit, 산술 논리 처리 장치)는 산술 논리를 처리하는 장치예요. 그리고 ALU에서 처리한 결과를 범용 레지스터(데이터나 메모리 주소 등..

54. 프로세스 메모리 구조

이번에는 간단하게 프로그램 개발자들이 알아야하는 프로세스(실행 중인 프로그램) 메모리 구조를 알아볼게요. 프로세스의 주요 메모리는 크게 Text, Data, BSS, Stack, Heap으로 구분할 수 있어요. 프로그램의 코드는 Text 영역에 잡히고 전역 변수는 Data 영역에 잡히죠. 이 두 개의 영역의 메모리 크기는 컴파일 시점에 결정해서 프로세스 동작 중에는 크기가 변하지 않아요. 그런데 함수 호출에 의한 지역 변수나 호출 처리에 필요한 메모리는 런 타임(프로세스 동작 시)에 잡히죠. 피 호출 함수가 끝나면 호출한 함수로 복귀하고 자신의 메모리를 해제하기 위해 Stack에 잡혀요. 이 외에 앞으로 배울 동적 메모리 할당 함수 호출하면 Heap 메모리에 잡히죠. Text 메모리에는 프로그램에서 수행..

53. 프로그램 생명 주기

이 부분은 프로그램 개발자들에게 공통적으로 필요한 기반 지식이예요. 직접적으로 프로그래밍 작성 능력과 관련있는 내용은 아니예요. 하지만 전산 엔지니어로써 기본적으로 알면 여러 분야에서 도움이 되는 내용이예요. 이 책에서는 깊은 내용까지 들어가지 않고 간단히 소개하기로 할게요. 프로그램 생명 주기 실행 상태의 프로그램을 프로세스라 불러요. 따라서 프로그램 생명 주기보다는 프로세스 생명 주기라는 말이 더 적당할거예요. 편의상 프로그램 생명 주기라 할게요. 프로그램은 수행해야 할 코드를 메모리에 로딩(loading)하는 것에서 출발하죠. 로딩은 하드 디스크나 CD 등의 저장 장치에 있는 데이터를 프로그램의 메모리에 옮기는 작업을 말해요. 또한 프로그램전체 영역에서 사용할 수 있는 전역 변수를 위한 메모리를 할..

52. 함수 개요

소프트웨어를 만들 때 가장 많은 비용이 들어가는 것이 유지 보수 비용이라는 연구 결과가 계속 나오고 있어요. 그리고 점점 유지 보수 비용이 차지하는 비율도 높아지고 있답니다. 프로그램을 제작할 때 유지 보수 비용을 줄이는 여러 가지 방법이 있는데 그 중에 하나가 재사용성을 높이는 것이죠. 여러 프로그램에서 공통으로 사용할 수 있는 것들을 라이브러리로 만들어서 필요할 때 추가하여 사용하는 거예요. 여러 개의 컴포넌트(Component, 부품)로 만들고 필요한 부품을 결합하여 프로그램을 만들어서 재사용성을 높이기도 해요. 그리고 프로그래밍할 때 재사용성을 높이는 기본은 함수를 만들어 사용하는 것이예요. 대부분의 프로그래밍 언어에서는 알고리즘이 같을 때 함수를 만들어 필요할 때 호출하여 사용하는 문법을 제공한..

50. 인덱스 연산자

C언어에서는 포인터와 정수 사이의 더하기 연산 후에 간접 연산을 수행하는 것을 간단하게 인덱스 연산으로 표현할 수 있어요. 인덱스 연산자는 배열 선언에 사용하는 지시 연산자 [ ]와 기호가 같아요. 선언문 이외에서 포인터와 정수가 피연산자인 이항 연산자 [ ]를 인덱스 연산자라 불러요. 인덱스 연산은 상대적 거리에 있는 원소를 접근할 수 있어요. 인덱스는 상대적 거리를 나타내기 때문에 n 번째 원소에 접근하려면 n-1을 사용해야 한답니다. int arr[3]={1,2,3}; int *p = arr; int index = 0; 위와 같이 배열과 포인터, 기본 형식을 선언하였을 때 arr[index]와 p[index]와 같이 사용하면 *(arr+index), *(p+index)와 같은 표현이예요. 인덱스 연..

반응형