이번 학습에서는 Python 실행 환경을 준비하는 방법과 기본 자료형을 정리했다.
특히 가상환경, Jupyter Notebook, Python의 자료형 구조를 학습했고, dict와 set은 Java의 Map, Set과 비교하면서 조금 더 자세히 정리했다.
1. Python 개발 환경
Python은 프로젝트마다 사용하는 라이브러리 버전이 달라질 수 있다.
그래서 하나의 전역 환경에 모든 패키지를 설치하기보다, 프로젝트별로 독립된 가상환경을 만들어 사용하는 것이 좋다.
가상환경을 사용하면 다음과 같은 장점이 있다.
- 프로젝트별 패키지 버전을 분리할 수 있다.
- 다른 프로젝트의 라이브러리와 충돌을 줄일 수 있다.
- 필요한 패키지만 설치해서 환경을 깔끔하게 유지할 수 있다.
자주 쓰는 명령어는 다음 두 가지다.
conda activate py_env
conda deactivate
conda activate py_env는 py_env라는 가상환경으로 진입하는 명령어이고,
conda deactivate는 현재 가상환경에서 빠져나오는 명령어다.
2. Conda와 Anaconda 차이
conda와 Anaconda는 이름이 비슷해서 헷갈리기 쉽다.
Conda
conda는 패키지 관리와 가상환경 관리를 해주는 도구다.
즉,
- 가상환경 생성
- 가상환경 활성화
- 패키지 설치
- 패키지 버전 관리
를 담당한다.
conda create -n py_env python=3.12
conda activate py_env
conda install numpy
이런 식으로 사용한다.
Anaconda
Anaconda는 Python 데이터 분석/AI 개발에 필요한 도구들을 한 번에 묶어둔 배포판이다.
Anaconda를 설치하면 보통 다음 도구들이 함께 포함된다.
- Python
- conda
- Jupyter Notebook
- numpy
- pandas
- matplotlib
- scikit-learn 등
즉, conda는 도구이고, Anaconda는 그 도구와 여러 패키지를 포함한 큰 묶음이라고 보면 된다.
차이 정리
| 구분 | Conda | Anaconda |
| 의미 | 패키지/환경 관리 도구 | Python 데이터 분석용 배포판 |
| 역할 | 가상환경 생성, 패키지 설치 | Python, conda, 주요 라이브러리 일괄 제공 |
| 장점 | 가볍게 필요한 것만 설치 가능 | 처음 세팅이 편함 |
| 단점 | 필요한 패키지를 직접 설치해야 함 | 용량이 크고 불필요한 패키지도 많을 수 있음 |
처음 학습할 때는 Anaconda가 편하고, 익숙해지면 Miniconda나 conda만 사용해서 필요한 패키지만 설치하는 방식도 많이 쓴다.
3. Jupyter Notebook
Jupyter Notebook은 Python 코드를 셀 단위로 실행할 수 있는 개발 환경이다.
.py 파일은 일반 Python 파일이고,
.ipynb 파일은 Jupyter Notebook 파일이다.
| 확장자 | 의미 |
| .py | 일반 Python 코드 파일 |
| .ipynb | Jupyter Notebook 파일 |
Jupyter Notebook은 코드 실행 결과를 바로 확인할 수 있어서 데이터 분석, AI 실습, 시각화 학습에 자주 사용된다.
가상환경에서 Jupyter를 사용하려면 notebook과 kernel 설정이 필요하다.
pip install jupyter notebook
pip install ipykernel
그리고 현재 가상환경을 Jupyter 커널로 등록한다.
python -m ipykernel install --user --name py_env --display-name py_env
이렇게 하면 Jupyter Notebook에서 py_env 커널을 선택해 해당 가상환경 기준으로 코드를 실행할 수 있다.
4. Python 기본 자료형
Python의 기본 자료형은 숫자, 문자열, 불리언, 리스트, 튜플, 딕셔너리, 집합 등으로 나눌 수 있다.
| 자료형 | 예시 | 특징 |
| int | 10 | 정수 |
| float | 3.14 | 실수 |
| bool | True, False | 참/거짓 |
| str | "hello" | 문자열 |
| list | [1, 2, 3] | 순서 있음, 변경 가능 |
| tuple | (1, 2, 3) | 순서 있음, 변경 불가 |
| dict | {"name": "kim"} | key-value 구조 |
| set | {1, 2, 3} | 중복 없음, 순서 없음 |
Python에서 bool 값은 JavaScript처럼 true, false가 아니라 True, False처럼 첫 글자를 대문자로 쓴다.
is_active = True
is_deleted = False
5. 시퀀스 자료형
시퀀스형은 순서가 있는 자료형이다.
순서가 있기 때문에 인덱싱과 슬라이싱이 가능하다.
대표적인 시퀀스 자료형은 다음과 같다.
- str
- list
- tuple
인덱싱
인덱싱은 특정 위치의 값을 꺼내는 것이다.
name = "Python"
print(name[0]) # P
print(name[1]) # y
Python은 0번부터 인덱스가 시작한다.
뒤에서부터 접근할 때는 음수 인덱스를 사용할 수 있다.
print(name[-1]) # n
슬라이싱
슬라이싱은 범위를 잘라서 가져오는 것이다.
name = "Python"
print(name[0:2]) # Py
print(name[2:]) # thon
print(name[:3]) # Pyt
[시작:끝] 구조에서 끝 인덱스는 포함되지 않는다.
6. List
list는 여러 값을 순서대로 저장하는 자료형이다.
nums = [1, 2, 3, 4]
특징은 다음과 같다.
- 순서가 있다.
- 중복을 허용한다.
- 값을 추가, 수정, 삭제할 수 있다.
- 대괄호 []를 사용한다.
nums = [1, 2, 3]
nums.append(4)
nums[0] = 10
print(nums) # [10, 2, 3, 4]
Java의 ArrayList와 비슷한 느낌으로 볼 수 있다.
다만 Python의 list는 서로 다른 타입의 값도 함께 담을 수 있다.
data = [1, "hello", True]
7. Tuple
tuple은 list와 비슷하게 순서가 있는 자료형이다.
하지만 한 번 만들면 값을 변경할 수 없다.
nums = (1, 2, 3)
특징은 다음과 같다.
- 순서가 있다.
- 중복을 허용한다.
- 값을 변경할 수 없다.
- 소괄호 ()를 사용한다.
point = (10, 20)
값이 바뀌면 안 되는 고정 데이터에 사용하기 좋다.
예를 들어 좌표, 설정값, 여러 값을 묶어 반환할 때 사용할 수 있다.
튜플에서 주의할 점은 값이 하나일 때 쉼표가 필요하다는 것이다.
a = (10) # int
b = (10,) # tuple
8. Dict
dict는 key-value 구조로 데이터를 저장하는 자료형이다.
Java의 Map, JavaScript의 객체, JSON 구조와 비슷하게 볼 수 있다.
user = {
"name": "홍길동",
"age": 20
}
특징은 다음과 같다.
- key-value 구조다.
- key는 중복될 수 없다.
- value는 중복될 수 있다.
- key를 통해 value를 빠르게 찾는다.
- 중괄호 {}를 사용한다.
값 조회
user = {
"name": "홍길동",
"age": 20
}
print(user["name"]) # 홍길동
없는 key를 []로 조회하면 KeyError가 발생할 수 있다.
# print(user["email"]) # KeyError
그래서 안전하게 조회할 때는 get()을 사용할 수 있다.
print(user.get("email")) # None
print(user.get("email", "없음")) # 없음
값 추가와 수정
dict는 mutable, 즉 변경 가능한 자료형이다.
user["email"] = "test@test.com"
user["age"] = 21
없는 key에 값을 넣으면 추가되고, 이미 있는 key에 값을 넣으면 수정된다.
값 삭제
age = user.pop("age")
pop()은 값을 삭제하면서 삭제된 value를 반환한다.
keys, values, items
dict는 반복할 때 자주 쓰는 메서드가 있다.
foods = {
"donut": "도넛",
"cake": "케이크",
"candy": "사탕"
}
print(foods.keys())
print(foods.values())
print(foods.items())
| 메서드 | 의미 |
| keys() | key만 반환 |
| values() | value만 반환 |
| items() | key-value 쌍 반환 |
반복문에서는 items()를 많이 쓴다.
for key, value in foods.items():
print(key, value)
dict가 중요한 이유
실제 개발에서는 dict를 굉장히 많이 사용한다.
API 응답, JSON 데이터, 설정값, 사용자 정보처럼 key-value 형태의 데이터가 많기 때문이다.
예를 들어 API 응답 데이터는 이런 식으로 다룰 수 있다.
response = {
"success": True,
"data": {
"productId": 1,
"name": "우유"
}
}
즉, Python에서 dict를 이해하면 JSON 형태의 데이터를 다루는 데 훨씬 익숙해질 수 있다.
9. 함수가 일급 객체라는 의미
Python에서는 함수도 값처럼 다룰 수 있다.
이것을 함수가 일급 객체라고 한다.
일급 객체라는 말은 대략 다음이 가능하다는 뜻이다.
- 함수를 변수에 담을 수 있다.
- 함수를 다른 함수의 인자로 전달할 수 있다.
- 함수를 dict의 value로 넣을 수 있다.
- 함수가 함수를 반환할 수 있다.
예를 들어 dict 안에 함수를 넣을 수 있다.
def add(a, b):
return a + b
calculator = {
"add": add
}
print(calculator["add"](10, 20)) # 30
이 구조는 나중에 조건문을 길게 쓰는 대신, key에 따라 실행할 함수를 선택하는 방식으로도 사용할 수 있다.
operation = "add"
result = calculator[operation](10, 20)
즉, 함수도 숫자나 문자열처럼 하나의 값으로 취급할 수 있다는 점이 Python의 중요한 특징이다.
10. Set
set은 중복을 허용하지 않는 자료형이다.
Java의 Set과 거의 같은 개념으로 보면 된다.
nums = {1, 2, 3, 3, 2}
print(nums) # {1, 2, 3}
특징은 다음과 같다.
- 중복을 허용하지 않는다.
- 순서가 없다.
- 인덱싱이 불가능하다.
- 중괄호 {}를 사용한다.
- 집합 연산에 유용하다.
주의할 점은 빈 {}는 set이 아니라 dict라는 것이다.
a = {} # dict
b = set() # set
빈 set을 만들 때는 반드시 set()을 사용해야 한다.
list에서 중복 제거하기
set은 중복 제거에 자주 사용된다.
nums = [1, 2, 3, 3, 2, 4]
unique_nums = set(nums)
print(unique_nums) # {1, 2, 3, 4}
다만 set은 순서를 보장하지 않는다.
중복 제거 후 정렬이 필요하면 sorted()를 함께 사용한다.
nums = [3, 1, 2, 3, 2]
result = sorted(set(nums))
print(result) # [1, 2, 3]
add, remove, discard
set에 값을 추가할 때는 add()를 사용한다.
nums = {1, 2, 3}
nums.add(4)
삭제할 때는 remove()나 discard()를 사용할 수 있다.
nums.remove(2)
remove()는 없는 값을 삭제하려고 하면 에러가 난다.
# nums.remove(100) # KeyError
반면 discard()는 없는 값을 삭제하려고 해도 에러가 나지 않는다.
nums.discard(100)
그래서 값이 있을 수도 있고 없을 수도 있는 상황에서는 discard()가 더 안전하다.
집합 연산
set은 수학의 집합처럼 연산할 수 있다.
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
| 연산 | 메서드 | 결과 |
| 합집합 | a.union(b) | {1, 2, 3, 4, 5, 6} |
| 교집합 | a.intersection(b) | {3, 4} |
| 차집합 | a.difference(b) | {1, 2} |
| 대칭차집합 | a.symmetric_difference(b) | {1, 2, 5, 6} |
set은 다음 상황에서 특히 유용하다.
- 중복 제거
- 포함 여부 검사
- 두 데이터 묶음의 공통값 찾기
- 한쪽에만 있는 값 찾기
예를 들어 두 사용자가 공통으로 가진 재료를 찾는다면 교집합을 사용할 수 있다.
my_items = {"우유", "계란", "양파"}
recipe_items = {"계란", "양파", "당근"}
print(my_items.intersection(recipe_items)) # {'계란', '양파'}
11. Iterable
이터러블은 반복 가능한 객체를 의미한다.
for문으로 순회할 수 있는 객체라고 생각하면 쉽다.
대표적인 iterable은 다음과 같다.
- list
- tuple
- str
- dict
- set
- range
nums = [1, 2, 3]
for num in nums:
print(num)
iter() 함수를 사용하면 iterable에서 iterator를 만들 수 있다.
nums = [1, 2, 3]
it = iter(nums)
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
이터러블은 반복 가능한 대상이고, 이터레이터는 next()로 값을 하나씩 꺼낼 수 있는 객체다.
12. 핵심 정리
- Python 프로젝트에서는 가상환경을 사용해 패키지와 버전을 분리하는 것이 좋다.
- conda는 환경/패키지 관리 도구이고, Anaconda는 여러 도구와 라이브러리를 묶은 배포판이다.
- Jupyter Notebook은 .ipynb 파일로 실습과 결과 확인에 적합하다.
- Python의 bool 값은 True, False처럼 첫 글자를 대문자로 쓴다.
- list는 순서가 있고 변경 가능하며 중복을 허용한다.
- tuple은 순서가 있지만 변경할 수 없는 자료형이다.
- dict는 key-value 구조이며 Java의 Map, JSON 구조와 비슷하다.
- Python 함수는 일급 객체라서 변수나 dict에 담아 사용할 수 있다.
- set은 중복을 허용하지 않고 순서가 없는 자료형이다.
- set은 중복 제거와 합집합, 교집합, 차집합 같은 집합 연산에 유용하다.
- iterable은 반복 가능한 객체이며, iter()와 next()로 값을 하나씩 꺼낼 수 있다.
'TIL > [TIL]' 카테고리의 다른 글
| [TIL]Python OOP, 모듈, 파일 입출력, 예외 처리와 NumPy 입문 (1) | 2026.07.15 |
|---|---|
| [TIL]Python 형변환, 제어문, 함수, 람다와 내장 함수 (0) | 2026.07.14 |
| [TIL]코드 컨벤션 재정리와 AWS RDS 기반 DB 서버 확인 (0) | 2026.06.26 |
| [TIL]Spring Security에서 CQRS 적용과 사용자 조회 흐름 (0) | 2026.06.24 |
| [TIL]Spring Security와 JWT 기반 인증 흐름 (0) | 2026.06.23 |