루프

루프 에서 Julia

2개의 연습 문제

루프 소개

루프에는 기본적으로 두 가지 유형이 있어요:

  1. 조건이 만족될 때까지 반복하는 루프
  2. 컬렉션의 원소를 순회하는 루프

둘 다 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에는 (당연히도) 컬렉션을 다루는 다양한 방법이 있어요. 명시적인 루프나 컴프리헨션의 간결한 루프만 있는 게 아니에요.

나중 개념에서는 브로드캐스팅이나 고차 함수 같은 대안을 살펴봐요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요

루프 배우기