TIL/[TIL]

[TIL]Python 개발 환경과 기본 자료형

namerong 2026. 7. 13. 16:17

이번 학습에서는 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. 핵심 정리

  1. Python 프로젝트에서는 가상환경을 사용해 패키지와 버전을 분리하는 것이 좋다.
  2. conda는 환경/패키지 관리 도구이고, Anaconda는 여러 도구와 라이브러리를 묶은 배포판이다.
  3. Jupyter Notebook은 .ipynb 파일로 실습과 결과 확인에 적합하다.
  4. Python의 bool 값은 True, False처럼 첫 글자를 대문자로 쓴다.
  5. list는 순서가 있고 변경 가능하며 중복을 허용한다.
  6. tuple은 순서가 있지만 변경할 수 없는 자료형이다.
  7. dict는 key-value 구조이며 Java의 Map, JSON 구조와 비슷하다.
  8. Python 함수는 일급 객체라서 변수나 dict에 담아 사용할 수 있다.
  9. set은 중복을 허용하지 않고 순서가 없는 자료형이다.
  10. set은 중복 제거와 합집합, 교집합, 차집합 같은 집합 연산에 유용하다.
  11. iterable은 반복 가능한 객체이며, iter()와 next()로 값을 하나씩 꺼낼 수 있다.