본문 바로가기
Python/Python 기초

[개발로그 Python] 변수 - No.4

by 마이자몽 🌻♚ 2021. 6. 2.

Python 3.9.5 버전을 사용

변수가 무엇인가?

x = 100
y = 20.5

 위의 예시 처럼 x 와 y가 변수 입니다. 프로그래밍을 해보지 않아도 x라는 변수는 100이고 y라는 변수는 20.5라는 값으로 사용한다는 것을 알 수 있습니다. 우리는 수학적으로 "=" 등호 기호가 "같다"라는 의미로 배워서 본능적으로 알고 있는거죠. 그래서 만약 "x + y 의 결과가 어떻게 되나요?"라고 질문하면 "120.5 입니다!"라고 당당하게 답할 수 있을 것 입니다. 

 

 그런데 프로그래밍에서 등호(=) 기호가 "같다"라는 의미가 아니라 "대입한다"의 의미를 갖고 있습니다. "x + y"와 같은 연산은 "같다"라는 의미로 해석해서 사용해도 큰 문제는 없을 만큼 프로그래밍할 때 변수를 사용하는 것은 쉽습니다. 하지만 변수를 이해하기 위해서는 여러 배경지식이 필요합니다.

 

 

변수를 이해하기 위해 메모리를 알아야한다.

  메모리를 꼭 알아야하는 이유는... 변수가 값을 어디서 어떻게 저장하고 읽어오는지를 이해하기 위해서 입니다.

 

 컴퓨터를 구매할 때 사양을 비교해본적이 있으실겁니다. 일반적으로 CPU, 메모리와 저장 용량을 비교하는데... 왜 메모리는 HDD나 SSD같은 저장장치보다 용량의 수치가 적은지 궁금해 해보신적 있으신가요?

 

 메모리와 하드디스크 모두 데이터를 저장하는 매체입니다. 두 저장매체의 차이점을 비교해보면 하드디스크는 느리지만 데이터가 영구적(비휘발성)이고 메모리는 빠르지만 데이터가 비영구적(휘발성)인 특징을 갖고 있어 사용용도가 조금씩 다릅니다. 아무래도 연산에 있어서 저장용량 보다는 속도가 빠른 것이 중요하다보니... CPU처럼 빠른 일처리가 필요한 장치에 임시적으로 데이터를 저장하는데 사용됩니다. 예를 들어 프로그램이 실행되는 동안에 변수와 같이 필요한 정보를 저장하고 읽는데 사용되는 리소스가 바로 메모리입니다.

 

Python의 모든 것이 오브젝트(객체)이다. (feat. 메모리 구조 & 기본 타입 변수)

Python은 다른 언어들과 다른 특별한 특징이 하나 있습니다. 이 특징으로 인해 다른 언어들에는 있는 변수 타입 정의에 대한 문법이 Python에서는 굉장히 자유롭습니다.

 

 

Everything is Object
모든 것이 오브젝트(객체)이다.

 

 

Python에서는 정수, 실수, 문자열, 함수 등 모든 것이 객체로 구현되어 있다고 합니다.

 

아직 변수를 배우는 단계에서는 객체를 몰라도 되지만... 간단하게 예를 들어보겠습니다.

 붕어빵 장사를 하는데 여러가지 맛과 색의 붕어빵을 만들고 싶습니다. 그래서 맛과 색 두 가지 속성을 갖고 다양하게 섞어서 여러 종류의 붕어빵을 만들어서 팔기로 했습니다. 팥 맛 주황색 붕어빵, 크림 맛  주황색 붕어빵, 포도 맛 빨간색 붕어빵, 크림 맛 빨간색 붕어빵을 만들었습니다. 이렇게 만들어진 붕어빵이 각각 객체 입니다. 프로그래밍한다고 했을 때 하나의 붕어빵 틀을 만들어 놓고 다양한 속성들을 갖고 있는 붕어빵이라는 결과물을 만들어 냈습니다. 이 결과물이 곧 객체입니다. 지금은 "객체는 만들어진 결과물이다" 정도로만 이해해도 될 것 같습니다.

 

 그럼 다시 본론으로 돌아와서... Python에서는 모든 것이 객체라는데 변수랑은 무슨 상관인가요? 이 것을 이해하기 위해 메모리의 구조와 기본 타입 변수라는 것을 알아야합니다.

 

Python과 다른 언어의 메모리 구조

개발자가 코딩한 작업을 실행할 때 Memory를 사용합니다. 위에서 얘기 했듯이... 변수와 같은 데이터를 임시적으로 저장하기 위해 메모리를 사용하죠. 그런데 이런 메모리는 전체적으로 봤을 때 하나이지만... 내부적으로는 공간을 나눠서 사용합니다.

 일반적으로 모든 프로그래밍 언어에서 Memory의 구조안에 크게 Stack과 Heap이라는 영역이 존재합니다. 영역을 나눠서 사용하는 이유는 메모리의 접근 속도가 향상되고 관리가 용이하기 때문입니다. 우리가 옷장에 옷의 종류에 따라 정리하면 찾기도 쉽고 관리도 편해지는 것 처럼... 메모리도 이와 같이 관리한다고 합니다.

 

 그럼 Python의 메모리 구조는 다른 언어들과 뭐가 다를까요? 사실 구조는 동일합니다. 다른 것은 메모리에 저장하는 데이터가 다르다는 점 입니다.

 

변수를 배우는 단계이니 Stack과 Heap에 대해 깊게 들어가지 않겠습니다. 그냥 알아둬야할 것은 C나 Java에서는 기본타입 변수의 값이 Stack 메모리에 저장되는 반면 Python에서는 Stack의 모든 변수가 값이 아닌 객체의 메모리 주소(heap)가 저장된다는 것이 핵심 입니다.

 

기본 타입 변수

위는 Java의 기본 타입 변수 입니다. Java와 Python의 코드를 보고 비교해보겠습니다.

 

Java

int x = 100;
double y = 20.5;

 

Python

x = 100
y = 20.5

 

우선 코드를 눈으로 봤을 때 Java의 경우 int, double과 같은 키워드를 변수명 앞에 붙여 줬는데 Python은 없습니다. 이러한 키워드는 변수가 기본타입이라는 것을 명시하기 위함입니다. 정수, 소수, 부울(참/거짓)과 같이 8byte이내로 0과 1로 표현을 바로 할 수 있는 타입을 기본타입이라고 하는데요....  내부적으로 변수에 값을 할당할 때 Java에서는 Stack 메모리에 해당 타입의 크기(ex  int : 4 byte, double : 8 byte)만큼 공간을 할당해주고 값을 저장한다.

 

Java에서 x의 경우 Integer이기 때문에 4byte를 할당해주고 해당 공간에 0과 1을 사용해서 100이라는 값을 만들어 줍니다. 여기서 중요한건 기본타입은 Stack 메모리에 값을 저장한 것입니다.

 

 Python의 경우... Stack 메모리에 있는 변수에 값을 할당하지 않습니다. 모든 것은 객체로 되어 있기 때문에 Stack 메모리에 객체의 주소를 저장합니다. x의 값은 100 객체의 주소가 될 것이고 주소를 따라가 값을 사용합니다. 이렇게되면 다른 두개의 변수에서도 같은 객체를 참조할 수 있게 됩니다.

 

Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 100
>>> print(id(x))
2317298587088
>>> y = 100
>>> print(id(y))
2317298587088
>>> print(id(100))
2317298587088

id 함수는 변수의 메모리 주소를 출력해주는 함수입니다. 숫자 100과 x, y변수에 할당한 100의 메모리 주소가 모두 같은 것을 확인할 수 있습니다. 이런 결과를 봤을 때 Python에는 모든 것이 객체로 되어 있다는 것을 확인할 수 있습니다.

 

 Python에서 변수는 값을 저장하는 것이 아니라 메모리의 주소를 기억한다는 것이 핵심입니다.

 

그래서... 메모리 구조도 배웠고... 기본타입도 배웠고... 메모리 주소를 기억한다는 것은 알겠는데...

그런데 변수는 왜 쓰는건데....;;

막상 변수를 왜 사용하는지에 대해서는 아직 다루지 않았습니다... ㅎㅎ

 

변수는 데이터 값을 저장한 곳을 가리키는 이정표

변수는 우리가 메모리의 주소를 쉽게 사람이 읽을 수 있도록 편의를 위해 사용됩니다.

음식 배달을 한다고 가정해보겠습니다. 고객이 배달 주소를 "남산타워 아래 빨간 지붕"이라고 하면... 배달하는게 쉽지 않은 일일 겁니다. 그럼 "서울 용산구 남산공원길 105" 처럼 주소를 알려주면 어떨까요? 이전보다 훨씬 편하고 빠르게 배달을 할 수 있을 겁니다. 변수를 사용하는 이유도 똑같습니다.

 

 

 

Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 100
>>> print(id(x))
2317298587088
>>> print(id(100))
2317298587088

 위 예제는 변수 x와 100이라는 값의 메모리 주소를 출력하는 코드입니다. 보시면 모두 같은 메모리 주소를 바라보는 것을 확인할 수있습니다. 우리가 100이라는 값을 사용하기 위해서 "2317298587088" 처럼 긴 숫자의 메모리주소를 기억해서 사용할 수 있을까요? 만약 이런 식으로 개발을 해야했다면 아마 개발을 관뒀을 것 같습니다. 이런 불편함을 해결하기 위해 변수를 이용해 메모리의 주소를 사람이 읽을 수 있는 쉬운 방법으로 표현해서 사용합니다.

 

 

Python 변수의 사용

이제 변수에 대한 기본을 모두 살펴봤고... 실제로 사용하는데 있어서 유의해야할 사항들을 알아보겠습니다.

# 가능한 변수 명명
test = 1
_test = 1
Test = 1

# 불가능한 변수 명명
False = 1
as = 1
123test = 1
asd!@# = 1

Python의 변수를 선언하는데 몇가지 규칙이 있습니다.

  • 변수의 첫 글자는 영문 대소문자 혹은 언더바를 사용할 수 있습니다.
  • 나머지는 숫자, 영문자 그리고 언더바만 사용할 수 있습니다.
  • 대소문자를 구분합니다.
  • Python의 예약어는 사용할 수 없습니다.(아래의 표 참조)

 

위에서 설명했듯이 Python에는 기본타입이 없고 모두 객체로 되어 있기 때문에 타입을 명시해줄 필요가 없고 변수명과 값 사이에 등호를 이용해서 선언해줄 수 있습니다.

 

변수 표기법

주로 많이 사용하는 표기법은 아래와 같습니다.

 

카멜 표기법(camel case)

  • resultStatusForDays
  • connectionVendor
  • tableName

낙타의 등처럼 생겨서 지어진 이름이고 첫 단어는 소문자로하고 단어와 단어의 구분을 대문자로 합니다.

 

스테이크 표기법(snake case)

  • result_status_for_days
  • connection_vendor
  • table_name

언더바가 뱀처럼 생긴데서 지어진 이름이고 모든 단어를 소문자로하고 단어와 단어의 구분을 언더바로 합니다.

 

python에서는 주로 스네이크 표기법을 사용합니다.

 

 

여러가지 사용 예시

# 문자열 변수 선언
text = 'hihi' # 작은 따옴표 사용
text = "hihi" # 큰 따옴표 사용

# 여러 줄 사용
text = ''' 
hihi
hihi
'''
text = """
hihi
hihi
"""

# 숫자 변수 선언
num = 10 # 정수
num = 10.5 # 소수


# 논리 변수 선언
yes = True
no = False


# 여러 변수 한가지 값으로 선언
x = y = 10


# 여러 변수 다른 값으로 선언
x, y = 1, 2

 

 

정리

  • 프로그래밍에서 등호(=) 기호가 "같다"라는 의미가 아니라 "대입한다"의 의미
  • Python에서는 모든 것이 객체로 구현되어 있다
  • 모든 것은 객체로 되어 있기 때문에 변수에 메모리에 값이 아닌 객체의 주소를 저장
  • 변수는 우리가 메모리의 주소를 쉽게 사람이 읽을 수 있도록 편의를 위해 사용
  • 변수를 선언하는데 규칙이 있다
  • python에서는 스네이크 표기법을 주로 사용한다.

 

 

 이렇게 변수에 대해서 알아봤습니다. 실습보다는 이론적인 내용이 더 많았는데... 매우 중요한 부분이니 꼭 이해하고 넘어갔으면 좋겠습니다. 비전공자들이 프로그래밍을 처음 할 때... 이런 개념이 쉽지 않아서 실습을 먼저 진행하는 경우가 많습니다. 그러는게 좋은 방법일 수도 있지만... 정말 안좋은 습관인게.... 넘어가도 처음에는 변수를 사용하는데 아무런 문제가 없어서 대충 알아도 되는 개념으로 느껴질 수 있습니다. 저도 그랬고... 큰 벽에 부딛혀 다시 공부하게 되었습니다. 취업 면접에서 기본을 확인하기 위해 물어보는 질문들입니다. ㅎㅎ 변수를 이해하고 사용해야합니다. ㅎㅎ

 

 변수는 작성될 모든 Python관련된 글에서 사용하게될 것 입니다. 사용하는데 있어서 타입이나 scope처럼 알아야할 내용들이 많은데요... 다른 개념들을 소개 및 실습하면서 변수의 사용방법을 자연스럽게 익힐 수 있도록 구성해보겠습니다. 

 

 이번 글에서는 변수를 이해하는데 집중했고 간단하게 정의하는 방법 정도를 알아봤습니다.

댓글2