기본개념 : 시스템의 생명주기 , 포인터와 메모리할당
시스템의 생명주기
1. 요구사항
-프로젝트들의 목적을 정의한 명세들의 집합 (시스템이 어떤 기능을 수행해야하는지, 어떤 입력을 받아 어떤 출력을 내보내야하 하는지에 대한 정보를 기술)
- 입력과 출력에 관한 정보를 기술
2. 분석
- 문제들을 다룰 수 있는 작은 단위들로 나눔(요구사항을 바탕으로 문제를 작은 단위로 나누어 이해하고 해결방안을 모색한다)
- 상향식(bottom-up)/하향식(top-down)접근 방법
3. 설계
- 추상데이터 타입(abstract data type) 생성
- 알고리즘 명세와 설계 기법 고려
4. 정제와 코딩
- 데이터 객체에 대한 표현 선택
- 수행되는 연산에 대한 알고리즘 작성
5. 검증
- 정확한증명 : 수학적 기법들을 이용해서 증명
- 테스트: 프로그램의 정확한 수행 검증, 프로그램의 성능 검사
- 오류제거 : 독립적 단위로 테스트 후 전체 시스템으로 통합
포인터와 메모리할당
- 포인터란?
- 메모리 주소를 저장하는 변수이다.
- C언에서는 어떤 타입 T에 대해 T의 포인터 타입이 존재
- 포인터 타입의 실제값은 메모리 주소가 됨
- 포인터 타입에 사용되는 연산자
& : 주소연산자
*: 간접연산자
ex)
int i; // 정수 변수
int *pi; // 정수에 대한 포인터
pi = &i; // i의 주소를 pi에 할당
// i에 10을 저장하는 두 가지 방법:
i = 10; // 직접 할당
*pi = 10; // 포인터를 통한 간접 할당
직접할당과 포인터를 통한 간접할당의 차이점
1. 직접할당:
정의 : 변수에 값을 직접 할당하는 방법
예) int i = 10, 여기서 i라는 변수에 10이라는 값을 직접 할당한다.
특징 1. 변수의 이름을 사용하여 값을 할당한다.
2. 변수가 저장된 메모리 주소에 직접 접근하여 값을 변경한다.
2. 포인터를 통한 간접할당:
정의 : 포인터를 사용하여 변수의 메모리 주소를 참조하고, 그 주소에 값을 할당하는 방법이다.
예)
#include <stdio.h>
int i;
int *pi = &i // i의 주소를 pi포인터에 저장
*pi = 10; // pi가 가리키는 주소(즉, i의 주소)에 10을 할당
특징
1. 포인터를 사용하여 간접적으로 변수의 값을 변경한다.
2. 포인터가 가리키닌 메모리 주소에 값을 할당하므로, 포인터의 값(= 메모리 주소)이 올바르게 설정 되어 있어야한다.
3. 포인터를 사용하면 다른 변수의 메모리 주소를 참조하도록 변경할 수 있으므로 , 동일한 포인터를 사용하여 여러 변수의 값을 변경할 수 있다.
-> 포인터를 사용하면 다양한 변수나 메모리 영역에 접근하고 값을 변경 할 수 있다. 이는 동적 메모리 할당,배열,데이터 구조등에서 유용하게 사용된다.
null 포인터
- Null 포인터는 아무 주소도 가리키지 않는 포인터를 의미한다.
- C에서는 정수 '0'값으로 표현된다.
- 포인터가 NUll인지 아닌지는 포인터가 유효한 주소를 가리키고 있는지 확인하는데 중요하다.
널포인터에 대한 검사
#include <stdio.h>
int i;
int *pi = &i // i의 주소를 pi포인터에 저장
*pi = 10; // pi가 가리키는 주소(즉, i의 주소)에 10을 할당
if(pi == Null){
}// pi가 Null 포인터인지 확인
if(!pi){
} //pi가 Null 포인터인지 확인 (동일한표현)
- 포인터
(0) int ㅑ, *pi, j, *pj //각 변수들
(1)i = 10;
(2)pi = &i;
(3)j = *pi;
(4)pj = &j;
(5)*pj = 20;
-> 결과값
동적메모리할당
- 프로그램 실행 중에 메모리를 할당하는 기법이다. 프로그램이 실행되는 동안 필요한 만큼의 메모리를 할당하거나 해제할 수 있다.
- 동적메모리 할당의 특징
1. 유연성: 프로그램을 작성할 때 필요한 메모리의 정확한 크기를 알 수 없는 경우, 실행 중에 필요한 만큼의 메모리를 동적으로 할당할 수 있다.
2. 히프(heap)사용: 동적메모리는 히프라는 메모리 영역에서 할당된다. 히프는 프로그램의 스택과는 다르게 크기가 동적으로 변할 수 있는 메메모리 영역이다.
3. 메모리관리 필요: 동적으로 할당된 메모리는 프로그래머가 직접 해제해야한다. 메모리를 해제하지 않으면 메모리 누수가 발생하게 된다.
- C언어에서의 동적 메모리 할당
1. mallloc : 지정된 크기의 메모리를 할당한다.
int *arr = (int*)malloc(10*sizeof(int))
//10개의 정수를 저장할 수 있는 메모리 할당
2. free : 동적으로 할당된 메모리를 해제한다.
free(arr) // arr에 할당된 메모리를 해제
3. callo: 지정된 개수와 크기의 메모리를 할당하고, 0으로 초기화한다.
inr *arr = (int*)calloc(10, sizeof(int))
// 10개의 정수를 저장 할 수 있는 메모리를 할당하고 0으로 초기화한다.
4. realloc: 이미 할당된 메모리의 크기를 변경한다.
arr = (int*)ralloc(arr, 20*sizeof(int))
//arr의 크기를 20개의 정수를 저장할 수 있도록 변경