여러 언어를 넘나들며 공부하다 보면 문법이 섞여서 에러가 나는 경우가 많다. 특히 정보처리기사 실기 시험에서는 세 언어의 코드가 모두 출제되기 때문에, 각 언어의 고유한 특징을 명확히 구분해 두는 것이 필수적이다.
가장 대표적인 세 가지 차이점을 비교해 본다.
1. 코드 블록(구역)을 나누는 기준: 중괄호 {} vs 들여쓰기
조건문이나 반복문이 “어디서부터 어디까지인지” 구역을 정하는 방식이 완전히 다르다.
- Java & C (중괄호파): 무조건 중괄호
{ }를 사용해서 구역을 나눈다. 들여쓰기(띄어쓰기)는 사람이 보기 편하려고 하는 것일 뿐, 엉망으로 작성해도 중괄호만 맞으면 에러 없이 돌아간다. - Python (들여쓰기파): 중괄호가 아예 없다. 오직 들여쓰기(Indentation) 간격으로만 구역을 인식한다. 띄어쓰기 한 칸만 어긋나도 곧바로 치명적인 컴파일 에러(IndentationError)를 뱉어낸다.
// [Java & C] 중괄호로 구역을 묶음
if (score > 90) {
System.out.println("합격");
// 들여쓰기가 엉망이어도 에러 안 남
}
# [Python] 들여쓰기(콜론과 공백)로 구역을 묶음
if score > 90:
print("합격")
print("에러발생") # 들여쓰기 줄이 안 맞으면 치명적 오류 💥
2. 배열(Array)의 유연성: 고정 크기 vs 무한 확장
수십 개의 데이터를 담는 바구니인 배열을 다루는 철학도 다르다.
- Java & C (엄격한 고정형): 배열을 처음 만들 때 크기를 무조건 지정해야 하며, 한 번 정해진 방의 개수는 도중에 늘리거나 줄일 수 없다. 더 큰 방이 필요하면 아예 새로 이사를 가야 한다.
- Python (자유로운 동적형): 리스트(
List)라는 형태로 배열을 다루며, 데이터를 넣으면 넣는 대로 방 크기가 무한히 알아서 늘어난다. (append()함수 하나면 끝)
// [Java & C] 5칸짜리 배열. 6번째 데이터를 넣으려 하면 프로그램이 터짐
int[] arr = new int[5];
arr[0] = 10;
# [Python] 빈 리스트를 만들고 계속 밀어 넣어도 OK
my_list = []
my_list.append(10)
my_list.append(20)
3. 메모리 청소 (Garbage Collection)와 포인터
다 쓴 메모리(데이터 찌꺼기)를 누가 치우느냐의 문제다.
- C (완전 수동): 개발자가 직접 메모리를 예약(
malloc)하고, 다 쓰면 반드시 직접 청소(free)해야 한다. 까먹으면 메모리가 꽉 차서 컴퓨터가 뻗어버리는 메모리 누수(Memory Leak)가 발생한다. 또한, 메모리의 실제 주소를 직접 건드리는 포인터(Pointer)라는 무시무시한 문법이 존재한다. - Java & Python (완전 자동): 든든한 청소부인 가비지 컬렉터(GC)가 백그라운드에 상주하며 다 쓴 메모리를 알아서 치워준다. 개발자는 비즈니스 로직(기능 구현)에만 집중하면 된다.
💡 [핵심 요약]
| 비교 항목 | Java | Python | C |
|---|---|---|---|
| 1. 코드 블록 지정 | 중괄호 { } |
들여쓰기 (Space/Tab) | 중괄호 { } |
| 2. 기본 배열 크기 | 고정 (크기 변경 불가) | 동적 (무한 확장 가능) | 고정 (크기 변경 불가) |
| 3. 다 쓴 메모리 정리 | 자동 (가비지 컬렉터) | 자동 (가비지 컬렉터) | 수동 (직접 삭제 필수) |