루프에는 기본적으로 두 가지 유형이 있어요:
둘 다 Julia에서 가능하지만, 두 번째가 더 흔할 수 있어요.
while문루프를 도는 횟수를 미리 알 수 없는 열린 문제에는 Julia의 while문을 사용해요.
기본 형태는 아주 간단해요:
while condition
do_something()
end
이 경우 프로그램은 condition이 더 이상 true가 아닐 때까지 루프를 계속 돌아요.
루프를 일찍 빠져나가는 방법은 두 가지가 있어요:
break는 루프를 빠져나가고, 실행은 루프의 end 다음 줄에서 계속돼요.return x는 현재 함수의 실행을 멈추고, 반환값 x를 호출한 쪽에 돌려줘요.이런 방법을 사용할 수 있으니, while true ... end로 "무한" 루프를 만들고 루프 본문 안에서 멈출 조건을 찾아 break나 return을 실행하는 게 편리할 때도 있어요.
가장 간단한 예는 범위를 순회하는 거예요.
어떤 작업을 10번 하고 싶다면:
for n in 1:10
do_something(n)
end
현재 반복이 어떤 조건을 만족하지 못하면 continue로 곧바로 다음 반복으로 건너뛸 수 있어요:
for n in 1:10
if is_useless(n)
continue
end
# we decided this iteration could be useful
do_something_slow(n)
end
더 짧은 형태로는 if 블록을 is_useless(n) && continue로 대신할 수 있어요.
다른 여러 컬렉션 유형도 순회할 수 있어요: 배열의 원소, 문자열의 문자, 딕셔너리의 키...
조건은 컬렉션이 iterable이어야 한다는 거예요.
이건 나중 개념에서 더 자세히 설명하지만, 핵심은 컬렉션이 요청하면 다음 항목을 내놓는 방법과, 끝에 도달해 더 이상 항목이 없다는 걸 알려 주는 방법을 갖추어야 한다는 거예요.
지금까지의 예제는 1:10 범위를 순회했고, 여기서는 값이 곧 루프 인덱스예요.
더 일반적으로는 값뿐 아니라 인덱스가 필요할 수도 있어요.
이럴 때는 eachindex() 함수를 사용해요. 예를 들어 for i in eachindex(my_array) ... end처럼요.
Julia에서는 명시적인 루프를 직접 쓰는 일이 많은 전통적인 언어보다 드물어요. 더 간결한 방법이 여러 가지 있기 때문이에요.
특히 흔한 상황은 다른 컬렉션(벡터, 문자열, 집합... 여러 가지가 있어요)의 원소로 새 벡터를 만들어야 할 때예요.
Python의 리스트 컴프리헨션을 좋아하는 분이라면 Julia도 비슷한 문법을 쓸 수 있다는 걸 알게 되어 반가울 거예요.
핵심은 벡터 안에 아주 간결한 루프를 만드는 거예요.
가장 간단한 문법은 result = [f(x) for x in some_collection] 형태예요.
전통적인 루프로 쓰면 이렇게 될 거예요:
result = []
for x in some_collection
push!(result, f(x))
end
원한다면 끝에 조건을 붙여 컬렉션에서 조건에 맞는 원소만 골라낼 수 있어요:
# multiples of 3
julia> [n^2 for n in 1:10 if n%3 == 0]
3-element Vector{Int64}:
9
36
81
# letters beyond 'h' in the alphabet
julia> [uppercase(c) for c in "Julia" if c > 'h']
3-element Vector{Char}:
'U': ASCII/Unicode U+0055 (category Lu: Letter, uppercase)
'L': ASCII/Unicode U+004C (category Lu: Letter, uppercase)
'I': ASCII/Unicode U+0049 (category Lu: Letter, uppercase)
문법은 Python과 비슷 하지만 똑같지는 않아요. 여러 변수나 다차원 배열에서는 차이가 있기 때문에, 이 주제는 나중 개념에서 더 자세히 다뤄요.
현대적이고 대부분 함수형인 언어답게, Julia에는 (당연히도) 컬렉션을 다루는 다양한 방법이 있어요. 명시적인 루프나 컴프리헨션의 간결한 루프만 있는 게 아니에요.
나중 개념에서는 브로드캐스팅이나 고차 함수 같은 대안을 살펴봐요.