본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

Python 문서
Python
시작하기기본 문법타입과 데이터모듈과 패키지오류 처리와 테스트핵심 개념
토론

Python 안내서 · 3/6

타입과 데이터

Python에는 숫자, 문자열, 불리언 같은 기본 타입과 함께 리스트, 튜플, 딕셔너리, 집합이라는 강력한 내장 컬렉션이 있습니다. 이 장에서는 이 타입들을 언제 어떻게 쓰는지, 직접 타입을 만드는 클래스와 데이터클래스, 그리고 코드의 의도를 드러내는 타입 힌트를 다룹니다.

기본 타입

타입예설명
int42, 1_000_000정수. 크기 제한이 없습니다
float3.14, 1e-3부동소수점 수
str"hello", '안녕'유니코드 문자열. 바꿀 수 없습니다
boolTrue, False불리언
NoneNone값이 없음을 나타내는 유일한 값
7 / 2      # 3.5  (나눗셈은 항상 float)
7 // 2     # 3    (몫)
7 % 2      # 1    (나머지)
2 ** 100   # 아주 큰 정수도 정확히 계산합니다

text = "Python"
text[0]        # 'P'
text[-1]       # 'n'
text[1:4]      # 'yth'  (슬라이싱)
"py" in text.lower()  # True

value = None
if value is None:      # None 비교는 == 가 아니라 is 를 씁니다
    print("값 없음")

빈 문자열, 0, 빈 컬렉션, None은 조건식에서 거짓으로 취급됩니다. 그래서 if items:처럼 쓰면 "리스트가 비어 있지 않으면"이라는 뜻이 됩니다.

컬렉션

네 가지 내장 컬렉션은 쓰임새가 분명히 다릅니다.

  • 리스트 list: 순서가 있고 바꿀 수 있는 목록입니다. 가장 많이 씁니다.
  • 튜플 tuple: 순서가 있지만 바꿀 수 없습니다. 좌표나 함수의 여러 반환값처럼 고정된 묶음에 씁니다.
  • 딕셔너리 dict: 키로 값을 찾는 표입니다. 넣은 순서가 유지됩니다.
  • 집합 set: 중복 없는 값의 모음입니다. 포함 여부 확인과 합집합·교집합 계산이 빠릅니다.
nums = [3, 1, 2]
nums.append(4)
nums.sort()             # [1, 2, 3, 4]

point = (10, 20)
x, y = point            # 튜플 풀기

ages = {"mina": 31, "joon": 28}
ages["sara"] = 25
ages.get("tom", 0)      # 키가 없으면 기본값 0
for name, age in ages.items():
    print(name, age)

tags = {"python", "web", "python"}
tags                    # {'python', 'web'}
tags & {"web", "api"}   # {'web'}  (교집합)

리스트와 딕셔너리는 바뀌는(mutable) 객체이므로, 다른 변수에 대입해도 복사되지 않고 같은 객체를 함께 가리킵니다. 따로 바꾸고 싶다면 nums.copy()나 dict(ages)로 복사합니다.

클래스와 데이터클래스

클래스는 class로 정의합니다. __init__ 메서드가 생성자 역할을 하고, 메서드의 첫 매개변수 self가 인스턴스 자신을 가리킵니다.

class Account:
    def __init__(self, owner: str, balance: int = 0) -> None:
        self.owner = owner
        self.balance = balance

    def deposit(self, amount: int) -> None:
        if amount <= 0:
            raise ValueError("amount must be positive")
        self.balance += amount

    def __repr__(self) -> str:
        return f"Account({self.owner!r}, {self.balance})"


acc = Account("mina")
acc.deposit(100)
print(acc)   # Account('mina', 100)

데이터를 담는 것이 주목적인 클래스라면 표준 라이브러리의 dataclasses가 훨씬 간단합니다. 필드를 타입 힌트와 함께 적기만 하면 __init__, __repr__, __eq__를 자동으로 만들어 줍니다. frozen=True를 주면 만든 뒤 바꿀 수 없는 객체가 됩니다.

from dataclasses import dataclass, field


@dataclass
class Order:
    id: int
    customer: str
    items: list[str] = field(default_factory=list)
    paid: bool = False


@dataclass(frozen=True)
class Point:
    x: float
    y: float


order = Order(1, "mina")
order.items.append("book")
print(order)                       # Order(id=1, customer='mina', items=['book'], paid=False)
Point(1, 2) == Point(1, 2)         # True

타입 힌트

Python은 동적 타입 언어지만, 변수와 함수에 타입 힌트를 붙일 수 있습니다. 힌트는 실행 중에 검사되지 않으며, 편집기의 자동 완성과 mypy·Pyright 같은 정적 검사 도구가 활용합니다. 규모가 커질수록 버그를 미리 잡는 데 큰 도움이 됩니다.

from typing import Optional


def find_user(users: dict[str, int], name: str) -> int | None:
    return users.get(name)


def average(values: list[float]) -> float:
    return sum(values) / len(values) if values else 0.0


scores: list[int] = [90, 85]
lookup: dict[str, tuple[int, int]] = {"origin": (0, 0)}
maybe: Optional[str] = None   # str | None 과 같습니다
python -m pip install mypy
mypy app.py

정리

  • 기본 타입은 int, float, str, bool, None이며, None 비교에는 is를 씁니다.
  • 바꾸는 목록은 리스트, 고정된 묶음은 튜플, 키로 찾는 표는 딕셔너리, 중복 없는 모음은 집합을 씁니다.
  • 동작이 있는 객체는 클래스로, 데이터 묶음은 @dataclass로 간단히 정의합니다.
  • 타입 힌트는 실행에 영향을 주지 않지만, 편집기와 정적 검사 도구가 활용해 버그를 일찍 찾아 줍니다.
이 장에 대해 질문이 있나요?
이전 장기본 문법다음 장모듈과 패키지

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.