이제는 프론트엔드에 관련된 내용 학습을 마무리하고 머신러닝과 딥러닝 학습을 위해 Python의 학습을 시작했다. Python은 대학교에 재학하는 동안 사용해왔던 프로그래밍 언어라 기억 안나는 부분들과 이미 알고 있었던 개념들을 다시 한 번 확인해보는 시간이라고 생각하며 학습을 진행해보려 한다.
Python의 기초적인 부분부터 조금 심화적인 내용까지 학습할 예정이고, 오늘은 기초적인 내용을 학습해볼 것이다.
✅ 변수
1️⃣ 변수(Variable)란?
🧠 개념 설명
- 변수는 데이터를 저장하는 이름이 붙은 상자라고 생각하면 이해하기 쉽다.
- 우리가 어떤 값을 프로그램에서 사용할 때 그걸 기억해두는 역할이다.
age = 25
- age: 변수 이름 (식별자)
- =: 할당 연산자, 오른쪽 값을 왼쪽 변수에 저장
- 25: 변수에 저장될 값
🔎 변수 사용의 이유
이유 | 설명 |
데이터 재사용 | 한 번 저장하면 반복해서 쓸 수 있어 |
코드 가독성 | 의미 있는 이름으로 코드를 읽기 쉽게 만듦 |
유지보수 용이 | 값만 바꾸면 전반에 반영됨 |
2️⃣ 변수의 이름 규칙 (네이밍 규칙)
변수의 이름은 내 마음대로 설정하면 안된다. 내가 혼자 작업하는 상황이라고 하더라도 코드의 양이 늘어나고, 변수명이 늘어나면 본인도 헷갈릴 수 있기에 변수의 이름은 정해진 규칙에 맞게 작성해야 한다.
✅ 지켜야 할 기본 규칙
항목 | 설명 |
문자, 숫자, 밑줄(_) 사용 가능 | 숫자로 시작하면 ❌ |
대소문자 구별 | Age, age, AGE는 다름 |
예약어 사용 ❌ | if, for, print 같은 파이썬 문법은 변수로 사용 금지 |
✅ 네이밍 스타일
스타일 | 예시 | 특징 |
snake_case | student_name | 파이썬 권장 스타일 (PEP8) |
camelCase | studentName | JavaScript 등에서 자주 사용 |
PascalCase | StudentName | 클래스 이름에 많이 씀 |
student_name = "홍길동"
StudentName = "김철수"
studentName = "이영희"
_private = "비공개"
파이썬에서는 보통 snake_case를 많이 사용하는 것 같다.
3️⃣ 동적 타이핑(Dynamic Typing)
Python은 변수를 선언할 때 타입을 명시할 필요가 없다는 장점이 있다.
x = 10 # int
x = "hello" # str
- C나 Java에서는 int x = 10; 이런 식으로 타입을 명시해야 하지만, 파이썬은 자동으로 타입을 판단해서 저장해준다.
- 그래서 동적 타입 언어라고 불린다.
4️⃣ 참조 기반 저장 (메모리 동작 방식)
Python은 값이 아닌 값이 저장된 주소를 참조해서 값을 가져오는 특징이 있다.
a = [1, 2, 3]
b = a
b[0] = 100
print(a) # [100, 2, 3]
- b = a로 복사한 게 값 복사가 아니라 주소 공유를 한 것이다. 그래서 b를 바꾸면 a도 같이 바뀌는 것처럼 보일 수 있다.
💥 주의
- 가변(Mutable) 타입: 리스트, 딕셔너리, 집합 → 주소 공유 주의
- 불변(Immutable) 타입: 정수, 실수, 문자열, 튜플 → 값이 바뀌면 새 주소로 이동
5️⃣ 스코프(Scope, 유효 범위)
어떤 코드 블록에서 변수를 사용할 수 있는지 결정하는 규칙이다.
▶ 4단계 LEGB 규칙
단계 | 설명 |
Local | 함수 내부에서 선언된 변수 |
Enclosing | 중첩 함수의 바깥 함수의 변수 |
Global | 전체 파일의 전역 변수 |
Built-in | 파이썬 기본 제공 함수/변수 (print, len 등) |
x = 10 # Global
def outer():
x = 20 # Enclosing
def inner():
x = 30 # Local
print(x) # 30 출력
inner()
outer()
6️⃣ global 키워드
함수 안에서 전역 변수를 수정하고 싶을 때 사용한다.
count = 0
def increase():
global count
count += 1
⚙️ 요약 정리
항목 | 설명 |
변수 | 데이터를 저장하는 이름이 붙은 상자 |
네이밍 규칙 | 소문자+밑줄(snake_case) 권장, 숫자로 시작 ❌ |
동적 타이핑 | 변수 선언 시 타입 지정 X, 자동으로 결정 |
참조 기반 | 값이 아닌 메모리 주소를 참조 |
가변 vs 불변 | 리스트/딕트/셋(가변), 정수/문자열/튜플(불변) |
스코프 | Local → Enclosing → Global → Built-in 순서 |
global 키워드 | 함수 안에서 전역 변수 수정할 때 사용 |
✅ 데이터 타입
📌 주요 기본 타입
Type | 예시 | 설명 |
int | 10, -5, 0 | 정수 |
float | 3.14, -0.5 | 실수 (소수점 포함 수) |
complex | 2 + 3j | 복소수 |
str | "hello", '파이썬' | 문자열 |
bool | True, False | 참/거짓 |
1️⃣ 정수형 (int)
- 소수점 없이 나타나는 수
- 음수, 0, 양수 모두 포함
- 파이썬 3부터는 정수 크기에 제한이 없음 → 메모리 허용 범위까지 가능
a = 10
b = -999
c = 1000000000000000
2️⃣ 실수형 (float)
- 소수점이 있는 숫자
- 파이썬은 부동소수점(floating-point) 방식으로 저장
pi = 3.14159
score = -0.75
⚠️ float 정밀도 주의
10진수 소수 → 2진수로 변환할 때 무한 소수가 생길 수 있는 점을 주의해야 한다. 반올림이나 decimal()을 사용해서 정확하게 계산하도록 할 수 있는데, 보통 round()를 통해 반올림하는 방법을 자주 사용했었다.
print(0.1 + 0.2) # 0.30000000000000004
✅ 해결 방법
- round(): 반올림
- decimal 모듈: 정확도 높은 계산
3️⃣ 복소수형 (complex)
- 실수부 + 허수부 형태의 수
- 전기/물리 분야에서 사용
- 파이썬에서는 j를 사용해 허수 표현
z = 3 + 4j
print(z.real) # 실수부 → 3.0
print(z.imag) # 허수부 → 4.0
→ 복소수형은 자주 사용할 일은 없었던 것 같아 이런 데이터 타입이 있구나라고 알아두기만 하면 될 것 같다.
4️⃣ 문자열형 (str)
문자들의 집합으로, 작은따옴표(') 또는 큰따옴표(")로 감싸서 사용한다.
msg = "Hello, Python!"
✨ 문자열 특징
항목 | 설명 |
인덱싱 | "Hello"[0] → 'H' |
슬라이싱 | "Hello"[0:3] → 'Hel' |
불변(immutable) | 문자열은 수정 불가 |
반복 가능 | for문 등으로 순회 가능 |
유니코드 지원 | 다양한 언어/이모지 가능 😃 |
5️⃣ 불리언형 (bool)
True 또는 False 두 값만 존재하며, 비교 연산이나 조건문에서 주로 사용한다.
is_rainy = True
is_weekend = False
✅ 자동 변환
값 | 변환 결과 |
0, 0.0, "", [], {} | False |
나머지 값들 (숫자, 문자열 등) | True |
6️⃣ 형 변환 (Type Casting)
int("10") # 10
float("3.14") # 3.14
str(100) # "100"
bool(0) # False
⚙️ 요약 정리
타입 | 설명 | 예시 |
int | 정수 | -1, 0, 123 |
float | 실수 | 3.14, -0.5 |
complex | 복소수 | 1 + 2j |
str | 문자열 | "hello" |
bool | 논리형 | True, False |
⚠️ float 정밀도 | 0.1 + 0.2 ≠ 0.3, decimal로 해결 | |
변환 함수 | int(), float(), str(), bool() |
✅ 리스트 (List)
1️⃣ 리스트란?
- 순서가 있는(ordered) 데이터 집합이다.
- 변경 가능(mutable) → 수정, 삭제, 추가 가능
- 다양한 데이터 타입을 혼합해서 저장 가능
- [] 대괄호로 생성
fruits = ["사과", "바나나", "체리"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "안녕", 3.14, True]
2️⃣ 인덱싱 & 슬라이싱
✅ 인덱싱
- 인덱스는 0부터 시작하며, -1은 맨 마지막 요소를 가리킴
print(fruits[0]) # 사과
print(fruits[-1]) # 체리
✅ 슬라이싱
- [시작:끝] → 끝은 포함하지 않는다.
print(fruits[0:2]) # ['사과', '바나나']
3️⃣ 리스트 생성 방법
✅ 직접 입력
a = [1, 2, 3]
✅ list() 함수
b = list("hello") # ['h', 'e', 'l', 'l', 'o']
✅ 빈 리스트
empty1 = [] empty2 = list()
4️⃣ 리스트 메서드
메서드 | 설명 | 예시 |
.append(x) | 맨 뒤에 추가 | a.append(4) |
.insert(i, x) | i번째에 x 삽입 | a.insert(1, 100) |
.remove(x) | x 삭제 (첫 번째만) | a.remove(2) |
.pop() | 맨 뒤 요소 꺼냄 | a.pop() |
.index(x) | x의 인덱스 반환 | a.index(3) |
.count(x) | x의 개수 반환 | a.count(1) |
.sort() | 오름차순 정렬 | a.sort() |
.reverse() | 반대로 뒤집음 | a.reverse() |
5️⃣ 리스트 컴프리헨션 (List Comprehension)
리스트를 짧고 간결하게 만들 수 있는 표현 방식이다.
squares = [x**2 for x in range(1, 6)]
# [1, 4, 9, 16, 25]
even = [x for x in range(10) if x % 2 == 0]
# [0, 2, 4, 6, 8]
6️⃣ 중첩 리스트 (2차원 리스트)
matrix = [[1, 2], [3, 4]]
print(matrix[0][1]) # 2
⚠️ 얕은 복사 vs 깊은 복사
# 얕은 복사: 같은 참조
row = [0] * 3
matrix = [row] * 3
matrix[0][0] = 1
print(matrix) # [[1, 0, 0], [1, 0, 0], [1, 0, 0]]
# 깊은 복사: 각각 다른 참조
matrix = [[0 for _ in range(3)] for _ in range(3)]
⚙️ 요약 정리
항목 | 설명 |
정의 | 순서 있고, 수정 가능한 데이터 집합 |
생성 | [], list(), 빈 리스트 가능 |
접근 | 인덱싱 [0], 슬라이싱 [1:3] |
메서드 | append, insert, remove, pop 등 |
리스트 컴프리헨션 | [x for x in ... if 조건] |
중첩 리스트 | matrix[row][col] 형태로 접근 |
복사 주의 | 얕은 복사 vs 깊은 복사 구분 필요 |
✅ 튜플 (Tuple)
1️⃣ 튜플이란?
- 여러 값을 하나의 변수에 묶어 저장하는 자료형이다.
- 리스트와 유사하지만, 변경이 불가능(immutable)하다는 점이 다름
- 괄호 ()를 사용하거나 쉼표 ,로 구분해서 생성한다.
info = ("홍길동", 25, True)
2️⃣ 다양한 타입의 혼합 사용 가능
튜플은 여러 타입의 데이터를 함께 저장할 수 있으며, 문자열, 숫자, 불리언, 리스트, 딕셔너리, 또 다른 튜플까지 가능하다.
t = ("Python", 3.10, True, [1, 2, 3], {"a": 1}, (10, 20))
→ 하나의 튜플에 이렇게 다양한 타입을 넣는 게 가능하고, 각각의 인덱스를 통해 꺼내서 사용할 수 있다.
3️⃣ 인덱싱(Indexing)
튜플의 각 요소에는 인덱스가 0부터 부여되며, 튜플[인덱스] 형식으로 개별 요소에 접근
colors = ("red", "blue", "green")
print(colors[0]) # red
print(colors[2]) # green
print(colors[-1]) # green (끝에서부터 접근)
4️⃣ 슬라이싱(Slicing)
- 튜플[시작:끝] → 끝 인덱스는 포함하지 않는다.
- 일부 요소만 추출할 수 있다.
colors = ("red", "blue", "green", "yellow", "purple")
print(colors[1:4]) # ('blue', 'green', 'yellow')
print(colors[:3]) # ('red', 'blue', 'green')
print(colors[::2]) # ('red', 'green', 'purple')
5️⃣ 불변성 (immutable)
nums = (1, 2, 3)
# nums[0] = 10 ❌ TypeError 발생: 튜플은 수정 불가!
- 튜플을 변경하려고 하면 에러가 발생한다.
- 하지만 내부에 가변 타입(리스트 등)이 있으면 수정이 가능하다.
t = (1, 2, [3, 4])
t[2][0] = 99
print(t) # (1, 2, [99, 4])
6️⃣ 단일 요소 튜플
단일 요소의 튜플을 조심해야 한다.
a = (5)
print(type(a)) # int
b = (5,)
print(type(b)) # tuple ✅
7️⃣ 튜플의 주요 활용
✅ 함수에서 여러 값 반환
def get_user():
return ("홍길동", 25)
name, age = get_user()
✅ 딕셔너리의 키로 사용 가능
location = {}
key = (37.5665, 126.9780)
location[key] = "서울" # 가능: 튜플은 불변이니까!
8️⃣ 튜플과 리스트 비교
항목 | 튜플(Tuple) | 리스트(List) |
괄호 | () | [] |
수정 가능성 | ❌ 불가능 | ✅ 가능 |
속도 | 더 빠름 | 상대적으로 느림 |
메모리 | 더 적게 사용 | 더 많이 사용 |
사용 목적 | 고정값 저장, 딕셔너리 키 등 | 유동적 데이터 저장 |
함수 반환 | 여러 값 반환에 자주 사용 | 데이터 조작에 자주 사용 |
⚙️ 요약 정리
항목 | 설명 |
정의 | 여러 값을 순서 있게 저장하는 불변 자료형 |
생성 방법 | (1, 2, 3) 또는 1, 2, 3 (쉼표가 핵심) |
단일 튜플 | (1,) ← 쉼표 꼭 필요 |
인덱싱 | t[0], t[-1] 등으로 요소 접근 |
슬라이싱 | t[1:3], t[::2] 등으로 부분 추출 |
다양한 타입 저장 | 문자열, 숫자, 리스트 등 자유롭게 혼합 가능 |
불변성 | 요소 변경 ❌ (리스트와 가장 큰 차이점) |
활용 | 함수 다중 반환, 딕셔너리 키, 안전한 상수 데이터 |
사실 파이썬(Python)의 여러 특징 중 하나라고 할 수 있는 것이 튜플이라고 말 할 수 있을 것 같은데, 튜플이 어떤 경우에 사용되는지를 먼저 예시를 통해 알아보면 이해하는데 좋을 것 같아서 튜플이 사용되는 케이스들을 정리해보았다.
✅ 튜플 사용 케이스
1️⃣ 함수에서 여러 값 반환할 때
튜플은 다중 값 반환에 가장 많이 사용되는 구조라고 할 수 있다.
def get_user_info():
name = "홍길동"
age = 30
return (name, age) # 튜플로 반환
n, a = get_user_info()
print(n, a) # 홍길동 30
→ 값을 그룹으로 묶어서 한번에 리턴 → 리스트보다 안정적이고, 해체(unpacking)도 쉽다.
2️⃣ 변하지 않아야 하는 데이터를 묶을 때
수정되면 안 되는 고정된 설정값, 좌표, 날짜 등을 표현할 때 튜플이 적합하다.
pi_info = ("π", 3.14159)
coordinates = (37.5, 126.9) # 위도, 경도
birthday = (1999, 12, 25) # 생년월일
→ 불변성이 보장되기에 수정되면 안 되는 데이터들이 변하는 오류가 발생할 확률을 낮출 수 있다.
3️⃣ 딕셔너리의 키로 사용할 때
딕셔너리의 키는 불변(immutable)만 가능 → 리스트는 ❌, 튜플은 ✅
populations = {
("서울", "강남구"): 538000,
("서울", "종로구"): 160000
}
→ 튜플은 구조적 키로 활용할 수 있어 복잡한 정보를 키로 사용할 수 있다.
4️⃣ 리스트보다 빠르고 메모리 적게 쓸 때
반복문에서 데이터가 바뀌지 않는다면 리스트보다 튜플이 더 적합하다. 하지만 데이터가 바뀌지 않는다는 것을 확신하고 사용해야 한다.
colors = ("red", "green", "blue") # 수정 불필요한 고정 목록
for color in colors:
print(color)
→ 튜플이 더욱 가볍고 빠르게 처리가 가능하다는 장점이 있다.
5️⃣ 데이터 구조를 표현할 때 (데이터베이스 Row, Record 등)
테이블의 각 행(row)이 튜플로 표현하기 좋다. 아래 예시들을 통해 살펴보자.
user = ("홍길동", "hong@example.com", "서울")
혹은 여러 튜플을 리스트에 넣어 2차원 구조로 표현할 수도 있다.
users = [
("홍길동", "hong@example.com"),
("김철수", "kim@example.com"),
]
6️⃣ 튜플 언패킹을 활용한 코드 간결화
튜플은 여러 개의 값을 한번에 변수에 할당하는 데 유리할 수 있다.
point = (3, 4)
x, y = point
print(x, y) # 3 4
또는 반복문에서 언패킹
people = [("홍길동", 25), ("김철수", 30)]
for name, age in people:
print(f"{name}의 나이는 {age}")
7️⃣ 불변성을 활용한 안전한 데이터 전달
함수나 모듈 간 데이터 전달 시, 실수로 내용이 바뀌는 걸 방지하고 싶을 때 사용할 수 있다.
def print_config(config):
# config 내용 변경 안됨 → 안전
print("설정값:", config)
config = ("dark mode", True, 80)
print_config(config)
8️⃣ namedtuple을 활용한 구조체 형태 표현
이름 붙인 튜플로 필드 접근을 더 직관적으로 만들 수 있다.
from collections import namedtuple
User = namedtuple("User", "name email age")
u = User("홍길동", "hong@example.com", 25)
print(u.name) # 홍길동
print(u.email) # hong@example.com
→ 튜플을 구조체처럼 사용이 가능하다. 객체 지향처럼 사용하면서, 튜플의 특성을 유지할 수 있다.
⚙️ 튜플 사용 케이스 요약
사용 케이스 | 이유 |
함수 다중 반환 | 여러 값을 그룹으로 안전하게 전달 |
고정 데이터 표현 | 불변성을 이용한 실수 방지 |
딕셔너리 키 | 튜플은 불변 → 딕셔너리 키로 사용 가능 |
반복문 데이터 | 수정할 필요 없는 시퀀스라면 튜플이 더 효율적 |
데이터 레코드 표현 | DB row, 설정값 등 구조적 데이터에 적합 |
변수 언패킹 | 여러 변수에 동시에 값 할당 |
안전한 함수 전달 | 외부 함수에서 실수로 데이터 변경 막기 |
namedtuple | 필드명 있는 튜플로 가독성 향상 |
튜플(Tuple)이라는 개념까지 정리하면서 학습해보았다. 아직 기초적인 내용도 다룰 개념들이 많이 남아서 디렉토리(Dictionary)부터 연산자, 조건문, 반복문의 내용까지 학습해볼 예정이다. 기초적인 개념을 학습하고 연산자, 조건문, 반복문 등을 학습할 때는 예시 코드들을 많이 다루며 학습을 진행하는 것이 좋을 것 같다.
본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.
'클라우드(Cloud)' 카테고리의 다른 글
[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 9주차 - 파이썬 기초 3 (Python Basic 3) (0) | 2025.05.21 |
---|---|
[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 9주차 - 파이썬 기초 2 (Python Basic 2) (0) | 2025.05.21 |
[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 8주차 - 리액트 2 (React 2) (0) | 2025.05.20 |
[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 8주차 - 리액트 1 (React 1) (0) | 2025.05.20 |
[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 7주차 - JavaScript Advanced 2 (자바스크립트 심화 2) (1) | 2025.05.14 |