IT/자료구조

기본개념 : 시스템의 생명주기 , 포인터와 메모리할당

윤채니챈 2023. 10. 15. 09:23
728x90
반응형

시스템의 생명주기

 

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개의 정수를 저장할 수 있도록 변경
728x90
반응형