파이썬을 배우고 일반적인 반복문(for)에 익숙해질 때쯤이면 이런 고민, 한 번쯤 해보셨을 겁니다. "단순히 숫자들을 제곱해서 새 리스트를 만들거나 특정 조건의 데이터만 뽑아내고 싶은데, 왜 매번 빈 리스트를 만들고 append()를 써가며 여러 줄의 코드를 작성해야 할까?". 어디선가 남들이 코드를 한 줄로 폼 나게 줄여 쓴 것을 보면 '나도 무조건 저렇게 짧게 써야 더 좋은 코드일까?'라는 의문도 생기기 마련입니다.
오늘은 파이썬 코딩을 훨씬 간결하게 만들어주는 파이썬 리스트 컴프리헨션(List Comprehension)의 핵심 사용법과 for문과의 차이, 그리고 언제 쓰고 언제 피해야 하는지 그 명확한 선택 기준을 정리해 드리겠습니다.
💡 1. 리스트 컴프리헨션이란 무엇인가요?
리스트 컴프리헨션은 기존의 데이터를 반복 처리하면서 새로운 리스트를 생성할 때 사용하는 매우 간결한 파이썬 문법입니다. 리스트 안에 식, for 반복문, if 조건문 등을 직접 지정하여 리스트를 한 번에 만들어냅니다.
이 문법이 매력적인 이유는 단순히 파이썬 반복문 줄이기가 가능해서가 아닙니다. 일반 for문과 리스트 컴프리헨션 차이를 비교해 보면 그 이유를 확실히 알 수 있습니다.
# 1. 일반 반복문 (자세한 조리법)
numbers = [3, 5-7]
squares = []
for x in numbers:
squares.append(x * x)
# 2. 리스트 컴프리헨션 (요약 레시피)
numbers = [3, 5-7]
squares = [x * x for x in numbers]
일반 반복문은 빈 리스트를 만들고, 반복하고, append로 추가하는 단계가 분리되어 있습니다. 반면 리스트 컴프리헨션은 '무엇을 반복해서 어떤 결과를 만들지'가 한 줄에 응축되어 한눈에 파악하기 쉽습니다.
📖 2. 헷갈리는 문법, 어떻게 읽어야 할까?
초보자가 리스트 컴프리헨션을 처음 접할 때 가장 당황하는 부분은 바로 '읽는 순서'입니다. 일반 for문과 달리 결과 표현식이 맨 앞에 오기 때문에 거꾸로 읽는 느낌이 들 수 있습니다.
기본적인 구조는 [표현식 for 변수 in 리스트 if 조건식]으로 구성됩니다.
# 짝수만 골라 2를 곱하는 예제
evens = [x * 2 for x in range(10) if x % 2 == 0]
이 코드를 해석할 때는 가운데 -> 끝 -> 앞 순서로 흐름을 타면 이해하기 쉽습니다.
- for x in range(10) : 0부터 9까지 숫자를 돌면서
- if x % 2 == 0 : 짝수인 경우만 골라내어
- x * 2 : 그 숫자에 2를 곱한 결과를 새 리스트로 모은다.
⚖️ 3. 실전 활용 기준 : 짧은 코드가 항상 좋은 코드일까?
리스트 컴프리헨션 사용법을 익히면 코드를 전부 한 줄로 바꾸고 싶은 유혹에 빠지기 쉽지만, 남용하면 오히려 독이 됩니다. 짧고 읽기 좋은 반복 처리를 위해 다음 기준을 꼭 기억하세요.
- 적극 추천하는 경우 (O) : 기존 값들을 일정한 규칙으로 단순 변환하거나, 조건에 맞는 값만 필터링해 새 리스트를 만들 때 아주 강력합니다.
- 사용을 피해야 하는 경우 (X) :
- 가독성 저하 : 다중 for문이나 복잡한 if-else 로직이 섞여 코드가 길어지는 경우입니다. 루프가 3단계 이상 깊어지거나 한 줄이 너무 길어진다면 일반 for문을 쓰는 것이 훨씬 나은 선택입니다.
- 메모리 문제 : 데이터 양이 방대할 경우 리스트 컴프리헨션은 모든 요소를 한 번에 메모리에 올리므로 프로그램이 느려질 수 있습니다. 이럴 때는 대괄호 [] 대신 소괄호 ()를 사용하는 제너레이터(Generator) 표현식을 활용해 메모리를 아끼는 것이 좋습니다.
- 부수 효과(Side Effect) : 리스트 생성 목적이 아니라, 단순히 print() 함수 등을 실행하기 위한 용도라면 리스트 컴프리헨션을 쓰지 말아야 합니다.
⚠️ 4. 입문자가 자주 하는 치명적 실수
파이썬 리스트 컴프리헨션을 쓸 때 초보자들이 가장 자주 겪는 문법 오류는 '괄호 누락'입니다. 예를 들어 두 리스트에서 값을 하나씩 뽑아 튜플 쌍으로 묶고 싶을 때, [x, y for x in A for y in B]라고 적으면 문법 오류가 발생합니다.
파이썬은 리스트 내포 안에서 단 하나의 표현식만 허용하므로, 여러 값을 넣으려면 반드시 괄호로 묶어 [(x, y) for x in A for y in B] 형태의 튜플로 만들어야 정상 작동합니다. 괄호 하나의 유무가 문법 오류를 결정짓는다는 점을 꼭 기억하세요.
🎯 마무리하며
결론적으로 파이썬 리스트 컴프리헨션은 가독성 좋은 파이썬 코드를 작성하기 위한 훌륭한 선택지입니다. 하지만 리스트 컴프리헨션은 단순히 '짧게 쓰기 위한 기술'이 아니라 코드를 '명확하게 표현하기 위한 선택'으로 이해해야 합니다.
단순한 데이터 가공에는 리스트 컴프리헨션의 간결함을 누리고, 로직이 복잡해져 해독하는 데 시간이 걸린다면 과감하게 일반 반복문으로 풀어쓰는 지혜를 발휘해 보세요. 반복문과 리스트의 관계를 명확히 이해하셨다면, 다음 단계로는 함수 안에서 입력값과 반환값이 어떻게 연결되는지 학습해 보시길 추천합니다!

반응형