본문 바로가기

개발자/파이썬 Python

파이선 변수. 리얼파이선 5

반응형

 

 

 

앞에서 변수, 연산, 제어, 함수에 대해 설명했습니다. 본론으로 들어가 변수에 대해서 배워보겠습니다. 변수란 어떤 프로그램에서 사용하는 특정한 내용물(값)을 담는 그릇입니다. 프로그램이 실행하는 동안 유지되기도 하고 중간에 사라지기도 하고, 내용물(값)이 바뀌기도 하고, 다른 데이터 타입으로 변경되기도 하고, 값이 이동하고, 카피되고, 업데이트되고, 증가되고, 감소되는 등 어떤 형태의 값이든 상관없이 일정 시간 동안 보관하는 기능을 합니다. 

 

 

변수란 정보를 저장할 수 있는 공간에 이름을 붙인 것

 

파이선 변수. 리얼파이선 5 

 

변수란, "변할 수 있는 수"를 뜻합니다. "變(변할 변)"과 "數(셀 수)" 한자를 사용하고 영어로는 Variable인데, 사전적으로 "어떤 관계나 범위 안에서 여러 가지 값으로 임의로 변할 수 있는 수"를 의미합니다. 여기서 "변할 수 있다"는 문장의 의미는, 프로그램 코드가 실행되는 과정에서 처리되는 값이 항상 일정한 값으로 고정되지 않고, 어떤 행위(입력, 연산 등)에 따라 그 값이 변할 수 있음을 의미합니다. 물론 사용자가 아예" 값이 변하지 않고 일정한 값을 할당할 수도 있는데 그러한 변수를 '상수', 일정한 값을 유지하는 수라고 합니다.

 

이미 앞에서 간단한 파이선 프로그래밍에서 우리는 변수를 사용했습니다. 아래 코드에서 다음 예와 같은 a, b, c를 변수라고 합니다.

 

>>> a = 1
>>> b = "python"
>>> c = [1,2,3]

 

변수를 만들 때는 위 예처럼 =(assignment) 할당 기호를 사용합니다. 다른 프로그래밍 언어인 C나 JAVA에서는 변수를 만들 때 자료형(Data Type)을 직접 지정해야 하지만 파이썬은 변수에 저장된 값을 스스로 판단하여 자료형을 지정하기 때문에 따로 데이터 형을 지정할 필요는 없습니다. 이것은 프로그래밍을 쉽게 하지만 에러를 찾아내거나 프로그램이 예상대로 결과가 나오지 않을 때 원인을 찾는 일을 어렵게 하기도 합니다. 변수에 값을 할당하는 방법은 아래와 같이 변수를 지정해 주고 값을 할당합니다. 

 

변수 이름 = 변수에 저장할 값

 

파이썬에서 사용하는 변수는 객체를 가리키는 것이라고도 말할 수 있습니다. 객체(Object)란 우리가 지금껏 보아 온 자료형과 같은 것을 의미하는 말입니다.

 

>>> a = [1, 2, 3]

 

만약 위 코드처럼 a = [1, 2, 3]이라고 하면 [1, 2, 3] 값을 가지는 리스트 자료형(객체)이 자동으로 메모리에 생성되고 변수 a는 [1, 2, 3] 리스트가 저장된 메모리의 주소를 가리키게 된다. ※ 메모리란 컴퓨터가 프로그램에서 사용하는 데이터를 기억하는 공간(흔히 RAM)입니다.

 

a 변수가 가리키는 메모리의 주소는 다음과 같이 확인할 수 있다. 

 

>>> a = [1, 2, 3]
>>> id(a)
4303029896

 

id 함수는 변수가 가리키고 있는 객체의 주소 값을 돌려주는 파이썬 내장 함수입니다. 즉 위에서 리스트 형으로 만든 변수 a가 가리키는 [1, 2, 3] 리스트의 주소 값은 4303029896 임을 알 수 있습니다. 

 

위에서 선언한 리스트 변수를 복사하고자 할 때

 

여기에서는 리스트 자료형에서 가장 혼동하기 쉬운 ‘복사’에 대해 설명합니다. 아래 예
제 코드를 보면

 

>>> a = [1,2,3]
>>> b = a

 

b 변수에 a 변수를 대입하면 어떻게 될까요? b와 a는 같은 것일까 다른 것일까? 결론부터 말하면 b는 a는 같은 리스트를 가리키는 동일한 변수입니다. 동일하다고 할 수 있죠. 다만 [1, 2, 3] 리스트를 참조하는 변수가 a 변수 1개에서 b 변수가 추가되어 2개로 늘어났다는 차이만 있을 뿐입니다.

 

id 함수를 사용하면 이러한 사실을 확인할 수 있습니다.

 

>>> id(a)
4303029896
>>> id(b)
4303029896

 

id(a)의 값이 id(b)의 값과 동일함을 확인할 수 있습니다. 즉 a가 가리키는 대상과 b가 가리키는 대상이 동일하다는 것을 알 수 있습니다. 동일한 객체를 가리키고 있는지에 대해서 판단하는 파이썬 명령어 is를 다음과 같이 실행해도 역시 참(True)을 돌려줍니다.

 

>>> a is b  # a와 b가 가리키는 객체는 동일한가?
True

 

어떻게 동일하다는 의미인지 아래 예제를 확인해 보겠습니다.

 

>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 4, 3]

 

a 리스트의 두 번째 요소를 값 4로 바꾸었더니 a만 바뀌는 것이 아니라 b도 똑같이 바뀌었죠. 그 이유는 앞에서 살펴본 것처럼 a, b 모두 동일한 리스트를 가리키고 있기 때문입니다.

 

그렇다면 b 변수를 생성할 때 a 변수의 값을 가져오면서 a와는 다른 주소를 가리키도록 만들 수는 없을까? 다음 2가지 방법이 있습니다.

 

1. [:] 이용

 

첫 번째 방법으로는 다음과 같이 리스트 전체를 가리키는 [:]을 사용해서 복사하는 것입니다.

 

>>> a = [1, 2, 3]
>>> b = a[:]
>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 2, 3]

 

위 예에서 볼 수 있듯이 a 리스트 값을 바꾸더라도 b 리스트에는 영향을 끼치지 않습니다.

 

2. copy 모듈 이용

 

두 번째는 copy 모듈을 사용하는 방법이다. 다음 예를 보면 from copy import copy라는 처음 보는 형태의 문장이 나오는데, 이것은 뒤에 설명할 파이썬 모듈 부분에서 자세히 다룬다. 여기에서는 단순히 copy 함수를 쓰기 위해서 사용하는 것이라고만 알아두자.

 

>>> from copy import copy
>>> a = [1, 2, 3]
>>> b = copy(a)

 

위 예에서 b = copy(a)는 b = a[:]과 동일합니다.

 

두 변수가 같은 값을 가지면서 서로 다른 객체를 제대로 생성했는지 다음과 같이 확인해 봅니다.

 

>>> b is a
False

 

위 예에서 b is a가 False를 돌려주므로 b와 a가 가리키는 객체는 서로 다르다는 것을 알 수 있습니다.

 

다음처럼 리스트 자료형의 자체 함수인 copy 함수를 사용해도 copy 모듈을 사용하는 것과 동일하다.

 

>>> a = [1, 2, 3]
>>> b = a.copy()

 

변수를 만드는 여러 가지 방법에 대해 알아보겠습니다.

 

>>> a, b = ('python', 'life')

 

위 예문처럼 튜플로 a, b에 값을 대입할 수 있습니다. 이 방법은 다음 예문과 완전히 동일합니다.

 

>>> (a, b) = 'python', 'life'

 

튜플 부분에서도 언급했지만 튜플은 괄호를 생략해도 됩니다. 다음처럼 리스트로 변수를 만들 수도 있습니다.

 

>>> [a,b] = ['python', 'life']

 

또한 여러 개의 변수에 같은 값을 대입할 수도 있습니다.

 

>>> a = b = 'python'

 

파이썬에서는 위 방법을 사용하여 두 변수의 값을 아주 간단히 바꿀 수 있습니다.

 

>>> a = 3
>>> b = 5
>>> a, b = b, a
>>> a
5
>>> b
3

 

처음에 a에 값 3, b에는 값 5가 대입되어 있었지만 a, b = b, a 문장을 수행한 후에는 그 값이 서로 바뀌었음을 확인할 수 있습니다. 

 

변수 할당과 사용 

 

1. 변수 할당 및 삭제

 

변수 이름 = 값

 

변수의 이름을 쓰고 이퀄(=) 그다음 값을 쓰면 변수가 만들어집니다.

 

x=10 으로 입력하면 x라는 변수 안에 값 10이 저장되어있는 형태, a=50으로 입력하면 a라는 변수 안에 값 50이 저장되어있는 형태입니다. 변수의 이름은 마음대로 지어도 되지만 아래와 같은 규칙을 지켜야 합니다. 변수 이름을 정할 때 아래 사항에 주의해야 합니다.

 

파이선 변수 생성 주의사항

  • 변수, 함수, 클래스를 만드는 규칙은 다른 언어와 비슷합니다.
  • 영문 문자와 숫자를 사용할 수 있습니다.
  • 변수 문자 길이 제한은 없습니다.
  • 대소문자를 구분합니다.
  • 첫 문자는 영문자로 시작해야 하며 숫자부터 시작하면 안 됩니다.
  • _(밑줄)로 시작할 수 있습니다.
  • 특수 문자(+, -, \, *, & 등)는 사용할 수 없습니다.
  • 파이썬의 키워드(if, while, for, or 등)는 사용할 수 없습니다. 

 

그렇다면 변수를 한 번에 여러 개를 만들려면 어떻게 해야 할까요?

 

a, b, c = 10, 20, 30 이런 식으로 입력하면 a = 10, b = 20, c = 30으로 할당되는데, 변수와 값의 개수를 동일하게 맞춰주는 것만 주의하여 주시면 됩니다.

 

변수를 삭제하고 싶을 땐 del 변수명 을 입력해주시면 되고, 비어있는 변수를 선언하고 싶다면 변수명 = None을 입력하시면 됩니다.

 

1. 변수 삭제

>>> x = 10
>>> print(x)
10

>>> del x
>>> print(x)
에러!

2. 비어있는 변수 선언

>>> x = None
>>> print(x)
None

 

변수를 이용하여 연산 하기

 

변수에는 값을 넣는다고 하였는데, 연산도 가능합니다. 아래와 같은 코드를 입력하고 실제로 변수끼리 연산이 되는지 확인합니다.

 

변수 연산

 

## 변수 연산

>>> a = 100
>>> b = 200
>>> c = a + b    ## 변수 a와 b를 더한 뒤 변수 c에 저장
>>> print(c)
300

>>> c = a - 50    ##  변수 a와 50을 뺀 뒤 변수 c에 저장
>>> print(c)
50 

>>> c += 20       ## 변수 c와 20을 더한 뒤 변수 c에 저장, c = c+20
>>> print(c)
70

 

입력 값을 받아 변수에 저장 하기

 

1) input()

 

사용자로부터 입력된 값을 가져올 땐 input()이라는 함수를 사용하고, 변수로 저장할 수 있습니다. x = input()과 같이 사용하면 사용자로부터 입력받은 값을 변수 x에 저장하게 됩니다.

 

>>> x=input()
100
>>> print(x)
100
>>>

 

2) int(input()), float(input())

 

그리고 입력값을 받을 땐 주의해야 할 점이 있는데, 바로 문자열 형태라는 것입니다.

 

x = input() 입력 후 아무 숫자를 입력하고 type(x)로 변수 x에 들어있는 타입을 확인해 보세요. str(문자열) 형태로 나옵니다. 두 값을 더할 때도 문자열로 인식하기 때문에 300이 아닌, 100+200으로 출력이 됩니다.

 

>>> x = input()
100
>>> y= input()
200
>>> print(x+y)
100200
>>>

 

그래서 사용자로부터 입력받고 변수에 저장할 때는 입력받는 값이 문자열인지, 정수인지, 실수인지 확실하게 선언을 해주어야 합니다. * 아래 코드 말고도 필요한 경우 int(a)와 같이 데이터 타입을 변경해줄 수 있습니다. 데이터 형태를 바꿔주는 일을 형 변환이라고 합니다.

 

>>> a = int(input('이곳은 정수만 입력 하여야 합니다: '))
이곳은 정수만 입력 하여야 합니다: 100
>>> b = float(input('이곳은 실수만 입력 하여야 합니다: '))
이곳은 실수만 입력 하여야 합니다: 3.14
>>> print(a)
100
>>> print(b)
3.14
>>> print(a+b)
103.14
>>>

 

3) split()

 

위에는 입력값 하나에 변수 하나씩을 만들었는데, 여러 개를 만들어주는 게 split() 함수입니다.

 

변수 1, 변수 2 = input().split()

 

위의 코드와 같이 변수 두 개를 선언했습니다. split() 함수는 값을 한 번에 여러 개 입력받을 때 사용되고, 입력받은 값을 무엇을 기준으로 분리할지를 정해 줍니다. (split()처럼 아무것도 안 쓰면 공백을 기준으로 분리되고 , 을 기준으로 분리하고 싶다면 split(', ')와 같이 사용)

 

>>>a, b = input('문자열 두 개를 입력하세요: ').split()    # 입력받은 값을 공백을 기준으로 분리
>>>문자열 두 개를 입력하세요: Hello Python 엔터 입력 
>>>print(a)
Hello
>>>print(b)
Python

 

단, 사용 시 변수와 입력받는 값을 개수는 동일해야 합니다.

 

입력받은 값을 콤마로 구분하기

 

이번에는 split에 기준 문자열을 지정하여 공백이 아닌 다른 문자로 분리해보겠습니다. 

 

>>>a, b = map(int, input('숫자 두 개를 입력하세요: ').split(',')) # 입력받은 값을 콤마를 기준으로 분리
숫자 두 개를 입력하세요: 10,20 (입력)
>>>print(a + b)
30

 

하지만 이렇게만 사용하면 문제가 또 발생하는데, 바로 2번에서 설명했던 것처럼 문자열 형태로 저장된다는 것인데, 아래의 map 함수를 통해 해결할 수 있습니다.

 

4) map()

 

변수 여러 개를 입력받으면서 문자열인지, 정수인지, 실수인지 선언해줄 수 있는 함수가 map()입니다.

 

>>>a, b = map(int, input('숫자 두 개를 입력하세요: ').split())
숫자 두 개를 입력하세요: 10 20 (입력) 
>>>print(a + b)
30

 

map 함수를 사용하여 정수형으로 선언해준 뒤 변수의 type을 보면 int형으로 출력되고, map 함수를 사용하지 않았을 땐 str으로 출력됩니다.

 

map() 함수는 아래와 같이 사용합니다.

 

변수1, 변수2 = map(int, input().split())

 

 

참고 

어떤 자료형의 값을 저장하는 공간, 변수 

파이선 변수 할당과 사용 

코딩 도장

 

 

파이선 변수 사용하기

 

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^