이것저것

[SK shieldus Rookies 29기] 4일차 본문

SK Shieldus Rookies 29

[SK shieldus Rookies 29기] 4일차

atfield1988 2025. 12. 4. 10:56

1️⃣ 파이썬의 역사와 개발 배경

파이썬은 1991년 귀도 반 로섬(Guido van Rossum)이 개인 시간에 개발한 프로그래밍 언어입니다.

📖 개발 배경

  • ABC 언어에 영감을 받음
  • "Monty Python's Flying Circus" TV 쇼에서 이름 따옴
  • 목표: C보다 읽기 쉽고 간결하게 많은 작업을 수행할 수 있는 언어 개발

2️⃣ 파이썬이 널리 쓰이는 이유

✨ 주요 이유

  • 다양한 분야: 웹 개발(Flask, Django), 데이터 과학(pandas), AI/딥러닝(TensorFlow)
  • 직관적인 문법: 초보자도 쉽게 배우고 코드 가독성 높음
  • 강력한 커뮤니티: 방대한 라이브러리와 지속적 지원
  • 교육용 인기: 학교·대학에서 입문 프로그래밍 언어로 널리 채택

3️⃣ 파이썬 특징 및 장점

🚀 주요 특징

  • 인터프리터 언어: 실행 시 코드 해석, 컴파일 필요 없음
  • ** 동적 타이핑**: 변수 타입 미리 선언 불필요 → 빠른 개발 가능
  • ** 객체 지향 지원**: 클래스, 상속, 인스턴스 활용 가능
  • ** 확장성**: C/C++ 코드 연동 가능 (성능이 중요한 부분)
  • ** 플랫폼 독립성**: 윈도우, 맥, 리눅스에서 동일하게 실행

4️⃣ 파이썬 2 vs 3 비교

📊 버전 비교 테이블

항목 Python 2.x Python 3.x
문자열 기본 ASCII, 유니코드는 u"" 사용 기본 Unicode 처리
print 문법 명령문 (괄호 없음) print "hi" 함수 (괄호 필수) print("hi")
나눗셈 연산 /는 정수 나눗셈 /는 실수, //는 정수 나눗셈
비동기 처리 미지원 async/await 지원
지원 상태 2020년 1월 종료 지속 지원, 계속 업데이트

💡 왜 Python 3.x를 써야 할까?

  • ✔️ 새로운 기능과 버그 수정 지속적 추가
  • ✔️ 보안 패치와 성능 최적화 포함
  • ✔️ 최신 라이브러리는 모두 3.x 기준으로 개발
  • 개인적으로 프로젝트를 진행할 때 async를 엄청 많이 쓴 기억이....

5️⃣ IT 보안에서 파이썬 활용

🔒 보안 분야별 활용

  • ** 보안 자동화**: 정기적 보안 점검·업데이트 자동화
  • ** 취약점 분석**: SQLMap 등 도구로 자동 스캔 및 진단
  • ** 포렌식**: 로그 이상 행위 추출, 멀웨어 분석
  • ** 네트워크 모니터링**: Nmap 기반 포트 스캔, 패킷 조작
  • ** 보고서 자동화**: 크롤링·파싱 후 보고서 생성 및 자동 통보

6️⃣ 파이썬 기본 문법 💡

1️⃣ 변수와 데이터 타입

number = 10          # 정수 (int)
name = "Alice"       # 문자열 (str)
is_valid = True      # 불리언 (bool)
temperature = 36.5   # 부동소수점 (float)

print(number)
print(name)
print(is_valid)
print(temperature)

출력 결과:

10
Alice
True
36.5

2️⃣ 타입 확인 및 변환

# 타입 확인하기
print(type(number))    # <class 'int'>
print(type(name))      # <class 'str'>
print(type(is_valid))  # <class 'bool'>

# 타입 변환하기
text = str(100)              # 정수를 문자열로
real_number = int("123")     # 문자열을 정수로
float_from_int = float(10)   # 정수를 실수로
float_from_string = float("3.14159")  # 문자열을 실수로

3️⃣ 예외 처리 (try-except)[이것도 많이 사용한 기억이...]

try:
    user_input = "100a"
    number = int(user_input)
except ValueError:
    print("❗ 입력이 정수로 변환될 수 없습니다.")

출력 결과:

❗ 입력이 정수로 변환될 수 없습니다.

7️⃣ 변수 네이밍 규칙

✅ 올바른 규칙

  • 문자, 숫자, 밑줄 포함 가능
  • 숫자로 시작 불가
  • 파이썬 예약어 사용 불가 (if, for, def 등)

👍 좋은 예 vs 👎 나쁜 예

# ✅ 좋은 예
username = "admin"
user_id = 1001
my_variable_name = "value"

# ❌ 나쁜 예
2nd_user = "bob"           # 숫자로 시작
user-name = "alice"        # 하이픈 사용 불가
if = "value"               # 예약어 사용 불가
MyVariable = "hello"       # 일반 변수는 카멜 케이스 피하기

8️⃣ 출력과 문자열 포맷팅 📝

기본 출력

print("파이썬 웰컴")
print('파이썬 "매우" 쉽습니다')
print("파이썬", "출력", "테스트")

이스케이프 코드 (Escape Codes)

코드 설명 예시
\n 줄바꿈 "Hello\nWorld"
\t "Hello\tWorld"
\\ 백슬래시 "c:\\path"
\' 작은따옴표 "I\'m"
\" 큰따옴표 "Say \"Hi\""

문자열 포맷팅 3가지 방식

📌 방식 1: % 연산자 (구식)

name = "atfield"
age = 100
print("내 이름은 %s입니다." % name)
print("내 이름은 %s이고 나이는 %d살입니다." % (name, age))

📌 방식 2: format() 메서드

name = "atfield"
age = 100

# 기본 사용
print("내 이름은 {}이고 나이는 {}살입니다.".format(name, age))

# 인덱스 사용
print("내 이름은 {1}이고 나이는 {0}살입니다.".format(age, name))

# 키워드 인자
print("내 이름은 {n}이고 나이는 {a}살입니다.".format(a=age, n=name))

📌 방식 3: f-string ⭐ (추천!)

name = "atfield"
age = 100
print(f"내 이름은 {name}이고 나이는 {age}살입니다.")

💡 팁: f-string이 가장 직관적이고 빠르므로 현대 파이썬 개발에서 권장됩니다!


사용자 입력 받기

name = input("이름을 입력하세요: ")
phone = input("번호를 입력하세요: ")
age = int(input("나이를 입력하세요: "))

print(f"{name}의 전화번호는 {phone}입니다.")
print(f"나이: {age}살")

print(type(name))   # <class 'str'>
print(type(age))    # <class 'int'>

9️⃣ 주요 데이터 구조: 리스트 🍎

리스트란?

파이썬에서 가장 자주 사용되는 데이터 구조입니다. 순서가 있고 원소는 인덱스(0부터 시작)로 접근합니다.

선언과 접근

fruits = ["사과", "바나나", "오렌지"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "안녕", 3.14, True]

print(fruits[0])      # 사과 (첫 번째)
print(fruits[1])      # 바나나 (두 번째)
print(fruits[2])      # 오렌지 (세 번째)
print(fruits[-1])     # 오렌지 (마지막)

리스트 반복문

fruits = ["사과", "바나나", "오렌지"]

# 방법 1: for in 반복
for fruit in fruits:
    print(f"과일: {fruit}")

# 방법 2: 인덱스로 반복
for i in range(len(fruits)):
    print(f"{i+1}번째 과일: {fruits[i]}")

# 방법 3: enumerate 사용 (권장)
for i, fruit in enumerate(fruits):
    print(f"{i+1}번째 과일: {fruit}")

리스트 길이

fruits = ["사과", "바나나", "오렌지"]
print(len(fruits))  # 3

리스트 요소 수정

my_list = [10, 20, 30, 40, 50]

my_list[1] = 25     # 두 번째 요소 수정
my_list[4] = 100    # 다섯 번째 요소 수정

print(my_list)      # [10, 25, 30, 40, 100]

리스트 결합

old_list = [5, 6, 7]
new_list = [1, 2, 3, 4]
result = old_list + new_list

print(result)  # [5, 6, 7, 1, 2, 3, 4]

리스트 요소 추가 및 삭제

my_list = [10, 20, 30, 40, 50]

# 추가
my_list.append(60)       # 끝에 60 추가
my_list.insert(1, 15)    # 인덱스 1에 15 삽입

# 삭제
my_list.remove(20)       # 값 20 삭제
del my_list[0]           # 첫 번째 요소 삭제
popped = my_list.pop()   # 마지막 요소 삭제 및 반환

print(my_list)

리스트 주요 메서드

메서드 설명 예시
append(x) 끝에 x 추가 lst.append(4)
extend(iter) 여러 값 추가 lst.extend([4, 5])
insert(i, x) i 위치에 x 삽입 lst.insert(2, 'a')
remove(x) 첫 x 제거 lst.remove(3)
pop([i]) i 위치 제거+반환 lst.pop()
clear() 전체 삭제 lst.clear()
index(x) x의 인덱스 반환 lst.index(2)
count(x) x의 개수 반환 lst.count(2)
sort() 정렬 lst.sort()
reverse() 뒤집기 lst.reverse()
copy() 복사 new_lst = lst.copy()

📊 실습: 학생 성적 처리

# 5명의 학생 성적을 입력받아 최대, 최소, 평균, 80점 이상 인원 계산

STUDENTS = 5
lst = []

for i in range(STUDENTS):
    value = int(input(f"{i+1}번째 학생의 성적을 입력하세요: ")) #int로 감싸서 오류 방지
    lst.append(value)

print(f"최대 점수: {max(lst)}")
print(f"최소 점수: {min(lst)}")
print(f"평균 점수: {sum(lst)/len(lst):.2f}")

count = sum([1 for score in lst if score >= 80])
print(f"80점 이상 학생 {count}명입니다.")

🔟 주요 데이터 구조: 딕셔너리

딕셔너리란?

키-값 쌍으로 데이터를 저장합니다. JSON과 유사하며, 빠른 검색과 수정에 최적화됩니다.

생성과 접근

person = {"name": "John", "age": 30, "city": "New York"}
print(person)

# 직접 접근 (키가 없으면 KeyError)
print(person["name"])  # John
print(person["age"])   # 30

# get() 메서드 (안전한 방법)
print(person.get("name", "없음"))     # John
print(person.get("email", "없음"))    # 없음

키-값 반복하기

person = {"name": "John", "age": 30, "city": "New York"}

# 모든 키
print(person.keys())        # dict_keys(['name', 'age', 'city'])

# 모든 값
print(person.values())      # dict_values(['John', 30, 'New York'])

# 모든 키-값 쌍
print(person.items())       # dict_items([('name', 'John'), ('age', 30), ...])

# 반복문으로 출력
for key, value in person.items():
    print(f"{key}: {value}")

요소 추가, 수정, 삭제

person = {"name": "John", "age": 30}

# 추가
person["email"] = "john@example.com"

# 수정
person["age"] = 31

# 삭제
del person["email"]
removed_age = person.pop("age")  # 값도 함께 반환

print(person)

딕셔너리 키 사용 가능 타입

✅ 사용 가능 ❌ 사용 불가
문자열 (str) 리스트 (list)
숫자 (int, float) 딕셔너리 (dict)
튜플 (tuple) 집합 (set)

☕ 실습: 커피 주문 프로그램

menus = {"아메리카노": 4000, "카페라떼": 4500, "카푸치노": 5000}
order_list = []
total_price = 0

print("===== 메뉴 =====")
for menu, price in menus.items():
    print(f"{menu}: {price}원")

print("\n주문을 시작합니다. (종료는 q 입력)\n")

while True:
    selected_menu = input("주문할 메뉴를 입력하세요: ")

    if selected_menu == "q":
        print("✅ 주문을 완료합니다.\n")
        break

    price = menus.get(selected_menu)

    if price:
        order_list.append(selected_menu)
        total_price += price
        print(f"✔️  {selected_menu} {price}원이 추가되었습니다.\n")
    else:
        print(f"❌ {selected_menu}는 메뉴에 없습니다.\n")

print(f"📋 선택한 메뉴: {order_list}")
print(f"💰 총 금액: {total_price}원\n")

money = int(input("지불할 금액을 입력하세요: "))
change = money - total_price

if change >= 0:
    print(f"✅ 결제 완료!")
    print(f"거스름돈: {change}원")
else:
    print(f"❌ 돈이 {abs(change)}원 부족합니다.")

1️⃣1️⃣ 파일과 디렉터리 제어

기본 함수들

import os

# 현재 작업 디렉터리 확인
current_dir = os.getcwd()
print(f"현재 디렉터리: {current_dir}")

# 파일인지 여부 확인
if os.path.isfile("example.txt"):
    print("✅ example.txt는 파일입니다.")
else:
    print("❌ example.txt는 파일이 아닙니다.")

# 디렉터리인지 여부 확인
if os.path.isdir("example_folder"):
    print("✅ example_folder는 디렉터리입니다.")
else:
    print("❌ example_folder는 디렉터리가 아닙니다.")

디렉터리 내용 조회

import os

# 현재 디렉터리 내용
entries = os.listdir(".")
print("현재 디렉터리 내용:")
for entry in entries:
    print(f"  - {entry}")

# 상위 디렉터리 내용
parent_entries = os.listdir("../")
print("\n상위 디렉터리 내용:")
for entry in parent_entries:
    print(f"  - {entry}")

디렉터리 재귀 탐색

import os

# 특정 디렉터리부터 모든 하위 디렉터리와 파일 탐색
start_path = "."  # 현재 디렉터리부터 시작

for dirpath, dirnames, filenames in os.walk(start_path):
    print(f"\n경로: {dirpath}")
    print(f"하위 디렉터리: {dirnames}")
    print(f"파일: {filenames}")

Raw String 사용법

import os

# Windows 경로를 다룰 때 r"" 사용
windows_path = r"C:\Users\YourName\Documents\file.txt"
linux_path = r"/home/user/documents/file.txt"

# 백슬래시를 그대로 사용 가능
print(windows_path)  # C:\Users\YourName\Documents\file.txt
print(linux_path)    # /home/user/documents/file.txt

파일 존재 확인 및 생성

import os

file_name = "test.txt"

if os.path.isfile(file_name):
    print(f"{file_name} 파일이 존재합니다.")
else:
    print(f"{file_name} 파일이 없습니다.")

dir_name = "my_folder"

if os.path.isdir(dir_name):
    print(f"{dir_name} 디렉터리가 존재합니다.")
else:
    print(f"{dir_name} 디렉터리가 없습니다.")

1️⃣2️⃣ 파이썬 라이브러리 설치

pip을 이용한 라이브러리 설치

# Python 버전 확인
python --version

# 단일 라이브러리 설치
pip install requests
pip install beautifulsoup4
pip install paramiko

# 여러 라이브러리 동시 설치
pip install requests beautifulsoup4 paramiko

# 특정 버전 설치
pip install requests==2.28.0

# 설치된 라이브러리 확인
pip list

📝 핵심 요약 ✅

오늘 강의에서 배운 것

  • 🐍 파이썬의 역사, 버전 차이 (2 vs 3)
  • 📊 기본 문법: 변수, 타입, 타입 변환
  • 📋 리스트: 생성, 접근, 수정, 삭제, 주요 메서드
  • 📚 딕셔너리: 키-값 관리, 반복, 응용
  • 🔧 파일/디렉터리: os 모듈, 탐색, 체크
  • 🔒 보안에서의 파이썬 활용

내일도 de gaja