3편. Python 조건문과 반복문 – Java와 다른 제어 구조 한눈에 보기
📚 목차
1. 중괄호 대신 들여쓰기 - 코드 블록이 달라요
2. 조건문 if-else - 표현 방식과 문법 차이
3. 반복문 비교 - for-each와 range의 차이점
4. while 반복문 - 조건 기반 반복 구조
✔ 마무리 - 구조는 다르지만, 의도는 같다
Python은 Java와 달리 중괄호 {}를 사용하지 않고, 들여쓰기(Indentation)만으로 코드 블록을 구분합니다.
이러한 차이는 조건문과 반복문 구조 전반에 걸쳐 큰 영향을 줍니다.
이번 글에서는 Java 개발자가 Python의 조건문(if)과 반복문(for, while)을 자연스럽게 익힐 수 있도록, 두 언어의 제어문을 구조적으로 비교하고 실무 예제를 통해 감각적으로 이해할 수 있도록 구성했습니다.
1. 중괄호 대신 들여쓰기 – 코드 블록이 달라요
Java를 비롯한 C, C++, JavaScript 등 많은 프로그래밍 언어에서는 코드 블록(Statement Block)을 구분하기 위해 중괄호 {}를 사용합니다. 이는 블록의 시작과 끝을 명확히 알려주는 역할을 합니다.
하지만 Python은 이러한 중괄호 대신 들여쓰기(Indentation)를 사용하여 코드 블록을 정의합니다.
이는 Python의 가장 큰 문법적 특징 중 하나이며, 처음 접하는 Java 개발자에게는 다소 어색하고 실수를 유발할 수 있지만, 익숙해지면 코드의 가독성을 높여주는 강력한 장점으로 작용합니다.

🔸Java (중괄호 사용):
Java에서는 중괄호 {}로 코드 블록을 명확하게 구분합니다.
// Java 예시: 중괄호로 코드 블록을 명확히 구분합니다.
if (score >= 90) {
System.out.println("A 학점입니다.");
System.out.println("축하합니다!");
} else {
System.out.println("A 학점이 아닙니다.");
System.out.println("다음에 더 노력하세요.");
}
🔸Python (들여쓰기 사용):
Python에서는 중괄호 대신 **콜론(:)**과 들여쓰기를 사용합니다. 이 들여쓰기 규칙이 Python 문법의 핵심입니다.
# Python 예시: 콜론(:) 뒤에 이어지는 코드들은 동일하게 들여쓰기 되어야 합니다.
score = 95
if score >= 90:
print("A 학점입니다.")
print("축하합니다!") # 이 줄도 if 블록에 포함됩니다.
else:
print("A 학점이 아닙니다.")
print("다음에 더 노력하세요.") # 이 줄도 else 블록에 포함됩니다.
print("평가 완료.") # 들여쓰기가 다르므로 if-else 블록 외부에 있습니다.
Python에서는 if, for, while, 함수 정의 (def), 클래스 정의 (class) 등 콜론 : 뒤에 오는 코드 블록은 반드시 동일한 수준으로 들여쓰기되어야 합니다.
📌 주의할 점
Python에서는 들여쓰기가 맞지 않으면 IndentationError가 발생합니다.
일반적으로 공백 4칸이 권장되며, 혼용 없이 일관된 스타일을 유지해야 합니다.
if score >= 90:
print("A 학점입니다.") # ← 들여쓰기 오류 발생!
2. 조건문 if-else – 표현 방식과 문법 차이
조건문은 프로그램의 특정 부분이 특정 조건이 참(True)일 때만 실행되도록 하거나, 여러 조건에 따라 다른 코드가 실행되도록 흐름을 제어할 때 사용됩니다. Java와 Python의 if-else 구조를 자세히 비교해 봅시다.
| 항목 | Java | Python |
| 조건 괄호 | 필수 (if (조건)) | 선택 (if 조건) |
| 코드 블록 | 중괄호 {} | 들여쓰기 |
| 세미콜론 ; | 필수 | 없음 |
| else if | else if | elif |
✔️ 기본 if-else:
가장 기본적인 형태의 조건문으로, 하나의 조건에 따라 두 가지 경우 중 하나를 실행할 때 사용합니다.
조건식 괄호: Java는 조건식 주위에 괄호 ()를 필수로 사용하지만, Python은 괄호가 필수가 아닙니다 (사용해도 문법 오류는 아님).
코드 블록 구분: Java는 코드 블록을 중괄호 {}로 묶지만, Python은 조건식 끝에 콜론 :을 붙이고 다음 줄부터 들여쓰기로 블록을 정의합니다.
Statement Terminator: Java는 각 Statement 끝에 세미콜론 ;을 사용하지만, Python은 사용하지 않습니다.
🔸Java
// Java if-else 예시: 성인 여부 판단
int age = 20;
if (age >= 18) { // 조건식은 반드시 괄호로 묶어야 합니다.
System.out.println("성인입니다.");
} else {
System.out.println("미성년자입니다.");
}
int temperature = 28;
if (temperature > 25) {
System.out.println("날씨가 덥습니다.");
} else {
System.out.println("날씨가 쾌적합니다.");
}
🔸Python
# Python if-else 예시: 성인 여부 판단
age = 20
if age >= 18: # 조건식 뒤에 콜론(:)을 붙입니다. 괄호는 필수가 아닙니다.
print("성인입니다.")
else: # else 뒤에도 콜론(:)을 붙입니다.
print("미성년자입니다.")
temperature = 28
if temperature > 25:
print("날씨가 덥습니다.")
else:
print("날씨가 쾌적합니다.")
✔️ 다중 조건 else if vs elif:
여러 조건을 순차적으로 확인하여, 해당되는 첫 번째 조건의 코드 블록만 실행하고 싶을 때 사용합니다.
Python은 else if 대신 elif 키워드를 사용합니다. 기능은 완전히 동일하며, 가독성을 위해 단축된 형태입니다.
🔸Java
// Java else if 예시: 학점 계산
int score = 85;
if (score >= 90) {
System.out.println("A 학점");
} else if (score >= 80) { // else if를 사용하여 여러 조건을 연결
System.out.println("B 학점");
} else if (score >= 70) {
System.out.println("C 학점");
} else {
System.out.println("F 학점");
}
String weather = "맑음";
int temperature_today = 22;
if (weather.equals("비")) {
System.out.println("우산을 챙기세요.");
} else if (temperature_today < 10) {
System.out.println("따뜻하게 입으세요.");
} else {
System.out.println("좋은 하루 되세요!");
}
🔸Python
# Python elif 예시: 학점 계산
score = 85
if score >= 90:
print("A 학점")
elif score >= 80: # Python은 'else if' 대신 'elif'를 사용합니다.
print("B 학점")
elif score >= 70:
print("C 학점")
else:
print("F 학점")
weather = "맑음"
temperature_today = 22
if weather == "비": # 문자열 비교는 '==' 연산자를 사용합니다.
print("우산을 챙기세요.")
elif temperature_today < 10:
print("따뜻하게 입으세요.")
else:
print("좋은 하루 되세요!")
✔️ 논리 연산자 차이:
두 언어 모두 논리 연산자를 사용하여 여러 조건을 조합할 수 있습니다.
Python은 논리 연산자로 &&, ||, ! 같은 심볼 대신 and, or, not이라는 영어 단어를 사용합니다. 이는 코드의 자연어 가독성을 높이는 데 기여합니다.
🔸Java:&&(AND), ||(OR), !(NOT)
// Java 논리 연산자 예시
int temp = 25;
boolean isSunny = true;
boolean hasCloud = false;
if (temp > 20 && isSunny) { // 'AND' 조건
System.out.println("나들이 가기 좋은 날!");
}
if (temp < 10 || hasCloud) { // 'OR' 조건
System.out.println("춥거나 구름이 많습니다.");
}
if (!hasCloud) { // 'NOT' 조건
System.out.println("구름이 없습니다.");
}
🔸Python:and(AND), or(OR), not(NOT)
# Python 논리 연산자 예시
temp = 25
is_sunny = True # Python은 변수명에 스네이크 케이스 (snake_case)를 권장합니다.
has_cloud = False
if temp > 20 and is_sunny: # '&&' 대신 'and'
print("나들이 가기 좋은 날!")
if temp < 10 or has_cloud: # '||' 대신 'or'
print("춥거나 구름이 많습니다.")
if not has_cloud: # '!' 대신 'not'
print("구름이 없습니다.")
✔️ Python의 '진실성(Truthiness)' 개념:
Python에서는 특정 값들이 조건문에서 True 또는 False로 평가될 수 있는 '진실성(Truthiness)' 개념이 있습니다.
Java에서는 보통 boolean 타입만 조건식에 올 수 있지만, Python에서는 다음과 같은 값들이 False로 간주됩니다.
🔸None (Java의 null과 유사)
🔸숫자 0 (정수, 실수 모두)
🔸빈 문자열 ""
🔸빈 리스트 []
🔸빈 튜플 ()
🔸빈 딕셔너리 {}
🔸빈 집합 set()
이 외의 대부분의 값은 True로 간주됩니다. 이를 활용하면 코드를 더 간결하게 작성할 수 있습니다.
# Python의 진실성 예시
my_list = []
if my_list: # 리스트가 비어있으면 False, 내용이 있으면 True
print("리스트에 항목이 있습니다.")
else:
print("리스트가 비어 있습니다.") # 이 부분이 실행됩니다.
name = "Alice"
if name: # 문자열이 비어있으면 False, 내용이 있으면 True
print(f"이름은 {name}입니다.") # 이 부분이 실행됩니다.
value = 0
if value: # 0은 False로 평가됩니다.
print("값은 True입니다.")
else:
print("값은 False입니다.") # 이 부분이 실행됩니다.
3. 반복문 비교 – for-each와 range의 차이점
반복문은 코드 블록을 정해진 횟수만큼 또는 특정 컬렉션의 모든 요소에 대해 반복적으로 실행할 때 사용됩니다.
Java의 다양한 for 루프와 Python의 for 루프를 비교합니다. Python의 for 루프는 Java의 for-each와 유사하지만 훨씬 강력하고 유연합니다.
✔️ 컬렉션 순회: for-each vs for in :
Java의 for-each 루프는 배열이나 Collection 인터페이스를 구현한 객체(List, Set 등)의 각 요소를 순회할 때 편리합니다.
Python의 for in 루프는 이와 개념적으로 동일하며, Python의 iterable(순회 가능)한 모든 객체에 대해 사용할 수 있습니다.
🔸Java (for-each):
// Java for-each 예시: 문자열 배열 순회
String[] fruits = {"사과", "바나나", "체리"};
for (String fruit : fruits) { // '컬렉션의 각 요소에 대해' 반복
System.out.println(fruit);
}
// List도 동일하게 순회 가능
// import java.util.ArrayList;
// import java.util.List;
// List<Integer> numbers = new ArrayList<>();
// numbers.add(10); numbers.add(20); numbers.add(30);
// for (int num : numbers) {
// System.out.println(num);
// }
🔸Python (for in):
# Python for in 예시: 리스트 순회 (Java의 for-each와 매우 유사)
fruits = ["사과", "바나나", "체리"] # Python의 리스트 (mutable)
for fruit in fruits:
print(fruit)
# 출력:
# 사과
# 바나나
# 체리
numbers = [10, 20, 30] # Python 리스트
for num in numbers:
print(num)
# 출력:
# 10
# 20
# 30
# 문자열도 순회 가능 (각 문자를 순회)
for char in "Python":
print(char)
# 출력:
# P
# y
# t
# h
# o
# n
# 튜플 순회 (immutable)
coordinates = (10, 20, 30)
for coord in coordinates:
print(coord)
# 출력:
# 10
# 20
# 30
# 딕셔너리 순회 (기본적으로 키(key)를 순회)
person = {"name": "Alice", "age": 30, "city": "Seoul"}
for key in person: # 기본적으로 딕셔너리의 키를 순회합니다.
print(f"Key: {key}, Value: {person[key]}")
# 출력:
# Key: name, Value: Alice
# Key: age, Value: 30
# Key: city, Value: Seoul
# 딕셔너리 값(value)만 순회
for value in person.values():
print(f"Value: {value}")
# 출력:
# Value: Alice
# Value: 30
# Value: Seoul
# 딕셔너리 키와 값(key-value pair)을 동시에 순회
for key, value in person.items():
print(f"{key}: {value}")
# 출력:
# name: Alice
# age: 30
# city: Seoul
Python의 for 루프는 Java의 for-each 루프와 개념적으로 동일하며, 리스트, 튜플, 문자열, 딕셔너리, 집합(set) 등 순회 가능한(Iterable) 모든 객체에 대해 사용할 수 있습니다.
✔️ 정해진 횟수 반복: 일반 for vs for in range() :
Java에서는 보통 for (int i = 0; i < N; i++) 형태의 루프를 사용하여 정해진 횟수만큼 반복하거나, 인덱스를 사용하여 배열/리스트에 접근합니다.
Python에서는 range() 함수를 활용하여 이와 유사한 기능을 구현하며, range는 숫자 시퀀스를 생성하는 이터러블 객체입니다.
🔸Java (전통적인 for 루프):
// Java 전통적인 for 루프 예시: 0부터 4까지 반복
for (int i = 0; i < 5; i++) {
System.out.println("현재 숫자: " + i);
}
// 배열의 특정 인덱스에 접근
String[] items = {"A", "B", "C"};
for (int i = 0; i < items.length; i++) {
System.out.println("항목 [" + i + "]: " + items[i]);
}
🔸Python(for in range()):
# Python for in range() 예시
# range(stop): 0부터 stop-1까지의 숫자 시퀀스 생성 (range(5) -> 0, 1, 2, 3, 4)
for i in range(5):
print(f"현재 숫자: {i}") # f-string (Python 3.6+): 문자열 내부에 변수 값을 직접 삽입
# range(start, stop): start부터 stop-1까지 (range(1, 6) -> 1, 2, 3, 4, 5)
for i in range(1, 6):
print(f"숫자: {i}")
# range(start, stop, step): start부터 stop-1까지 step 간격으로 (range(0, 10, 2) -> 0, 2, 4, 6, 8)
for i in range(0, 10, 2):
print(f"짝수: {i}")
# 역순으로 순회 (step이 음수) (range(5, 0, -1) -> 5, 4, 3, 2, 1)
for i in range(5, 0, -1):
print(f"역순 숫자: {i}")
# 리스트의 인덱스와 값을 동시에 사용하기 (Java의 for + index와 유사)
items = ["A", "B", "C"]
for i in range(len(items)): # len(items)는 리스트의 길이를 반환
print(f"항목 [{i}]: {items[i]}")
🔸인덱스 + 값 함께 사용 – enumerate():
Java에서 인덱스와 요소를 동시에 얻기 위해 for (int i = 0; i < arr.length; i++)와 같이 인덱스 기반 루프를 많이 사용했다면, Python에서는 enumerate() 함수를 사용하는 것이 훨씬 Pythonic 하고 간결합니다.
# Python enumerate() 예시: 인덱스와 요소 동시 접근
fruits = ["사과", "바나나", "체리"]
for index, fruit in enumerate(fruits): # enumerate는 (인덱스, 값) 형태의 튜플을 반환합니다.
print(f"인덱스 {index}: {fruit}")
# 출력:
# 인덱스 0: 사과
# 인덱스 1: 바나나
# 인덱스 2: 체리
# 시작 인덱스를 변경할 수도 있습니다.
for index, fruit in enumerate(fruits, start=1): # 1부터 시작하는 인덱스
print(f"번호 {index}. {fruit}")
# 출력:
# 번호 1. 사과
# 번호 2. 바나나
# 번호 3. 체리
✔️ 리스트 컴프리헨션(List Comprehension):
Python의 강력한 기능 중 하나인 List Comprehension은 반복문과 조건문을 한 줄로 결합하여 리스트를 생성하는 간결하고 효율적인 방법입니다. Java의 스트림 API와 유사한 느낌을 줄 수 있습니다.

# Python 리스트 컴프리헨션 예시
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 짝수만 포함하는 새로운 리스트 생성 (기존 for 루프)
even_numbers_for = []
for num in numbers:
if num % 2 == 0:
even_numbers_for.append(num)
print(f"For 루프 사용 짝수: {even_numbers_for}")
# 짝수만 포함하는 새로운 리스트 생성 (리스트 컴프리헨션)
even_numbers_comprehension = [num for num in numbers if num % 2 == 0]
print(f"리스트 컴프리헨션 짝수: {even_numbers_comprehension}")
# 각 숫자를 제곱한 리스트 생성
squared_numbers = [num * num for num in numbers]
print(f"제곱된 숫자: {squared_numbers}")
4. while 반복문 – 조건 기반 반복 구조
while 반복문은 특정 조건이 참(True)인 동안 코드 블록을 반복적으로 실행합니다. 조건이 거짓(False)이 되는 순간 반복이 종료됩니다. Java와 Python의 while 문법은 기본적으로 매우 유사합니다.
✔️ while 문법
Java와 마찬가지로 Python은 조건식 주위에 괄호가 필수가 아니며, 조건식 끝에 콜론 :을 붙이고 들여쓰기로 코드 블록을 정의합니다.
증가/감소 연산자: Python에는 Java의 ++나 -- 같은 단항 증가/감소 연산자가 없습니다. 대신 +=, -=, *= 등의 복합 할당 연산자를 사용하거나, count = count + 1과 같이 명시적으로 연산합니다.
🔸Java:
// Java while 예시: 0부터 4까지 카운트
int count = 0;
while (count < 5) { // 조건식이 참인 동안 반복
System.out.println("카운트: " + count);
count++; // 증가 연산자 (post-increment)
}
// 사용자 입력이 'q'가 아닐 때까지 반복
// import java.util.Scanner;
// Scanner scanner = new Scanner(System.in);
// String input = "";
// while (!input.equals("q")) {
// System.out.print("입력하세요 ('q' 입력 시 종료): ");
// input = scanner.nextLine();
// System.out.println("입력된 값: " + input);
// }
// scanner.close();
🔸Python:
# Python while 예시: 0부터 4까지 카운트
count = 0
while count < 5: # 조건식 뒤에 콜론(:)
print(f"카운트: {count}")
count += 1 # Python에는 단항 증가/감소 연산자(++, --)가 없습니다.
# 사용자 입력이 'q'가 아닐 때까지 반복
user_input = ""
while user_input != "q":
user_input = input("입력하세요 ('q' 입력 시 종료): ") # input() 함수는 사용자 입력을 문자열로 받습니다.
print(f"입력된 값: {user_input}")
# 무한 루프 예시 (의도적으로 만들고 break로 탈출)
print("\n--- 무한 루프 예시 ---")
secret_number = 7
while True: # 항상 참이므로 무한 루프
guess = int(input("숫자를 맞춰보세요 (1-10): ")) # int()로 숫자로 변환
if guess == secret_number:
print("정답입니다!")
break # break를 사용하여 루프를 종료합니다.
elif guess < secret_number:
print("더 큰 숫자입니다.")
else:
print("더 작은 숫자입니다.")
print("게임 종료.")
✔️ break와 continue
두 언어 모두 반복문 내에서 break와 continue 키워드를 사용하여 반복 흐름을 제어할 수 있습니다. 기능과 용법은 동일합니다.
🔸break:
현재 실행 중인 반복문(가장 가까운 for 또는 while 루프)을 즉시 종료하고, 반복문 다음의 코드를 실행합니다.
# Python break 예시
print("\n--- break 예시 ---")
for i in range(10):
if i == 5:
print("5를 만나서 반복문 종료!")
break # i가 5가 되면 루프가 즉시 종료됩니다.
print(i)
# 출력:
# 0
# 1
# 2
# 3
# 4
# 5를 만나서 반복문 종료!
🔸continue:
현재 반복 주기(iteration)의 나머지 부분을 건너뛰고, 즉시 다음 반복 주기로 넘어갑니다.
# Python continue 예시
print("\n--- continue 예시 ---")
for i in range(1, 6): # 1부터 5까지
if i % 2 == 0: # 짝수일 경우
print(f"숫자 {i}는 짝수이므로 건너뜁니다.")
continue # 아래 print를 건너뛰고 다음 반복으로 넘어갑니다.
print(f"숫자 {i}는 홀수입니다.")
# 출력:
# 숫자 1는 홀수입니다.
# 숫자 2는 짝수이므로 건너뜁니다.
# 숫자 3는 홀수입니다.
# 숫자 4는 짝수이므로 건너뜁니다.
# 숫자 5는 홀수입니다.
✔️ Python else 절(for/while with else):
Python의 for와 while 반복문에는 특이하게 else 절을 붙일 수 있습니다. 이 else 절은 루프가 break 문으로 인해 중간에 종료되지 않고, 정상적으로 모든 반복을 마쳤을 때만 실행됩니다.
# Python for-else 예시
print("\n--- for-else 예시 (정상 종료) ---")
for i in range(5):
print(i)
else:
print("루프가 정상적으로 완료되었습니다.") # 이 부분이 실행됩니다.
print("\n--- for-else 예시 (break로 종료) ---")
for i in range(5):
print(i)
if i == 2:
print("2에서 break!")
break
else:
print("루프가 정상적으로 완료되었습니다.") # 이 부분은 실행되지 않습니다.
이 else 절은 루프가 성공적으로 완료되었는지 여부를 확인해야 할 때 유용하게 사용될 수 있습니다.
✔ 마무리 - 구조는 다르지만, 의도는 같다.
Java와 Python은 모두 조건에 따라 흐름을 제어하고 반복을 수행하는 제어문 구조를 가지고 있지만, 그 표현 방식은 전혀 다릅니다.
Java는 중괄호와 세미콜론을 통해 명확한 블록 구조를 가지며, 전통적인 C 계열 언어의 문법을 따릅니다. 반면, Python은 콜론과 들여쓰기만으로 블록을 정의하여 보다 간결하고 가독성 높은 코드 작성을 가능하게 합니다.
특히 Python의 elif, for in, range(), enumerate(), 그리고 else 절이 붙는 for/while문은 처음에는 낯설 수 있지만, 익숙해질수록 코드가 더 읽기 쉬워지고 작성 속도도 빨라집니다.
또한, 리스트 컴프리헨션 같은 Python 고유 문법은 Java의 for-each + 조건문 + 필터링 로직을 한 줄로 요약할 수 있는 강력한 도구입니다.
📌요약
🔸 Python은 블록을 들여쓰기로 구분하며, 이로 인해 구조가 훨씬 깔끔해진다.
🔸 조건문에서는 if, elif, else의 구조와 **논리 연산자(and, or, not)**의 사용 방식이 다르다.
🔸 반복문은 for in, range(), enumerate() 등을 중심으로 모든 iterable 객체에 대해 간단하게 순회할 수 있다.
🔸 while, break, continue는 Java와 매우 유사하지만, Python만의 else 절 활용은 독특한 차별점이다
Python의 제어문은 문법의 유연함보다 ‘의도를 명확하게 드러내는 것’에 초점을 둡니다.
Java 개발자라면 처음엔 다소 낯설 수 있지만, 문법 구조를 몇 차례 써보고 직접 실행해보면 곧 “왜 이렇게 설계되었는지” 납득하게 될 것입니다.
※ 게시된 글 및 이미지 중 일부는 AI 도구의 도움을 받아 생성되거나 다듬어졌습니다.
'3.SW개발 > Python' 카테고리의 다른 글
| [Java관점]5편. Python 클래스와 객체지향 – Java보다 유연한 설계 방식 이해하기 (1) | 2025.11.12 |
|---|---|
| [Java관점]4편. Python 함수와 메서드 – 호출 방식과 선언 구조 비교 (0) | 2025.11.11 |
| [Java관점]2편. Python 변수와 자료형 – Java보다 유연한 선언 방식 비교 (0) | 2025.11.10 |
| [Java관점]1편. Python 설치와 구조 이해 – Java 개발자를 위한 입문 가이드 (0) | 2025.11.10 |
| [Python요약]7. Python 자료형 정리 : List, Tuple, Dictionary, Set, Sequence, Range (3) | 2025.11.05 |