Dylan_Han
IT Blog
Dylan_Han
전체 방문자
오늘
어제
  • 전체 (19)
    • Front-End (8)
      • HTML (8)
    • SW (11)
      • Python 기초 (7)
      • Python 심화 (4)

블로그 메뉴

  • Github
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Dylan_Han

IT Blog

SW/Python 기초

3. 변수와 데이터 타입

2022. 10. 4. 14:44

1. 변수(variable)

  • 대부분의 프로그램은 데이터를 활용하여 다양한 동작을 수행하며, 이러한 데이터는 컴퓨터의 메모리 공간에 저장될 수 있습니다. 이때 데이터를 저장한 메모리 공간에 이름을 할당받아야만 나중에 다시 해당 데이터에 접근할 수 있습니다.
  • 이것은 마치 다음과 같이 제목(label)을 붙여 놓은 서류함(cabinet)과 비슷한 원리라고 생각하면 됩니다.

이처럼 프로그램에서 사용되는 데이터를 저장해 놓는 일종의 저장 공간을 변수(variable)라고 부릅니다. 즉, 변수란 데이터를 저장할 수 있도록 이름을 할당받은 메모리 공간을 의미하며, 이렇게 저장된 데이터에는 언제든지 다시 접근하거나 그 값을 변경할 수 있습니다.

 


1-1. 변수의 사용

다음은 애국가 1절 전반부를 세 번 출력하기 위해서 print() 함수를 세 번 사용하는 예제입니다.

print("동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세")
print("동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세")
print("동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세")

결과

동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세
동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세
동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세

하지만 이와 같은 방법은 매우 비효율적이며 코드 또한 매우 복잡해집니다.

 

이때 우리가 사용할 수 있는 것이 바로 변수입니다.

우선 변수를 선언하여 문자열을 저장한 다음 해당 변수를 사용하여 문자열을 출력하면 됩니다.

korea = "동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"
print(korea)
print(korea)
print(korea)

결과

동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세
동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세
동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세
  • 위 예제의 1번 라인에서는 korea라는 이름의 변수를 선언하고, 대입 연산자(=)를 사용하여 해당 변수에 문자열을 저장하고 있습니다. 
  • 이렇게 선언된 변수는 해당 프로그램이 종료될 때까지 계속해서 재사용할 수 있습니다.
  • 이처럼 변수를 사용하면 중복해서 작성해야 하는 코드가 많이 줄어들게 되므로, 코드의 가독성이 높아집니다.

 

  • 위의 예제에서 사용된 ‘\n’ 문자는 줄바꿈(new line)을 나타내는 이스케이프 문자(escape character)로 
  • print() 함수는 이 문자를 만나면 줄을 바꾼 후에 계속해서 출력을 진행하게 됩니다.

파이썬에서 '같음'을 비교할 때는 등호가 두 개(==)인 비교연산자를 사용합니다. 

이때 실수로 값을 비교할 때 대입연산자(=)를 잘못 사용하지 않도록 주의할 필요가 있습니다.


1-2. 변수의 재활용

  • 선언된 변수는 해당 프로그램이 종료될 때까지 계속해서 사용할 수 있으며, 이때 변수에 저장된 데이터를 변경할 수도 있습니다.

다음 예제는 변수 korea에 저장된 값을 프로그램이 실행되는 도중 대입 연산자를 사용하여 다른 값으로 변경하는 예제입니다.

korea = "동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세"
print(korea)
print(korea)
print(korea + "\n")  
korea = "남산 위에 저 소나무 철갑을 두른 듯 바람 서리 불변함은 우리 기상일세"
print(korea)
print(korea)
print(korea)

 

결과

동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세
동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세
동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세

남산 위에 저 소나무 철갑을 두른 듯 바람 서리 불변함은 우리 기상일세
남산 위에 저 소나무 철갑을 두른 듯 바람 서리 불변함은 우리 기상일세
남산 위에 저 소나무 철갑을 두른 듯 바람 서리 불변함은 우리 기상일세
  • 위 예제의 5번 라인에서는 이미 선언된 변수 korea에 애국가 2절 문자열을 저장하고 있습니다. 
    따라서 변수 korea에는 앞서 저장되어 있던 애국가 1절의 문자열 대신에 애국가 2절의 문자열이 저장됩니다.

 

이렇게 변수의 데이터를 변경하면 기존에 저장되어 있던 데이터는 완전히 사라지게 되니 주의해야 합니다.


1-3. 변수명 생성 규칙

  • 만약 파이썬에서 변수명으로 if나 while 등을 사용할 수 있으면, 파이썬 인터프리터는 이것이 변수명인지 아니면 조건문이나 반복문을 나타내는 것인지 알 수 없게 됩니다. 따라서 파이썬 인터프리터는 SyntaxError라는 에러 메시지를 출력하고 프로그램을 강제로 종료시킵니다.
  • 이처럼 파이썬을 비롯한 모든 프로그래밍 언어에서는 변수의 이름을 짓는데 반드시 지켜야하는 공통된 규칙을 가지고 있습니다.

 

다음은 파이썬에서 변수명을 지을 때 지켜야하는 규칙들입니다.

  1. 변수명은 영문자(대소문자), 숫자, 언더스코어(_)로만 작성할 수 있습니다.
  2. 변수명은 숫자로 시작할 수 없습니다. 즉, 반드시 영문자나 언더스코어(_)로 시작해야 합니다.
  3. 변수명은 대소문자를 구분합니다.
  4. 변수명에는 파이썬에서 미리 정의된 예약어(reserved words)는 사용할 수 없습니다.

파이썬에서 미리 정의된 예약어는 다음과 같습니다.

출처 : tcpschool.com

 

파이썬에서 변수명은 해당 변수에 저장되는 데이터를 의미할 수 있는 단어를 사용하여 간단명료하게 구성하는 것이 좋으며, 

같은 프로그램에서 선언된 변수들의 이름은 가급적 일관되게 작성하는 것이 좋습니다.


2. 변수의 타입

  • C언어나 자바와 같은 프로그래밍 언어에서는 변수를 선언할 때 반드시 타입이라는 것을 같이 명시해야 합니다.
  • 변수의 타입(type)이란 정수나 실수, 문자열 등과 같이 해당 변수에 저장된 데이터의 종류를 나타내며, 변수의 타입을 통해 해당 변수가 프로그램 내에서 어떻게 처리되어야 하는지를 알려주는 지표와 같은 역할을 합니다.

출처 : tcpschool.com

하지만 파이썬에서는 변수를 선언할 때 별도로 타입을 명시하지 않아도 

변수에 대입되는 데이터의 타입에 따라 변수의 타입을 자동으로 설정해 줍니다.

var = 7
print(type(var))  

var = "문자열"
print(type(var))

결과

<class 'int'>
<class 'str'>
  • 위의 예제의 1번 라인에서 변수 var는 정수를 대입하여 선언했으므로, 변수 var의 타입도 정수로 선언됩니다.
  • 하지만 4번 라인에서 정수형 변수 var에 문자열을 대입하게 되면, 변수 var의 타입도 문자열로 자동 변경됩니다.

type() 함수는 인수로 전달된 데이터나 변수의 타입을 반환하는 함수입니다.

 


3. 데이터 타입

  • 변수뿐만 아니라 프로그램에 사용되는 모든 데이터에도 타입이 존재합니다. 데이터 타입(data type, 자료형)이란 해당 데이터가 메모리에 어떻게 저장되고, 프로그램 내에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할을 합니다.
  • 예를 들어, 1, 2, 3.14와 같은 숫자들은 숫자형 타입이 되며, “안녕하세요!”와 같은 문자열은 문자열 타입이 되는 것입니다.

파이썬에서는 다음과 같은 기본 데이터 타입을 제공하고 있습니다.

  1. 숫자형 타입(numeric types)
  2. 불리언 타입(boolean types)
  3. 문자열 타입(text sequence types)

이외에도 리스트(list)와 튜플(tuple), 집합(set), 딕셔너리(dict) 등과 같은 타입 등이 존재하며, 이러한 복잡한 데이터 타입에 대해서는 데이터 구조 단원에서 더욱 자세히 살펴보도록 합시다.


4. 숫자형 타입(numeric types) : int, float

  • 숫자형 타입이란 1, 2, 3.14와 같이 숫자의 형태로 이루어진 데이터 타입을 의미합니다.
  • 이중에서 1과 2와 같이 소수점이 없는 숫자형 데이터를 정수형(integer) 타입이라고 하며, 3.14와 같이 소수점을 가지고 있는 숫자형 데이터를 실수형(floating-point) 타입이라고 합니다.
i = 10
j = 3.14
 
print(type(i))
print(type(j))

결과

<class 'int'>
<class 'float'>
  • 위의 예제에서 변수 i에는 정수 10이 저장되므로 정수형 타입으로 선언됩니다. 따라서 type() 함수에 인수로 변수 i를 전달하면 int 클래스가 반환됩니다.
  • 또한, 변수 j는 실수 3.14가 저장되어 실수형 타입으로 선언되므로, type() 함수가 float 클래스를 반환하게 됩니다. 이처럼 파이썬에서는 각각의 데이터 타입이 하나의 클래스(class)로 작성되어 제공됩니다.

클래스(class)란 객체 지향 프로그래밍에서 객체(object)를 만들어 내기 위한 일종의 설계도라 할 수 있으며, 

객체(object)란 실생활에서 우리가 인식할 수 있는 사물로 설명할 수 있습니다.

 

클래스와 관련된 자세한 사항은 파이썬 클래스 단원에서 확인할 수 있습니다.


4-1. 산술 연산자(arithmetic operator)

  • 숫자형 데이터끼리는 더하기(+), 빼기(-), 곱하기(*), 나누기(/)와 같은 산술 연산자를 사용하여 사칙연산을 수행할 수 있습니다.
  • 파이썬에서 정수형 데이터끼리의 나눗셈을 제외한 사칙 연산은 언제나 정수형 데이터를 결과로 반환하며, 실수형 데이터끼리의 사칙 연산은 언제나 실수형 데이터를 결과로 반환합니다. 단, 정수형 데이터끼리의 나눗셈의 결과는 정수형이 아닌 실수형으로 반환됨으로 이 점 주의해야 합니다.

마지막으로 실수형 데이터와 정수형 데이터 사이의 사칙 연산은 언제나 실수형 데이터를 결과로 반환합니다.

i = 4
j = 2  
 
print(i + j)
print(i - j)
print(i * j)
print(i / j)

결과

6
2
8
2.0
  • 위 예제의 7번 라인에서 정수 4를 정수 2로 나눈 결과가 정수 2가 아닌 실수 2.0으로 반환되는 것을 확인할 수 있습니다.

이때 나눗셈의 몫을 실수가 아닌 정수로 얻고 싶다면 나눗셈(/) 연산자가 아닌 몫(//) 연산자를 사용해야 합니다.

또한, 나눗셈의 나머지를 얻고 싶을 때에는 나머지(%) 연산자를 사용하면 됩니다.

 

i = 4
j = 2  
 
print(i / j)
print(i // j)
print(i % j)

결과

2.0
2
0

5. 불리언 타입(boolean types) : bool

  • 불리언 타입이란 논리값인 참(True)과 거짓(False) 중 한 가지만을 가질 수 있는 데이터 타입을 의미합니다.

파이썬에서는 True와 False가 예약어로 미리 지정되어 있기 때문에 첫 문자를 항상 대문자로 사용해야만 합니다.

 

C를 비롯한 대부분의 프로그래밍 언어에서 1은 ‘참’을 의미하고 0은 ‘거짓’을 의미합니다. 파이썬에서는 이에 더해 데이터의 참과 거짓을 다음과 같이 판단하고 있습니다.

print(bool(1))        # True
print(bool(0))        # False  
 
print(bool(None))     # False
print(bool([]))       # False
print(bool(()))       # False
print(bool({}))       # False
print(bool([1,2,3]))  # True  
 
print(bool(""))       # False
print(bool("python")) # True

결과

True
False
False
False
False
False
True
False
True
  • 문자열이나 리스트, 튜플, 딕셔너리 등이 비어있으면 거짓(False)으로 인식되며, 비어있지 않으면 참(True)으로 인식됩니다.

bool() 함수는 인수로 전달된 데이터의 참과 거짓을 판단하여 반환합니다.


5-1. 비교 연산자(relational operator)

  • 비교 연산자는 피연산자 사이의 상대적인 크기를 판단하는 연산자로, 왼쪽의 피연산자와 오른쪽의 피연산자를 서로 비교하여 어느 쪽이 더 큰지, 작은지, 또는 같은지를 판단합니다.

출처 : tcpschool.com

비교 연산자로 연산한 결과는 언제나 불리언 타입으로 반환되므로, True나 False 중 하나의 값이 반환됩니다.

i = 100
j = 10  
 
print(i < j)  # False
print(i >= j) # True
print(i == j) # False
print(i != j) # True

결과

False
True
False
True

5-2. 논리 연산자(logical operator)

  • 논리 연산자는 주어진 논리식을 판단하여, 참(True)과 거짓(False)을 결정하는 연산자입니다.

출처 : tcpschoo.com

print((100 > 10) or (30 <= 3)) # True or False -> True
print((10 == 10) and (3 != 3)) # True and False -> False
print(not (3 <= 3))            # not True -> False

결과

True
False
False
  • 파이썬에서 or 연산자는 첫 번째 논리식의 결과가 False일 때만 두 번째 논리식을 검사합니다. 
  • 이것은 첫 번째 논리식의 결과가 True이면 두 번째 논리식을 검사하지 않고도 결과가 True임을 바로 알 수 있기 때문입니다.
  • 또한, and 연산자는 첫 번째 논리식의 결과가 True일 때만 두 번째 논리식을 검사합니다. 첫 번째 논리식의 결과가 False이면 두 번째 논리식의 결과와 상관없이 언제나 결과는 False이기 때문입니다.

다음은 논리 연산자의 모든 결과를 나타내는 진리표(truth table)입니다.

출처 : tcpschool.com

 


6. 문자열 타입(text sequence types) : str

  • 문자열(string)이란 문자로 이루어진 데이터의 집합을 의미하며, 파이썬에서는 다음과 같이 다양한 방법으로 문자열을 표현할 수 있습니다.
  1. 큰따옴표(" ")로 감싸기
  2. 작은따옴표(' ')로 감싸기
  3. 큰따옴표 3개(""" """)로 감싸기
  4. 작은따옴표 3개(''' ''')로 감싸기
print("파이썬")
print('Python')  
 
print("내 이름은 '홍길동'이야!")
print('내 이름은 "홍길동"이야!')

결과

파이썬
Python
내 이름은 '홍길동'이야!
내 이름은 "홍길동"이야!
  • 위의 예제처럼 큰따옴표와 작은따옴표의 용법상 차이는 전혀 없으며, 이 두 가지 따옴표를 모두 사용하는 이유는 4번과 5번 라인처럼 문자열 내에서 따옴표를 정확히 표현하기 위함입니다.
  • 하지만 따옴표가 등장하는 순서에 따라 정확하게 사용하지 않으면 예상치 못한 문제가 발생할 수 있으므로, 그 사용에 주의를 기울여야 합니다.

§ 정상적인 문자열 : “그녀는 ‘당신이 너무 멋져요!’라고 말했어.”
§ 잘못된 문자열 : “그녀는 ‘당신이 너무 멋져요!”라고 말했어.’

 

  • 위의 잘못된 문자열에 대해 파이썬은 [“그녀는 ‘당신이 너무 멋져요!”]까지 만을 정상적인 문자열로 인식하고, 나머지 부분인 [라고 말했어.’]는 정상적인 문자열로 인식하지 못해 에러를 발생시킬 것입니다.

6-2. 여러 줄의 문자열 표현하기

  • 큰따옴표나 작은따옴표 3개를 연속해서 사용하면 여러 줄의 문자열을 그대로 표현할 수 있습니다.
print("""큰따옴표 3개는
여러 줄의 문자열을 표현할 때
사용합니다.""")  
 
print('''작은따옴표 3개도
여러 줄의 문자열을 표현할 때
사용합니다.''')  
 
print('여러 줄의 문자열을\n'
'개행문자를 사용하여 표현하는 것이\n'
'소스코드의 가독성은 더 좋습니다.')

결과

큰따옴표 3개는
여러 줄의 문자열을
표현할 때 사용합니다.
작은따옴표 3개도
여러 줄의 문자열을
표현할 때 사용합니다.
여러 줄의 문자열을
개행문자를 사용하여 표현하는 것이
소스코드의 가독성은 더 좋습니다.
  • 위 예제의 9번과 10번 라인에 사용된 줄바꿈 문자(‘\n’)는 출력 시 문자열의 라인을 다음 라인으로 바꿔주는 역할을 하며, 이를 사용함으로써 따옴표 3개를 사용하는 표현보다 좀 더 출력 결과와 비슷한 형태로 코드를 작성할 수 있습니다.

6-3. 문자열끼리의 연산

  • 파이썬에서는 숫자처럼 문자열끼리 서로 더하거나 문자열에 숫자를 곱할 수도 있습니다. 문자열끼리의 더하기(+) 연산은 두 문자열을 서로 연결시켜주며, 문자열과 정수의 곱하기(*) 연산은 해당 문자열을 정수배만큼 반복해서 연결해 줍니다.
i = "파이썬 "
j = "문자열"  
 
print(i + j)
print(i * 3)

결과

파이썬 문자열
파이썬 파이썬 파이썬

6-4. 문자열에서 문자 선택하기

  • 문자열은 문자들의 연속된 집합이라고 볼 수 있습니다. 따라서 파이썬에서는 문자열 내에서 특정 위치의 문자를 손쉽게 선택할 수 있도록 다음 예제와 같이 문자열을 문자들의 배열로 다룰 수 있게 해줍니다.
py = "파이썬으로 코딩을 배우자!"  
 
print(py[0])
print(py[6])
print(py[-1])
print(len(py))

결과

파
코
!
14
  • 위 예제의 3번 라인처럼 문자열의 첫 번째 문자의 인덱스(index)는 0부터 시작해서 1씩 증가되며, 이때 띄어쓰기(white space)도 하나의 문자로 취급됩니다. 파이썬에서는 음의 인덱스도 지원하며, 음의 인덱스는 문자열의 마지막 문자를 -1로 놓고 역순으로 증가하게 됩니다.

대부분의 프로그래밍 언어에서는 한글과 영문자의 크기가 서로 다르게 취급되는데, 파이썬에서는 한글과 영문자의 크기를 동일하게 취급합니다.


6-5. 문자열 자르기

  • 문자열을 다루다보면 문자열의 일부분만을 사용하거나 문자열의 일부만을 변경해야 할 경우가 생깁니다. 이러한 경우 손쉽게 처리할 수 있도록 파이썬에서는 문자열의 일부분을 잘라 반환해주는 문자열 슬라이싱(slicing)을 지원하고 있습니다.
py = "우리집 강아지 이름은 멍멍이입니다."  
 
print(py[4])
print(py[4:7])
print(py[:4])
print(py[4:])

결과

강
강아지
우리집 
강아지 이름은 멍멍이입니다.
  • 위 예제의 4번 라인처럼 콜론(:)기호를 사용하면 문자열의 일부분만을 자를 수 있으며, 이때 콜론의 앞쪽에 위치한 인덱스부터 콜론의 뒤쪽에 위치한 인덱스 바로 앞 문자까지를 반환합니다. 이처럼 콜론의 앞쪽에 위치한 인덱스는 곧바로 시작 인덱스가 되지만, 콜론의 뒤쪽에 위치한 인덱스는 해당 인덱스에서 1을 뺀 인덱스가 마지막 인덱스가 됩니다.
  • 또한, 시작 인덱스나 종료 인덱스 중 하나를 생략하면 손쉽고 빠르게 부분 문자열을 생성할 수 있습니다.

6-6. 특정 문자의 개수 및 위치

  • count() 함수는 해당 문자열에 인수로 전달받은 문자가 모두 몇 개 포함되어 있는지를 확인하여 반환합니다.
  • 또한, find()나 index() 함수를 사용하면, 해당 문자열에 인수로 전달받은 문자가 처음으로 등장하는 인덱스(index)를 알 수 있습니다.
py = "python programming"  
 
print(py.count('p'))  

print(py.find('o'))
print(py.index('o'))  
 
print(py.find('z'))
# print(py.index('z'))

결과

2
4
4
-1
  • 위 예제의 5번과 6번 라인에서 find()와 index() 함수의 결과는 동일하게 4로 출력됩니다.
  • 이 두 함수의 차이점은 바로 8번과 9번 라인처럼 해당 문자열에 포함되어 있지 않은 문자를 검색할 때 나타납니다. find() 함수는 해당 문자열에 전달받은 문자가 포함되어 있지 않으면 -1을 반환하지만, index() 함수는 ValueError를 발생시키며 프로그램을 강제 종료합니다.

따라서 index() 함수를 사용할 때는 반드시 전달받은 문자가 해당 문자열에 포함되어 있는지를 먼저 확인하고 사용해야 합니다.


6-7. 문자열의 대소문자 변환

  • upper() 함수는 문자열의 모든 문자를 대문자로 변환해주며, lower() 함수는 문자열의 모든 문자를 소문자로 변환시켜 줍니다.
py = "Python"  
 
print(py.upper())
print(py.lower())  
 
print(py)

결과

PYTHON
python
Python
  • 위 예제의 6번 라인의 실행결과를 보면 원본 문자열은 변하지 않았음을 확인할 수 있습니다. 이처럼 지금까지 우리가 문자열 다루기 단원에서 살펴본 문자열 함수들은 모두 원본 문자열 그 자체를 변환하는 것이 아니라, 변환된 새로운 문자열을 생성하여 반환해 주는 것입니다.

6-8. 문자열 변경하기

  • replace() 함수는 첫 번째 인수로 전달된 문자열을 해당 문자열에서 찾아 두 번째 인수로 전달된 문자열로 변경해 줍니다. 이때 해당 문자열에서 첫 번째 인수로 전달된 문자열을 찾을 수 없으면, 원본 문자열을 그대로 반환합니다.
py = "파이썬 공부는 너무 재밌어요!"  
 
print(py.replace("파이썬", "자바"))
print(py)

결과

자바 공부는 너무 재밌어요!
파이썬 공부는 너무 재밌어요!

6-9. 문자열 나누기

  • split() 함수는 전달받은 문자를 기준으로 해당 문자열을 여러 개의 부분 문자열로 나누어 하나의 리스트로 반환합니다.
py = "파이썬 공부는 너무 재밌어요!"  
 
print(py.split(' '))
print(py.split())  
 
print(py)

결과

['파이썬', '공부는', '너무', '재밌어요!']
['파이썬', '공부는', '너무', '재밌어요!']
파이썬 공부는 너무 재밌어요!
  • 위 예제의 3번 라인에서는 문자열 py를 띄어쓰기를 기준으로 나누고 있습니다. 또한, 4번 라인처럼 split() 함수에 아무런 인수도 전달하지 않으면, 자동으로 띄어쓰기나 탭 문자, 줄바꿈 문자 등과 같은 공백(white space)을 기준으로 문자열을 나누게 됩니다.
더보기

참고 : http://tcpschool.com

    'SW/Python 기초' 카테고리의 다른 글
    • 5. 데이터 구조
    • 4. 프로그램의 흐름 제어
    • 2. 파이썬의 기초
    • 1. 파이썬 소개
    Dylan_Han
    Dylan_Han

    티스토리툴바