티스토리 뷰

 

 

 본 포스팅은 코딩을 처음 배우시는 입문자 분들께는 적절하지 않은 포스팅일 수 있습니다.

 

 개발에 필요한 최소한의 내용만 정리해서 포스팅합니다.

 

 


Summary 📜


  • 파이썬과 자료형의 종류
  • 자료형의 이해

 

 

 

파이썬이란 🤔


프로그래밍 언어의 한 종류다

 

 

파이썬 왜 쓰나? 🤔


기본적으로 코드가 짧고 간결하며, 코드가 직관적이다. 따라서 입문자가 배우기 쉽다. C나 JAVA 계열 언어를 오래 써왔다면, 세미콜론(;)을 사용하지 않는 파이썬에 불편함을 느낄 수도 있다. 과학, 계산에 특화된 패키지가 많아 과학, 공학 연구 분야에서도 활발히 사용되고 있다.

 

 

파이썬에서의 변수


다른 언어와 달리 자료형을 선언하지 않아도, 변수의 자료형을 알아서 지정해주는 특징이 있다. 즉, 선언 시 자료형이 불필요하다.(자동으로 지정해주니까) 변수에 대입한 값에 따라 아래의 기본 자료형으로 자동으로 형태가 지정된다.

 

기본적인 자료형을 나눠보자면 아래와 같다. 

 

  1. 숫자형 - int, float , complex(복소수)
  2. 시퀀스형 - str, list, tuple
  3. 그 외 - 매핑(dict), 집합(set), 불(bool)

complex 자료형은 포스팅을 준비하면서 처음 봤는데, 복소 수형 타입이라고 한다.🤔

 숫자형이나 스퀀스형, 불행의 문자는 기본적으로 변수를 선언하는 방식과 동일하다. 그 외 list, tuple, dic, set은 약간 선언 방식이 다른데, 혼동될 수 있으니, 아래의 형식을 보며 잘 기억하자 !

 

 

List 📙

Format : [요소 1, 요소 2, 요소 3,¨¨] 

대괄호('[]') 형식으로 쓴다.

특징💊

 자바로 따지면 object형 리스트라고 보면 된다. 리스트 내부의 요소들의 자료형이 달라도 되기 때문이다.  즉, [1, "문자", true] 이런 식으로 혼합된 자료형도 저장이 된다. 파이썬에서 사용하는 모든 자료형이 요소의 자료형이 될 수 있다.

 순서를 가지고 있다. 수정할 수 있다.

 

 

Tuple 📘

Format : (요소1,요소2,요소3,¨¨)

소괄호('()') 형식으로 쓴다.

특징💊

 순서를 가지고 있다는 점에서 리스트와 비슷하나, 수정이 불가능하다는 특징이 있다. 수정할 수 없기 때문에 리스트보다 빠르다. 튜플 역시 모든 자료형이 요소의 자료형이 될 수 있다.

 

Dic 📗

Format: {Key1 : Value1, Key2 : Value2,¨¨}

중괄호('{}') 형식을 사용하며, key-value의 쌍의 구조로 이루어져 있다.

특징💊

 Key-Value 형태의 쌍으로 존재한다. 자바로 따지면, Map 객체와 같다고 보면 된다. 순서가 존재하지 않는다.

 

Set 📕

Format: {요소 1, 요소2,¨¨}

중괄호('{}') 형식을 사용하며, 요소의 형태로 존재한다. 

특징💊

중복이 불가능하다. 순서가 존재하지 않는다.

 

 

[고급] 자료형의 이해 📒


 파이썬에서 모든 변수는 객체로 인식된다. 변수를 c의 포인터와 같이 이해한다면 편하다. 참조하는 값의 주소만 갖고 있는 것이다.  이를 코드를 통해 확인해 보자면 다음과 같다. 

import copy
import sys

#getrefcount(k) : 현재 파라미터 k를 참조하고 있는 수를 반환

print("Before] 현재 2를 참조하고 있는 수 : " , sys.getrefcount(2)) # 143
a = 2 # 2를 참조하는 변수 추가ㅣ
print("After] 현재 2를 참조하고 있는 수 : " , sys.getrefcount(2)) # 144
#주소를 참조하고 있다는 증거
print('2의 주소 : ' ,id(2)) # id(k) k에 대한 주소 반환
print('a의 주소 : ' ,id(a)) # 2의 주소를 반환하고 있다.

 

 다른 자료형에서도 똑같이 적용될까? 음.. 절반만 맞다. 반드시 같은 값이라고 해서 주소 값이 같지는 않다. 같은 객체일 때만 같은 주소 값을 갖는다. 그렇다면 왜 a와 2의 id 값이 같냐? 하고 반문할 수 있을 것 같다. 

 

 

 위 그림과 같이 3개의 경우의 예를 들겠다. 

  1.  a = 2라고 쓴 경우
  2.  b = 2 라고 쓴 경우
  3.  c = a라고 쓴 경우

 세 가지 경우 모두 '2'는 글자와 같은 주소를 참조한다. 1번과 2번은 같은 주소를 참조한다는 것을 확인하기 위한 비교 군이고, 3번은 주소를 어떻게 참조하는지에 대한 비교군이다. 3번과 같이 c에 변수를 대입하면, 변수가 가진 주소 값을 그대로 참조한다. 즉, c도 id값이 1417인 '2'를 참조하는 것이다. 이렇게 장황하게 설명한 이유가 있다. 아래의 코드를 보자.

#참조의 구조

a = (10,20,30)
b = (10,20,30)
c = a
# 세 주소는 모두 같음 
print('a의 주소' , id(a)) 
print('b의 주소' , id(b))
print('c의 주소' , id(c))

print('a 튜플을 변경')
a= (10,20,40)
# a의 주소만 바뀌고 나머진 같음
print('a의 주소' , id(a))
print('b의 주소' , id(b))
print('c의 주소' , id(c))

 위 코드에서 a의 주소만 바뀐다. 언뜻 보면, c도 바뀌어야 할 것 같지만, 결과를 돌려보면 a만 바뀌어있다. 이는 c가 참조하는 것이 a의 주소가 아닌 a가 가리킨 객체의 주소를 참조하고 있음을 잘 보여주는 예제이다. 즉, 변형이 불가능한 객체(immutable)는 새로운 객체로 덮어씌워지므로, 값이 달라진다.

 

 위 예제를 통해 변형이 불가능한 객체의 값에 대해서는 주소가 같은 값을 가진 다는 것을 확인했다. 그렇다면, 변형이 가능한 객체에서는 주소 값이 다르다는 말일까? 그렇다. 대표적으로 list 예로 들 수 있다.  

a = [1,2,3,4]
b = [1,2,3,4]
c = a

# a,c는 주소 동일 b 는 다름
print('a의 주소' , id(a)) #2531295230720
print('b의 주소' , id(b)) #2531298961984
print('c의 주소' , id(c)) #2531295230720

print('a 리스트 값 추가 ')
a.append(10)
# a,c는 주소 동일 b 는 다름
print('a의 주소' , id(a)) #2531295230720
print('b의 주소' , id(b)) #2531298961984
print('c의 주소' , id(c)) #2531295230720

print('a 리스트 새로 변경 ')
a = [2,3,4]
# a,b,c 다다름
print('a의 주소' , id(a)) #2531295230211
print('b의 주소' , id(b)) #2531298961984
print('c의 주소' , id(c)) #2531295230720

 리스트의 경우, 같은 리스트이더라도 주소값이 다르다. 리스트 자체가 수정이 가능하므로 주소가 같다면, 치명적일 수 있다. 따라서 이처럼 변형 가능한 경우엔 분리한다. 리스트도 마찬가지로 새로운 리스트로 덮어씌울 경우, a의 주소 값만 변경됨을 볼 수 있다.

 

 

결론 🔑


파이썬의 기본 자료형과 자료형 동작 원리를 알아보았다. 자료형이 모두 객체임을 인지하지 못한다면, 나중에 파라미터를 사용할 때, 값이 복사가 되는지 되지 않는지 모르고 쓰게 되고, 원치 않는 결과가 나올 수 있다. 꼭 기억하자.

 

 

c.f) 급하게 파이썬을 배워 쓰던 시절에 자료형이 객체라는 개념이 없어서 깊은 복사 없이 사용하다가 고통받은 적이 있었다. 다시 공부하면서 제대로 얻어가는 부분 중 하난 것 같다. 나중에 깊은 복사를 해야 할지 말아야 할지를 어떻게 판단하면 되는지 잘 알게 되었던 것 같다. :D  

 

 

References 📑


 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함