for문의 차이
위 for 문은 C, C++, C#, Java 등에서 흔히 접할 수 있는 for문의 형태 입니다.
C와 자바를 사용하시는 분들이라면 매우 익숙하실 텐데요.
하지만 파이썬을 주로 사용하는 분들에게는 다소 어색할 수도 있을 것 같습니다.
저는 코딩을 C와 자바로 처음 배웠다 보니,
파이썬의 반복문은 상당히 낮설었습니다.
이는 코틀린의 반복문 역시 마찬가지였습니다.
변수 하나를 두고, 해당 변수의 범위를 지정하는 방식으로 for문이 작동하였습니다.
조건식 + 증감식 기반 vs 대입 기반
파이썬의 반복문을 위와 같이 리스트 내 원소를 순회하는 용도로 사용하는 것을 볼 수 있습니다.
이는 list 내 원소 하나 하나 씩 i에 대입이 된다고 볼 수 있습니다.
range(n1, n2) 역시 마찬가지입니다.
n1 ~ n2 까지 범위를 생성해, 해당 범위 내 원소 하나 하나가 i에 대입되는 형식으로 작동합니다.
반면에 c와 자바의 for문이 매 반복마다 조건식을 검사하고, 증감식을 실행하여 작동합니다.
이는 범위 + 대입 기반의 코틀린, 파이썬의 for문과 작동 방식 자체가 다르다고 볼 수 있습니다.
반복문과 그 부수효과(Side Effect)
부수효과(Side Effect)란, 함수 내 참조 변수가 외부에 있어 영향을 받거나 미치거나,
혹은 원래 의도한 것과 다른 효과 또는 부작용이 생기는 것을 의미합니다.
위 for문과 조건식과 증감식에 선언한 변수를 for문 내에서 직접적으로 컨트롤 할 경우,
프로그램의 흐름이 예상치 못하게 변경이 될 수 있습니다.
for문은 일반적으로 특정 횟수만큼 반복하거나,
리스트 내 원소의 개수만큼 반복하는데 특화된 반복문입니다.
위와 같이 특정 조건에 따라 매개변수를 컨트롤해 반복문의 흐름을 제어하는 데에는
while문이 더 적합하다고 볼 수 있습니다.
출력 : 1, 2, 3, 4, 5
반면, 파이썬의 for문은 중간에 매개변수인 i를 3으로 변환시킨다 하더라도,
'1, 2, 3, 4, 5 범위가 생성됨 -> 범위 내 원소 하나하나가 i에 대입' 되는 형태이기 때문에,
반복문의 전체 흐름에는 영향을 미치지 않습니다.
파이썬과 코틀린의 for문의 경우,
위와 같이 반복문의 매개변수를 직접 컨트롤해 발생하는 부수효과를 최소화 하기 위해,
발전된 형태라고 볼 수 있을 것 같습니다.
Queue에서 원소를 꺼낼때, Queue의 Size 만큼 반복?
자바 for문의 경우
Queue 하나를 놓고, 1,2,3,4 - 4개의 원소를 넣었습니다.
이를 모두 큐에서 꺼내기 위해 queue의 사이즈만큼 반복문을 돌렸습니다.
그럼, 1~4 까지 원소가 모두 꺼내질까요?
출력 : 1, 2
아니요.
i = 0 일때 큐에서 하나를 꺼냅니다. 큐의 사이즈는 3이 됩니다.
i = 1 일때 큐에서 하나를 꺼냅니다. 큐의 사이즈는 2가 됩니다.
i = 2 일때, i < queue.size() 조건문을 검사해보지만, queue의 사이즈는 2이기 때문에 반복문이 종료됩니다.
출력 : 1, 2, 3 ,4
의도한 것과 같은 동작을 하려면 큐의 size를 별도의 변수로 할당하고, 해당 변수를 조건문에 넣어야 합니다.
이 역시 for문의 부수효과 중 하나로 볼 수 있습니다.
코틀린 for문의 경우
출력 : 1, 2, 3, 4
코틀린 for문의 경우는, 자바처럼 매 반복마다 조건식 확인 + 증감식 실행이 아닌,
파이썬과 같이 0 이상 ~ 큐 사이즈(4) 미만 범위가 생성된 뒤,
해당 원소 하나하나가 i에 대입되는 형태이며, 4번의 반복이 실행됩니다.
이는 데이터의 상태가 변하지 않는다는 점에서 불변성(Immutability)과도 밀접한 관련이 있습니다.
향상된/확장된 for문
c와 java의 확장된 for문 (향상된 for문)은 파이썬, 코틀린처럼 이러한 불변성과 가변성을 고려하여
리스트/배열을 순회하기 위해 각 원소가 직접 하나 하나 대입되는 형태입니다.
이 역시 불변성을 고려해 데이터 변경을 최소화하여 부수효과를 줄이고자 설계된 형태입니다.
원소를 수정해야 하거나, 인덱스가 필요할 경우엔 적절하지 않으므로,
필요에 따라 기존 for문과 확장 for문을 혼합하여 사용하는 것이 좋습니다.
마치며
C, 자바의 for문과 코틀린, 파이썬의 for문이 다르게 생긴 걸 보고 생긴 고민이였는데,
코틀린을 계속 다루다 보니, for문이 어째서 이런 형태가 되었는지 조금은 알 것 같습니다.
for문과 while문의 근본적인 사용 목적과,
비교적 최신 프로그래밍 언어인 Python, Kotlin의 for문에 대해
제가 고민했던 것을 조금이나마 정리해봤습니다.
'기타' 카테고리의 다른 글
[Intellij 에러] error: unmappable character (0xE3) for encoding x-windows-949 에러 (0) | 2023.09.05 |
---|---|
유클리드 거리와 맨해튼 거리 (0) | 2023.08.21 |
x가 0이 아니면서 x와 -x가 같은 경우가 있을까? (백준 15549번) (0) | 2023.08.08 |
라이브러리와 프레임워크의 공통점과 차이점 (0) | 2023.08.04 |
노션 API를 사용해보자! (feat. 포스트맨) (0) | 2022.06.27 |