AI 학습 시스템을 만들고 첫 수업을 진행했다. 미리 만들어 둔 파일들을 Claude Code로 읽게 하고, Python 코드 작성은 VSCode에서 Jupyter를 이용했다. 학습은 크게 아래 3단계로 진행하였다.

자바 개발자라는 걸 알고, "프로그래밍은 아는데 Python 문법은 모르는" 전제로 5문제를 출제해줬다.
// Java
int a = 10;
String name = "홍길동";
double pi = 3.14;
boolean isStudent = true;
내 답:
a = 10
name = "홍길동"
pi = 3.14
isStudent = True
정답! 핵심은 타입 선언이 필요 없다는 것과 True가 대문자라는 것.
추가로 배운 점: Python은 변수명을 snake_case로 쓰는 게 관례다. isStudent → is_student
x = 15
if x > 20:
print("A")
elif x > 10:
print("B")
else:
print("C")
정답: B — Java의 else if가 Python에서는 elif다.
fruits = ["사과", "바나나", "포도"]
for i, fruit in enumerate(fruits):
print(i, fruit)
내 답:
0 사과
1 바나나
2 포도
정답! enumerate()는 (인덱스, 값) 튜플을 반환한다. Java에서 인덱스 따로 관리하는 것보다 훨씬 편하다.
nums = [10, 20, 30, 40, 50]
print(nums[1:4])
print(nums[-2:])
처음 답: 20 30 40 / 40 30 20 10 — 틀림
두 가지를 잘못 이해하고 있었다:
인덱스: 0 1 2 3 4
값: 10 20 30 40 50
음수: -5 -4 -3 -2 -1
정답: [20, 30, 40] / [40, 50]
슬라이싱 핵심:
nums[1:4] → 인덱스 1부터 4 미만까지nums[-2:] → 뒤에서 2번째부터 끝까지__(a)__ add(x, y):
result = x + y
__(b)__ result
(b) return은 맞았는데 (a)를 add라고 답했다. add는 이미 함수 이름인데...
정답: (a) def — "define(정의하다)"의 약자. Python에서 함수를 만드는 키워드다.
| 문제 | 결과 |
|---|---|
| 변수/자료형 | 1차 정답 |
| 조건문 | 1차 정답 |
| 반복문 | 1차 정답 |
| 슬라이싱 | 2차 정답 |
| 함수 정의 | 2차 정답 |
로직은 빠르게 파악하는데, Python 고유 문법에서 막히는 패턴이 보인다.
진단 후 자바 개발자가 알아야 할 차이점을 정리해줬다. 핵심만 요약하면:
| 항목 | Java | Python |
|---|---|---|
| 타입 선언 | int x = 10; | x = 10 |
| 블록 구분 | { } | 들여쓰기 |
| 세미콜론 | 필수 | 불필요 |
| 출력 | System.out.println() | print() |
| 조건분기 | else if | elif |
| for문 | for(int i=0;i<n;i++) | for i in range(n): |
| null | null | None |
| boolean | true/false | True/False |
| 생성자 | 클래스명 | __init__ |
| this | this | self |
그 외 인상 깊었던 것들:
# f-string — Java의 String.format()보다 훨씬 편하다
print(f"이름: {name}, 나이: {age}")
# 리스트 컴프리헨션 — 한 줄로 리스트 생성
squares = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]
# swap — 임시변수 필요 없음
a, b = b, a
# in 연산자 — contains 대신
if "사과" in fruits:
print("있다!")
리스트 메서드 비교 (자주 쓸 것 같아서 따로 정리)
| Java | Python |
|---|---|
list.add(x) | list.append(x) |
list.size() | len(list) |
list.get(i) | list[i] |
list.remove(i) | list.pop(i) |
list.contains(x) | x in list |
COS Pro 1급은 3가지 유형이 있다:
각 유형 1문제씩 풀어봤다.
def sum_even(numbers):
total = 0
for num in __(a)__:
if __(b)__:
total __(c)__ num
return total
1차 정답! (a) numbers, (b) num % 2 == 0, (c) +=
Java 경험이 있으면 로직 자체는 어렵지 않다.
def find_longest(words):
longest = ""
for word in words:
if len(word) > len(longest):
longest = word
else:
longest = word # ← 버그!
return longest
else에서도 longest = word를 하고 있어서, 짧은 단어도 덮어써버린다. longest = word → continue로 수정. 1차 정답!
정수 리스트에서 중복을 제거하고 오름차순 정렬한 리스트를 반환하라.
1차 시도:
return set(nums)
set()은 중복 제거는 되지만, 반환 타입이 집합(set)이지 리스트가 아니다. 정렬도 안 된다.
2차 시도:
tmp_set = set(nums)
tmp_list = []
for item in tmp_set:
tmp_list.append(item)
return tmp_list
리스트 변환까지는 했는데 정렬을 빼먹었다.
3차 시도 (정답):
return sorted(set(nums))
배운 점:
sorted()는 어떤 iterable이든 받아서 정렬된 리스트를 반환한다list()로 감싸지 않아도 sorted()가 알아서 리스트로 만들어준다def 같은 기본 키워드 숙지 부족sorted() 같은 내장함수 활용 미숙Java로 로직 짜는 건 익숙한데, Python스러운 코드를 쓰는 연습이 필요하다.