파이썬 자료구조/알고리즘 03 : 파이썬과 C언어의 변수 저장 방식 차이

728x90

파이썬과 C언어의 변수 저장 방식 차이

 

C언어

메모리 공간을 할당받고 값을 집어넣어서 사용한다.

 

방식 1 : 정적 메모리 할당

컴파일시 고정된 크기/타입의 메모리 공간을 할당받아서 사용 가능.(스택 공간)

크기가 정해지면 중간에 바꿀 수 없음

소멸시 운영체제가 자동으로 메모리를 반납

 

int a = 0;

 

a라는 변수가 int형 크기만큼 메모리 공간을 할당받아서 0이라는 값을 넣음.

프로그램 종료시 운영체제가 자동으로 메모리 반납

 

방식 2 : 동적 메모리 할당과 포인터

런타임에 원하는 크기/타입의 메모리 공간을 만들고, 그 공간을 가리키는 주소를 포인터 변수에 저장하여 사용.(힙 공간)

포인터 변수는 주소를 가리키는 변수.

소멸시 메모리 반납을 수동으로 해줘야 함.

 

char *str = NULL;           # 포인터 변수 생성
str = (char*) malloc(20)    # 메모리 할당
free(str)                   # 메모리 해제

 

파이썬 

파이썬의 함수, 데이터, 클래스, 모듈, 패키지등을 모두 객체로 취급한다.

객체(object) : 어떠한 속성 값과 행동을 가지고 있는 데이터. 함수와 변수(데이터)를 함께 묶는 방법.

 

자동차가 사전적 의미로만 존재하는 것이 아니라 디자인, 차량 번호, 제조사, 모델명과 같은 정보와 탈 수 있고 움직이는 행동을 할 수 있는 물체로 묶어서 표현할 수 있다. 이처럼 정보와 행위를 묶은 데이터를 하나의 자동차 객체로 볼 수 있다.

 

문자 a를 파이썬에서 객체화 시키는 방법을 예시로 들면 파이썬은 단순하게 a라는 문자를 표현만 할뿐아니라, a라는 문자 자체를 객체로 만들어 다양한 속성과 행동을 넣어줄 수 있다.

a.upeer는 소문자a를 대문자로 바꿔주고,

a.join은 다른 문자들을 a로 묶어서 연결시킬 수 있다.

 

이러한 객체들이 가진 속성중에 상태들은 value, attribute라고 부르며, 행동들은 method라고 부른다.

이러한 프로그래밍 기법을 객체 지향 프로그래밍이라고 하며 모든 것을 단순히 값이나 하나의 정보가 아니라 객체로 취급하는 것이 파이썬의 특징이라고 할 수 있다.

 

모든 객체는 자료형, 메모리, 식별 번호를 가진다.

 

C언어의 경우 

int n = 17;

17의 값을 변수 n에 대입

따라서 여기서의 n은 17이라는 int형 값이 들어있는 객체라고 할 수 있다.

 

파이썬의 경우

n = 17

17이라는 int형 객체를 n이라는 이름으로 참조하고 있다.

따라서 파이썬에서의 변수는 값을 저장하고 있는 것이 아니라 단순히 이름으로 객체를 참조하고 있는 것에 불과하다.

만약 n의 값이 다른값으로 갱신되면 새로운 값을 갖는 객체가 생성되고, 그 값을 n이 참조하게 되는 것이다.(변수는 이름에 불과하다.)

 

for i in range (5):
    print(f'i = {i}     id(i) = {id(i)}')
결과 >
i = 0 id(i) = 2405554088208
i = 1 id(i) = 2405554088240
i = 2 id(i) = 2405554088272
i = 3 id(i) = 2405554088304
i = 4 id(i) = 2405554088336

i값이 달라짐에 따라 참조하는 곳이 갱신된다는 것을 확인할 수 있다.

 

 

n = 1				# 전역변수 (함수 내부 외부에서 사용)
def put_id():	
    x = 1			# 지역변수 (함수 내부에서만 사용)
    print(f'id(x) = {id(x)}')
    
print(f'id(1) = {id(1)}')
print(f'id(n) = {id(n)}')
put_id()
결과 > 
id(1) = 2213306460464
id(n) = 2213306460464
id(x) = 2213306460464

C언에서는 함수 내부에 선언한 지역변수가 함수가 실행될 때 생성하고 종료될 때 소멸되지만, 파이썬의 객체는 함수와 무관하게 존재한다. 

함수 외부에 있는 전역 변수 n과 내부에 있는 지역 변수 x가 모두 1이라는 int형 객체를 참조하고 있으며 객체가 따로 소멸되거나 생성되지 않았기 때문에 1, n, x의 식별 번호가 일치한다는 것을 알 수 있다.

이름만 다를뿐이지 같은 객체를 참조하고 있다.

 

 

728x90