Skip to content

Commit 73dca65

Browse files
committed
Update Appendix.md
1 parent d0a4c05 commit 73dca65

File tree

1 file changed

+72
-6
lines changed

1 file changed

+72
-6
lines changed

docs/Appendix.md

Lines changed: 72 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Python 프로젝트를 효율적으로 관리하려면 **Poetry** 또는 **UV**
2020
- **UV**: 빠르고 가벼운 패키지 관리 도구로, 기존 패키지 관리자보다 빠른 설치 속도를 제공한다.
2121

2222
### 사용 예시
23+
2324
```bash
2425
poetry init # 새 프로젝트 초기화
2526
poetry add requests # 패키지 추가
@@ -28,10 +29,21 @@ poetry run python main.py # 가상 환경에서 실행
2829

2930
## **타입 힌트(Type Hints) 활용**
3031

31-
Python은 동적 타입 언어이지만, **타입 힌트를 활용하면 코드의 가독성을 높이고 버그를 줄일 수 있다.**
32+
| 타입 미사용 | 타입 힌트 사용 |
33+
| ---------------------------------- | ------------------------------------ |
34+
| 코드 가독성이 낮음 | 코드 가독성이 높아짐 |
35+
| 실행 중 오류를 발견해야 함 | 정적 분석을 통해 사전 오류 감지 가능 |
36+
| IDE 자동 완성 기능이 제한적 | IDE 자동 완성이 더 정확하게 동작 |
37+
| 협업 시 코드 이해가 어려울 수 있음 | 협업 시 타입이 명확하여 이해가 쉬움 |
38+
39+
Python에서는 타입을 명시하지 않아도 동작하지만, 제네릭과 타입 힌트를 사용하면 코드의 안정성과 가독성이 높아진다. 특히 대규모 프로젝트나 협업 시에는 타입 힌트가 필수적이다.
40+
41+
### **타입 힌트(Type Hints) 활용**
42+
3243
Python 3.5에서 도입.
3344

34-
### 타입 힌트 적용 예시
45+
#### 타입 힌트 적용 예시
46+
3547
```python
3648
def add(x: int, y: int) -> int:
3749
return x + y
@@ -40,28 +52,81 @@ def fetch_data(url: str) -> dict[str, str]:
4052
return {"data": "example"}
4153
```
4254

43-
- 타입 힌트를 사용하면 코드 자동 완성과 정적 분석이 더 효과적으로 동작한다.
44-
- `mypy` 같은 정적 분석 도구를 사용하면 타입 관련 오류를 미리 감지할 수 있다.
55+
### **제네릭(Generic) 활용**
56+
57+
제네릭(Generic)은 여러 가지 타입을 유연하게 처리할 수 있도록 도와준다. Python에서는 `TypeVar` 또는 Python 3.12부터 제공되는 `[T]` 문법을 이용하여 제네릭을 사용할 수 있다.
58+
59+
#### **제네릭 없이 타입을 지정한 경우**
60+
61+
```python
62+
class IntBox:
63+
def __init__(self, value: int) -> None:
64+
self.value = value
65+
66+
def get_value(self) -> int:
67+
return self.value
68+
```
69+
70+
`IntBox``int` 타입만 저장할 수 있다.
71+
72+
#### **제네릭을 활용한 코드 (Python 3.11 이하)**
73+
74+
```python
75+
from typing import TypeVar, Generic
76+
77+
T = TypeVar("T") # 제네릭 타입 변수
78+
79+
class Box(Generic[T]):
80+
def __init__(self, value: T) -> None:
81+
self.value = value
82+
83+
def get_value(self) -> T:
84+
return self.value
85+
```
86+
87+
`Box` 클래스는 여러 타입을 저장할 수 있다. (예: `Box[int]`, `Box[str]`, `Box[float]`)
88+
89+
#### **Python 3.12에서 개선된 제네릭 문법**
90+
91+
```python
92+
class Box[T]: # TypeVar 없이 바로 사용 가능
93+
def __init__(self, value: T) -> None:
94+
self.value = value
95+
96+
def get_value(self) -> T:
97+
return self.value
98+
```
99+
100+
`T = TypeVar("T")` 선언 없이 더 간결한 문법으로 제네릭 클래스를 작성할 수 있다.
101+
102+
제네릭을 활용하면 타입의 유연성을 높이고 코드의 재사용성을 향상시킬 수 있다.
45103

46104
## **코드 스타일 유지: Linter 및 Formatter 사용**
47105

48106
일관된 코드 스타일을 유지하려면 **Linter****Formatter**를 활용하는 것이 중요하다.
49107

50-
- **Linter (예: flake8, pylint)**: 코드의 잠재적인 오류와 스타일 위반 사항을 자동으로 감지한다.
51-
- **Formatter (예: black, ruff)**: 코드 스타일을 자동으로 일관되게 유지해준다.
108+
| 분류 | 역할 | 대표 도구 |
109+
| ------------------ | ---------------------------------- | -------------------------- |
110+
| **Linter** | 코드 스타일 검사 및 오류 감지 | `flake8`, `pylint`, `ruff` |
111+
| **Formatter** | 코드 스타일 자동 정리 | `black`, `ruff` |
112+
| **정적 타입 체커** | 타입 오류 검사 및 타입 안정성 보장 | `mypy` |
52113

53114
### 사용 예시
115+
54116
```bash
55117
pip install black flake8
56118
black my_script.py # 코드 자동 포맷팅
57119
flake8 my_script.py # 코드 스타일 검사
58120
```
59121

122+
일부는 VSC 같은곳에서 Extensions으로 설치하여 사용도 가능하다.
123+
60124
## **`unittest` 대신 `pytest` 사용**
61125

62126
Python의 기본 테스트 프레임워크인 `unittest`보다 **`pytest`**를 사용하는 것이 더 간편하고 강력하다.
63127

64128
### `pytest` 사용 예시
129+
65130
```python
66131
# test_example.py
67132

@@ -71,6 +136,7 @@ def add(x: int, y: int) -> int:
71136
def test_add():
72137
assert add(2, 3) == 5
73138
```
139+
74140
```bash
75141
pytest test_example.py # 테스트 실행
76142
```

0 commit comments

Comments
 (0)