Skip to content

Commit 455dc9f

Browse files
author
jammy
committed
refactor(py-lessons): compact overly long step explanations
1 parent d22b0ef commit 455dc9f

49 files changed

Lines changed: 319 additions & 319 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/backend/prisma/content/python/lessons/py-1-1.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"steps": [
88
{
99
"title": "Hello World",
10-
"explanation": "**`print(\"Hello, Python!\")`** -- 파이썬의 내장 함수 `print()`를 호출합니다.\n\n이 한 줄이 파이썬의 첫 번째 프로그램입니다. 괄호 안의 문자열 `\"Hello, Python!\"`을 화면(콘솔)에 출력합니다.\n\n**왜 이렇게 간단한가?** C언어는 `#include <stdio.h>`와 `main()` 함수가 필요하고, Java는 `public class`와 `public static void main`이 필요합니다. 하지만 파이썬은 이런 준비 과정 없이 **첫 줄부터 바로 실행**됩니다. 이것이 파이썬의 최대 장점인 '심플함'입니다.\n\n**Python 내부 동작:** `print()` 함수는 내부적으로 인자의 `__str__()` 메서드를 호출해 문자열로 변환한 뒤, `sys.stdout`(표준 출력 스트림)에 씁니다. 문자열은 이미 문자열이므로 변환 없이 바로 출력됩니다.\n\n**주의:** `print`는 함수이므로 반드시 괄호 `()`를 붙여야 합니다. `print \"hello\"`는 Python 2 문법이며, Python 3에서는 `SyntaxError`가 발생합니다.",
10+
"explanation": "**`print(\"Hello, Python!\")`** -- 파이썬의 내장 함수 `print()`를 호출합니다.\n\n이 한 줄이 파이썬의 첫 번째 프로그램입니다. 괄호 안의 문자열 `\"Hello, Python!\"`을 화면(콘솔)에 출력합니다.",
1111
"visualizationType": "pythonMemory",
1212
"code": "print(\"Hello, Python!\")",
1313
"pythonMemoryState": {
@@ -20,7 +20,7 @@
2020
},
2121
{
2222
"title": "변수는 이름표다",
23-
"explanation": "**`message = \"Python is fun\"`** -- 변수를 생성하고 문자열 객체에 연결합니다.\n\n이 코드가 실행되면 두 가지 일이 순서대로 일어납니다:\n1. 먼저 메모리에 문자열 객체 `\"Python is fun\"`이 생성됩니다.\n2. 그 다음 `message`라는 **이름표(label)**가 그 객체에 붙습니다.\n\n**비유:** 마트에서 진열된 상품(객체)에 가격표(변수)를 딱 붙이는 것과 같습니다. 가격표 자체가 상품은 아니죠! 가격표를 떼어내도 상품은 여전히 존재하고, 다른 가격표를 붙일 수도 있습니다.\n\n**Python 내부 동작:** 파이썬은 먼저 `str` 타입 객체를 힙(heap) 메모리에 할당합니다. 이 객체에는 참조 카운트(reference count)가 1로 설정됩니다. 그런 다음 현재 네임스페이스(여기서는 전역 네임스페이스)의 딕셔너리에 `{\"message\": <객체 주소>}` 항목이 추가됩니다.\n\n**다른 언어와의 차이:** C나 Java에서는 `int a = 10;`처럼 타입을 먼저 선언해야 하지만, 파이썬은 타입 선언이 필요 없습니다. 타입은 변수가 아니라 **객체**가 가지고 있기 때문입니다 (동적 타이핑).",
23+
"explanation": "**`message = \"Python is fun\"`** -- 변수를 생성하고 문자열 객체에 연결합니다.\n\n이 코드가 실행되면 두 가지 일이 순서대로 일어납니다:\n1. 먼저 메모리에 문자열 객체 `\"Python is fun\"`이 생성됩니다.\n2. 그 다음 `message`라는 **이름표(label)**가 그 객체에 붙습니다.",
2424
"visualizationType": "pythonMemory",
2525
"code": "message = \"Python is fun\"",
2626
"pythonMemoryState": {
@@ -43,7 +43,7 @@
4343
},
4444
{
4545
"title": "변수에 저장된 값 출력",
46-
"explanation": "**`print(message)`** -- `message` 이름표가 가리키는 객체의 값을 출력합니다.\n\n`print()`에 변수 이름 `message`를 전달하면, 파이썬은 먼저 `message`가 가리키는 객체를 찾아갑니다. 이것을 **역참조(Dereference)**라고 합니다. 이름표를 따라가서 실제 상품(객체)을 찾는 과정이죠.\n\n**왜 따옴표 없이 쓰는가?** `print(\"message\")`라고 쓰면 문자열 리터럴 `message`라는 글자가 그대로 출력됩니다. 하지만 `print(message)`는 변수 `message`가 가리키는 **객체의 값** 인 `Python is fun`을 출력합니다. 따옴표 유무가 결과를 완전히 바꿉니다.\n\n **Python 내부 동작:** 파이썬 인터프리터는 네임스페이스 딕셔너리에서 `\"message\"` 키를 조회하고, 해당 객체의 메모리 주소를 가져옵니다. 그런 다음 그 주소에 있는 `str` 객체의 내용을 `sys.stdout`에 출력합니다.\n\n **주의:** 정의되지 않은 변수를 사용하면 `NameError: name 'xxx' is not defined` 에러가 발생합니다. ",
46+
"explanation": "**`print(message)`** -- `message` 이름표가 가리키는 객체의 값을 출력합니다.\n\n`print()`에 변수 이름 `message`를 전달하면, 파이썬은 먼저 `message`가 가리키는 객체를 찾아갑니다. 이것을 **역참조(Dereference)**라고 합니다. 이름표를 따라가서 실제 상품(객체)을 찾는 과정이죠.",
4747
"visualizationType": "pythonMemory",
4848
"code": "print(message)",
4949
"pythonMemoryState": {
@@ -91,7 +91,7 @@
9191
},
9292
{
9393
"title": "이름표 공유 (Aliasing)",
94-
"explanation": "**`b = a`** -- `a`가 가리키는 리스트 객체에 `b`라는 새 이름표를 하나 더 붙입니다.\n\n이 줄은 리스트를 **복사하지 않습니다!** `b`는 `a`와 **정확히 같은 리스트 객체**를 가리킵니다. 하나의 리스트에 `a`와 `b` 두 개의 이름표가 붙어 있는 상태입니다. 이것을 **앨리어싱(Aliasing)**이라고 합니다.\n\n**비유:** 한 사람에게 '본명'과 '별명'이 있는 것과 같습니다. \"김철수\"를 \"철수\"라고 불러도 같은 사람이죠. `a`와 `b`도 같은 객체의 다른 이름일 뿐입니다.\n\n**왜 위험한가?** `b`를 통해 리스트를 수정하면 `a`로 확인해도 변경된 내용이 보입니다! 예를 들어 `b.append(4)`를 하면 `a`도 `[1, 2, 3, 4]`가 됩니다. 같은 객체이니까요.\n\n**Python 내부 동작:** `b = a` 실행 시, 파이썬은 `a`가 가리키는 객체의 참조 카운트를 1 증가시킵니다 (1 -> 2). 새로운 메모리 할당은 전혀 일어나지 않습니다. 네임스페이스에 `{\"b\": <같은 주소>}`만 추가됩니다.\n\n**주의:** 독립적인 복사본을 만들려면 `b = a[:]`, `b = list(a)`, 또는 `b = a.copy()`를 사용해야 합니다.",
94+
"explanation": "**`b = a`** -- `a`가 가리키는 리스트 객체에 `b`라는 새 이름표를 하나 더 붙입니다.\n\n이 줄은 리스트를 **복사하지 않습니다!** `b`는 `a`와 **정확히 같은 리스트 객체**를 가리킵니다. 하나의 리스트에 `a`와 `b` 두 개의 이름표가 붙어 있는 상태입니다. 이것을 **앨리어싱(Aliasing)**이라고 합니다.",
9595
"keyInsight": "변수 할당 = 이름표 달기",
9696
"visualizationType": "pythonMemory",
9797
"code": "b = a",
@@ -132,7 +132,7 @@
132132
},
133133
{
134134
"title": "b의 객체 ID 확인",
135-
"explanation": "**`print(id(b))`** -- `b`가 가리키는 객체의 고유 ID를 출력합니다.\n\n**결과가 같습니다!** `a`의 ID와 `b`의 ID가 동일한 값(`2002`)으로 출력됩니다. 이것은 `a`와 `b`가 **정확히 같은 메모리 주소에 있는 같은 객체**를 가리킨다는 확실한 증거입니다.\n\n**핵심 정리:**\n- `b = a`는 객체를 복사하는 것이 아니라, 같은 객체에 **이름표를 하나 더 붙이는 것**입니다.\n- `id(a) == id(b)`이면 두 변수는 같은 객체를 가리킵니다.\n- 이것을 확인하는 더 간단한 방법은 `a is b`를 사용하는 것입니다 (`True` 반환).\n\n**Python 내부 동작:** `is` 연산자는 내부적으로 두 객체의 `id()` 값을 비교합니다. `a is b`는 `id(a) == id(b)`와 완전히 동일합니다.\n\n**주의:** `==`은 값이 같은지, `is`는 같은 객체인지를 확인합니다. `[1,2,3] == [1,2,3]`은 `True`이지만, `[1,2,3] is [1,2,3]`은 `False`입니다 (서로 다른 두 객체).",
135+
"explanation": "**`print(id(b))`** -- `b`가 가리키는 객체의 고유 ID를 출력합니다.\n\n**결과가 같습니다!** `a`의 ID와 `b`의 ID가 동일한 값(`2002`)으로 출력됩니다. 이것은 `a`와 `b`가 **정확히 같은 메모리 주소에 있는 같은 객체**를 가리킨다는 확실한 증거입니다.",
136136
"visualizationType": "pythonMemory",
137137
"code": "print(id(b))",
138138
"pythonMemoryState": {

0 commit comments

Comments
 (0)