{
  "cells": [
    {
      "cell_type": "markdown",
      "execution_count": null,
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "outputs": [],
      "source": [
        "# Part 2: Python 핵심 문법 실습\n",
        "\n",
        "이 노트북은 Python의 핵심 문법을 단계별로 학습하는 실습 과정입니다.\n",
        "\n",
        "## 학습 목표\n",
        "- Python 기본 문법 이해\n",
        "- 변수와 데이터 타입 활용\n",
        "- 제어 구조 (조건문, 반복문) 숙달\n",
        "- 함수 정의와 활용\n",
        "- 예외 처리 기법 학습\n",
        "\n",
        "## 실습 과정\n",
        "1. 기본 데이터 타입과 변수\n",
        "2. 연산자와 표현식\n",
        "3. 조건문과 반복문\n",
        "4. 함수 정의와 호출\n",
        "5. 예외 처리\n",
        "6. 종합 실습\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 1. 기본 데이터 타입과 변수\n",
        "print(\"=== 1. 기본 데이터 타입과 변수 ===\")\n",
        "\n",
        "# 숫자형\n",
        "integer_num = 42\n",
        "float_num = 3.14\n",
        "complex_num = 3 + 4j\n",
        "\n",
        "print(f\"정수: {integer_num}, 타입: {type(integer_num)}\")\n",
        "print(f\"실수: {float_num}, 타입: {type(float_num)}\")\n",
        "print(f\"복소수: {complex_num}, 타입: {type(complex_num)}\")\n",
        "\n",
        "# 문자열\n",
        "string_single = '안녕하세요'\n",
        "string_double = \"Hello, World!\"\n",
        "string_multi = \"\"\"여러 줄에 걸친\n",
        "문자열입니다.\"\"\"\n",
        "\n",
        "print(f\"문자열 1: {string_single}\")\n",
        "print(f\"문자열 2: {string_double}\")\n",
        "print(f\"문자열 3: {string_multi}\")\n",
        "\n",
        "# 불린형\n",
        "is_true = True\n",
        "is_false = False\n",
        "print(f\"불린 값: {is_true}, {is_false}\")\n",
        "\n",
        "# None 타입\n",
        "none_value = None\n",
        "print(f\"None 타입: {none_value}, 타입: {type(none_value)}\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 2. 연산자와 표현식\n",
        "print(\"=== 2. 연산자와 표현식 ===\")\n",
        "\n",
        "# 산술 연산자\n",
        "a, b = 10, 3\n",
        "print(f\"a = {a}, b = {b}\")\n",
        "print(f\"덧셈: a + b = {a + b}\")\n",
        "print(f\"뺄셈: a - b = {a - b}\")\n",
        "print(f\"곱셈: a * b = {a * b}\")\n",
        "print(f\"나눗셈: a / b = {a / b}\")\n",
        "print(f\"몫: a // b = {a // b}\")\n",
        "print(f\"나머지: a % b = {a % b}\")\n",
        "print(f\"거듭제곱: a ** b = {a ** b}\")\n",
        "\n",
        "# 비교 연산자\n",
        "print(f\"\\n비교 연산:\")\n",
        "print(f\"a == b: {a == b}\")\n",
        "print(f\"a != b: {a != b}\")\n",
        "print(f\"a > b: {a > b}\")\n",
        "print(f\"a < b: {a < b}\")\n",
        "print(f\"a >= b: {a >= b}\")\n",
        "print(f\"a <= b: {a <= b}\")\n",
        "\n",
        "# 논리 연산자\n",
        "x, y = True, False\n",
        "print(f\"\\n논리 연산:\")\n",
        "print(f\"x = {x}, y = {y}\")\n",
        "print(f\"x and y: {x and y}\")\n",
        "print(f\"x or y: {x or y}\")\n",
        "print(f\"not x: {not x}\")\n",
        "\n",
        "# 할당 연산자\n",
        "c = 5\n",
        "print(f\"\\n할당 연산:\")\n",
        "print(f\"c = {c}\")\n",
        "c += 2\n",
        "print(f\"c += 2, c = {c}\")\n",
        "c *= 3\n",
        "print(f\"c *= 3, c = {c}\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 3. 조건문과 반복문\n",
        "print(\"=== 3. 조건문과 반복문 ===\")\n",
        "\n",
        "# 조건문 (if-elif-else)\n",
        "score = 85\n",
        "\n",
        "if score >= 90:\n",
        "    grade = 'A'\n",
        "elif score >= 80:\n",
        "    grade = 'B'\n",
        "elif score >= 70:\n",
        "    grade = 'C'\n",
        "elif score >= 60:\n",
        "    grade = 'D'\n",
        "else:\n",
        "    grade = 'F'\n",
        "\n",
        "print(f\"점수: {score}, 학점: {grade}\")\n",
        "\n",
        "# for 반복문\n",
        "print(\"\\nfor 반복문:\")\n",
        "fruits = ['사과', '바나나', '오렌지', '포도']\n",
        "for fruit in fruits:\n",
        "    print(f\"과일: {fruit}\")\n",
        "\n",
        "# range를 사용한 for 반복문\n",
        "print(\"\\nrange를 사용한 for 반복문:\")\n",
        "for i in range(1, 6):\n",
        "    print(f\"숫자: {i}\")\n",
        "\n",
        "# while 반복문\n",
        "print(\"\\nwhile 반복문:\")\n",
        "count = 0\n",
        "while count < 5:\n",
        "    print(f\"카운트: {count}\")\n",
        "    count += 1\n",
        "\n",
        "# 중첩 반복문과 break, continue\n",
        "print(\"\\n중첩 반복문과 제어:\")\n",
        "for i in range(3):\n",
        "    for j in range(3):\n",
        "        if i == j:\n",
        "            continue  # 대각선 요소 건너뛰기\n",
        "        if i + j > 2:\n",
        "            break  # 합이 2보다 크면 안쪽 루프 종료\n",
        "        print(f\"({i}, {j})\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 4. 함수 정의와 호출\n",
        "print(\"=== 4. 함수 정의와 호출 ===\")\n",
        "\n",
        "# 기본 함수\n",
        "def greet(name):\n",
        "    \"\"\"인사하는 함수\"\"\"\n",
        "    return f\"안녕하세요, {name}님!\"\n",
        "\n",
        "# 함수 호출\n",
        "message = greet(\"김철수\")\n",
        "print(message)\n",
        "\n",
        "# 기본값 매개변수\n",
        "def introduce(name, age=25, city=\"서울\"):\n",
        "    return f\"저는 {name}이고, {age}살이며, {city}에 살고 있습니다.\"\n",
        "\n",
        "print(introduce(\"이영희\"))\n",
        "print(introduce(\"박민수\", 30))\n",
        "print(introduce(\"최지원\", 28, \"부산\"))\n",
        "\n",
        "# 가변 인수 (*args, **kwargs)\n",
        "def sum_all(*args):\n",
        "    \"\"\"모든 인수의 합을 계산\"\"\"\n",
        "    return sum(args)\n",
        "\n",
        "def print_info(**kwargs):\n",
        "    \"\"\"키워드 인수로 정보 출력\"\"\"\n",
        "    for key, value in kwargs.items():\n",
        "        print(f\"{key}: {value}\")\n",
        "\n",
        "print(f\"합계: {sum_all(1, 2, 3, 4, 5)}\")\n",
        "print(\"\\n정보:\")\n",
        "print_info(이름=\"홍길동\", 나이=30, 직업=\"개발자\")\n",
        "\n",
        "# 람다 함수\n",
        "square = lambda x: x ** 2\n",
        "add = lambda x, y: x + y\n",
        "\n",
        "print(f\"\\n람다 함수:\")\n",
        "print(f\"5의 제곱: {square(5)}\")\n",
        "print(f\"3 + 7 = {add(3, 7)}\")\n",
        "\n",
        "# 고차 함수 (map, filter)\n",
        "numbers = [1, 2, 3, 4, 5]\n",
        "squared = list(map(lambda x: x**2, numbers))\n",
        "evens = list(filter(lambda x: x % 2 == 0, numbers))\n",
        "\n",
        "print(f\"원래 숫자: {numbers}\")\n",
        "print(f\"제곱한 결과: {squared}\")\n",
        "print(f\"짝수만 필터링: {evens}\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 5. 예외 처리\n",
        "print(\"=== 5. 예외 처리 ===\")\n",
        "\n",
        "# 기본 예외 처리\n",
        "def divide_numbers(a, b):\n",
        "    try:\n",
        "        result = a / b\n",
        "        return result\n",
        "    except ZeroDivisionError:\n",
        "        print(\"오류: 0으로 나눌 수 없습니다!\")\n",
        "        return None\n",
        "    except TypeError:\n",
        "        print(\"오류: 숫자가 아닌 값이 입력되었습니다!\")\n",
        "        return None\n",
        "\n",
        "print(f\"10 / 2 = {divide_numbers(10, 2)}\")\n",
        "print(f\"10 / 0 = {divide_numbers(10, 0)}\")\n",
        "print(f\"10 / '2' = {divide_numbers(10, '2')}\")\n",
        "\n",
        "# try-except-else-finally\n",
        "def process_file(filename):\n",
        "    try:\n",
        "        # 파일을 읽으려고 시도\n",
        "        with open(filename, 'r', encoding='utf-8') as file:\n",
        "            content = file.read()\n",
        "            return content\n",
        "    except FileNotFoundError:\n",
        "        print(f\"파일 '{filename}'을 찾을 수 없습니다.\")\n",
        "        return None\n",
        "    except PermissionError:\n",
        "        print(f\"파일 '{filename}'에 접근 권한이 없습니다.\")\n",
        "        return None\n",
        "    else:\n",
        "        print(\"파일을 성공적으로 읽었습니다.\")\n",
        "    finally:\n",
        "        print(\"파일 처리를 완료했습니다.\")\n",
        "\n",
        "# 사용자 정의 예외\n",
        "class CustomError(Exception):\n",
        "    \"\"\"사용자 정의 예외 클래스\"\"\"\n",
        "    def __init__(self, message=\"사용자 정의 오류가 발생했습니다\"):\n",
        "        self.message = message\n",
        "        super().__init__(self.message)\n",
        "\n",
        "def validate_age(age):\n",
        "    if age < 0:\n",
        "        raise CustomError(\"나이는 음수가 될 수 없습니다\")\n",
        "    elif age > 150:\n",
        "        raise CustomError(\"나이가 너무 큽니다\")\n",
        "    else:\n",
        "        return f\"유효한 나이: {age}세\"\n",
        "\n",
        "try:\n",
        "    print(validate_age(25))\n",
        "    print(validate_age(-5))\n",
        "except CustomError as e:\n",
        "    print(f\"사용자 정의 예외: {e}\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 6. 종합 실습: 간단한 계산기 프로그램\n",
        "print(\"=== 6. 종합 실습: 간단한 계산기 ===\")\n",
        "\n",
        "class Calculator:\n",
        "    \"\"\"간단한 계산기 클래스\"\"\"\n",
        "    \n",
        "    def __init__(self):\n",
        "        self.history = []  # 계산 이력 저장\n",
        "    \n",
        "    def add(self, a, b):\n",
        "        \"\"\"덧셈\"\"\"\n",
        "        result = a + b\n",
        "        self.history.append(f\"{a} + {b} = {result}\")\n",
        "        return result\n",
        "    \n",
        "    def subtract(self, a, b):\n",
        "        \"\"\"뺄셈\"\"\"\n",
        "        result = a - b\n",
        "        self.history.append(f\"{a} - {b} = {result}\")\n",
        "        return result\n",
        "    \n",
        "    def multiply(self, a, b):\n",
        "        \"\"\"곱셈\"\"\"\n",
        "        result = a * b\n",
        "        self.history.append(f\"{a} * {b} = {result}\")\n",
        "        return result\n",
        "    \n",
        "    def divide(self, a, b):\n",
        "        \"\"\"나눗셈\"\"\"\n",
        "        try:\n",
        "            result = a / b\n",
        "            self.history.append(f\"{a} / {b} = {result}\")\n",
        "            return result\n",
        "        except ZeroDivisionError:\n",
        "            error_msg = \"오류: 0으로 나눌 수 없습니다\"\n",
        "            self.history.append(f\"{a} / {b} = {error_msg}\")\n",
        "            return error_msg\n",
        "    \n",
        "    def power(self, a, b):\n",
        "        \"\"\"거듭제곱\"\"\"\n",
        "        result = a ** b\n",
        "        self.history.append(f\"{a} ** {b} = {result}\")\n",
        "        return result\n",
        "    \n",
        "    def get_history(self):\n",
        "        \"\"\"계산 이력 반환\"\"\"\n",
        "        return self.history\n",
        "    \n",
        "    def clear_history(self):\n",
        "        \"\"\"계산 이력 초기화\"\"\"\n",
        "        self.history = []\n",
        "        print(\"계산 이력이 초기화되었습니다.\")\n",
        "\n",
        "# 계산기 사용 예제\n",
        "calc = Calculator()\n",
        "\n",
        "# 다양한 계산 수행\n",
        "print(\"계산 수행:\")\n",
        "print(f\"5 + 3 = {calc.add(5, 3)}\")\n",
        "print(f\"10 - 4 = {calc.subtract(10, 4)}\")\n",
        "print(f\"6 * 7 = {calc.multiply(6, 7)}\")\n",
        "print(f\"15 / 3 = {calc.divide(15, 3)}\")\n",
        "print(f\"2 ** 4 = {calc.power(2, 4)}\")\n",
        "print(f\"8 / 0 = {calc.divide(8, 0)}\")  # 오류 테스트\n",
        "\n",
        "# 계산 이력 출력\n",
        "print(\"\\n계산 이력:\")\n",
        "for record in calc.get_history():\n",
        "    print(record)\n",
        "\n",
        "# 이력 초기화\n",
        "print()\n",
        "calc.clear_history()\n",
        "\n",
        "print(\"\\n=== Python 핵심 문법 실습 완료 ===\")\n",
        "print(\"축하합니다! Python의 핵심 문법을 성공적으로 학습했습니다.\")\n"
      ]
    }
  ],
  "metadata": {
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}
