Golang의 for 루프를 완벽하게 이해하기 위해, 실용적인 예제들을 코딩하며 함께 알아봅시다.
최근 들어 Rust, Golang, 그리고 TypeScript와 같은 프로그래밍 언어들이 개발자들 사이에서 큰 인기를 얻고 있습니다. 특히 백엔드 개발이나 DevOps 분야에 관심이 있다면, Golang 학습을 고려하는 것이 매우 현명한 선택일 것입니다!
프로그래밍 언어의 기본을 배우기 시작하는 단계라면, 루프 구조는 가장 먼저 확실히 이해해야 할 핵심 개념 중 하나입니다.
Golang은 오직 for 루프 구조만을 제공합니다. 하지만 for 루프를 활용하여 다른 종류의 루프들을 어떻게 구현하는지 살펴보겠습니다.
이제 시작해 볼까요!
Golang for 루프의 문법
Golang에서는 다음 문법을 사용하여 for 루프를 생성할 수 있습니다.
for 초기화; 조건; 업데이트 { // 실행할 코드 }
여기서,
- 초기화는 루프 변수의 초기값을 설정합니다.
- 조건은 루프 본문을 실행할지 결정하는 조건입니다. 조건이 참(true)인 동안 루프 본문의 코드가 실행됩니다. 조건이 거짓(false)이 되면 루프가 종료됩니다.
- 업데이트는 루프 변수를 변경하는 부분으로, 보통 증가시키거나 감소시키는 역할을 합니다.
💡 C 언어의 for 루프와 거의 비슷하지만 괄호가 없다는 점에 주목하세요.
Golang for 루프의 실행 흐름은 다음과 같습니다.
이제 몇 가지 예제를 코딩해 볼 시간입니다! ⏰ Golang을 로컬에 설치하여 실행하거나, Go Playground를 이용하여 예제를 직접 실행할 수 있습니다.
Golang For 루프 예제
지금까지 배운 문법을 사용하여 첫 번째 for 루프를 작성해 보겠습니다. 아래 코드는 1부터 5까지의 숫자를 차례대로 출력하는 간단한 for 루프입니다.
package main import "fmt" func main() { fmt.Println("For 루프:") num := 5 for i := 1; i <= num; i++ { fmt.Println(i) } }
루프 변수 i를 1로 초기화하고, 조건은 i가 5보다 작거나 같을 때까지로 설정했습니다. 그리고 각 반복마다 루프 변수를 1씩 증가시킵니다. 결과는 다음과 같습니다.
// 출력 결과 For 루프: 1 2 3 4 5
다른 for 루프를 작성해 봅시다. 이 루프는 5부터 시작하여 1까지 역으로 카운트다운합니다. 반복 변수가 1보다 크거나 같을 때까지 루프가 계속되며, 각 반복 후에는 반복 변수를 1씩 감소시킵니다.
package main import "fmt" func main() { fmt.Println("For 루프:") num := 5 for i := num; i >= 1; i-- { fmt.Println(i) } }
예상대로 다음과 같은 결과를 얻습니다.
// 출력 결과 For 루프: 5 4 3 2 1
루프 변수의 범위는 어떻게 되나요?
루프 변수의 범위는 해당 for 루프 블록 내부로 제한되며, 루프 외부에서는 접근할 수 없습니다.
이것을 확인하기 위해 루프 외부에서 반복 변수 i의 값에 접근해 보겠습니다.
package main import "fmt" func main() { fmt.Println("For 루프:") num := 5 for i := 1; i <= num; i++ { fmt.Println(i) } fmt.Println(i) }
예상대로, i가 정의되지 않았다는 오류가 발생합니다. (i의 범위는 for 루프 안으로 제한됩니다).
// 출력 결과 ./prog.go:11:14: undefined: i
Golang의 무한 For 루프
Go에서 무한 for 루프를 사용할 수 있을까요? 네, 가능합니다!
for 루프의 실행 흐름을 살펴보면:
- 루프 본문은 조건이 참으로 평가되는 한 계속 실행됩니다.
- 조건이 거짓이 되면 루프가 종료됩니다.
- 따라서 조건이 거짓이 되지 않거나 항상 참이면, 루프는 무한히 실행됩니다.
하지만 초기화, 조건, 그리고 업데이트 부분 없이 for 루프를 사용할 수도 있습니다. 따라서 다음과 같은 for 루프 구조를 사용하여 루프가 무한히 실행되도록 만들 수 있습니다.
package main import "fmt" func main() { for { fmt.Println("실행 중...") } }
// 출력 결과 실행 중... 실행 중... 실행 중... 실행 중... 실행 중... // 그리고 이것은 영원히 계속됩니다!
다음 예제에서는 변수 num을 5로 설정합니다. 그리고 루프 조건은 num > 0으로 설정되어 있습니다. 따라서 num이 0보다 큰 동안 루프가 실행됩니다.
package main import "fmt" func main() { num := 5 for num > 0 { fmt.Println(num) } }
num의 값은 절대 변하지 않으므로, 조건은 항상 참으로 평가되고 루프는 영원히 실행됩니다!
// 출력 결과 5 5 5 5 5 5 // 그리고 이것은 영원히 계속됩니다!
Golang에는 오직 for 루프 구조만 존재합니다. 하지만 for 루프를 이용하여 while 및 do-while 루프를 구현할 수 있습니다. 어떻게 하는지 알아봅시다!
For 루프를 사용하여 While 루프 구현하기
while 루프는 일반적으로 다음과 같은 형태를 가집니다.
// 루프 변수 초기화 while (조건){ // 코드 실행 // 루프 변수 업데이트 }
이전에 살펴본 무한 for 루프에서 초기화, 조건, 업데이트 없이 for 루프를 다음과 같이 사용할 수 있다는 것을 알았습니다.
for { // 가장 간단한 무한 루프 }
따라서 while 루프를 구현하기 위해, for 루프에서 조건만 포함하도록 수정할 수 있습니다.
// 루프 변수 초기화 for 조건 { // 코드 실행 // 루프 변수 업데이트 }
다음은 앞에서 작성했던 첫 번째 for 루프와 동일한 작업을 하는 while 루프입니다.
package main import "fmt" func main() { fmt.Println("While 루프 구현") num := 5 for num > 0 { fmt.Println(num) num-- } }
// 출력 결과 While 루프 구현 5 4 3 2 1
For 루프를 사용하여 Do-While 루프 구현하기
C 언어와 같은 언어로 코딩해 본 경험이 있다면, do-while 루프의 구조가 다음과 같다는 것을 알 것입니다.
// 루프 변수 초기화 do { // 코드 실행 // 루프 변수 업데이트 } while(조건);
while 루프와 do-while 루프의 주요 차이점은 while 루프가 루프에 진입하기 전에 조건을 검사하는 반면, do-while 루프는 루프를 실행한 후에 조건을 검사한다는 점입니다.
따라서 while 루프에서 조건이 거짓으로 평가되면 루프 본문은 전혀 실행되지 않습니다. 하지만 do-while 루프에서는 조건이 거짓으로 평가되더라도 루프 본문이 최소 한 번은 실행됩니다.
이 정보를 이용하여 do-while 루프의 동작을 구현할 수 있습니다.
- 무한 for 루프를 작성합니다.
- if 조건문을 사용하여 올바른 조건일 때 루프를 중단합니다.
예를 들어, num < 0일 때 루프 본문을 실행하고 싶다고 가정해 봅시다. 그러면 num >= 0일 때 루프를 빠져나오도록 for 루프를 작성할 수 있습니다.
package main import "fmt" func main() { fmt.Println("Do-While 루프 구현") num := 5 for { fmt.Println("루프 실행...") if num >= 0 { break } } }
💡 num < 0일 때 루프를 실행하고, num >= 0일 때 루프를 중단하는 것은 동일한 조건입니다.
num > 0 조건은 처음에는 거짓이지만 (num이 5이므로), 루프 본문은 한 번 실행되어 do-while 루프를 성공적으로 구현합니다.
// 출력 결과 Do-While 루프 구현 루프 실행...
For 루프를 사용하여 배열 순회하기
for 루프와 range 키워드를 함께 사용하면 Golang에서 배열을 순회할 때 인덱스와 요소 모두에 접근할 수 있습니다. 이는 Python의 enumerate 함수와 유사하게 작동합니다.
여기서는 정수 배열인 numArray를 생성합니다. 그리고 for 루프를 사용하여 배열을 순회합니다.
package main import "fmt" func main() { fmt.Println("배열 순회") numArray := []int{3, 7, 0, 10, 8, 9} for idx, num := range numArray { fmt.Println("인덱스", idx, ": ", num) } }
보시다시피, 인덱스와 각 인덱스에 해당하는 요소에 동시에 접근할 수 있습니다.
// 출력 결과 배열 순회 인덱스 0 : 3 인덱스 1 : 7 인덱스 2 : 0 인덱스 3 : 10 인덱스 4 : 8 인덱스 5 : 9
Golang For 루프에서 defer 사용하기
Golang에서는 defer 키워드를 사용하여 함수 호출을 연기할 수 있습니다.
주로 리소스 정리나 오류 처리와 같은 작업에 사용되지만, for 루프 내에서 defer를 사용하는 방법을 이해하는 것이 유용할 수 있습니다. for 루프 내에서 Println() 함수 호출을 연기할 때 어떤 일이 발생하는지 살펴보겠습니다.
package main import "fmt" func main() { fmt.Println("For 루프:") num := 5 for i := 1; i <= num; i++ { defer fmt.Println(i) } }
💬 함수 호출이 지연되면, 함수 호출은 스택에 푸시되고, LIFO (후입선출) 순서로 실행됩니다. 이 실행은 defer 문을 둘러싼 함수가 반환된 후에만 발생합니다.
따라서 fmt.Println(5)가 먼저 실행되고, fmt.Println(1)이 마지막에 실행됩니다.
// 출력 결과 For 루프: 5 4 3 2 1
결론
이 튜토리얼에서 배운 내용을 요약하면 다음과 같습니다.
- Golang에서는 for 초기화; 조건; 업데이트 { // 루프 본문 } 구문을 사용하여 for 루프를 생성할 수 있습니다.
- for 루프의 실행 흐름은 매우 간단합니다. 루프 변수는 한 번 초기화되고, 조건 검사를 통해 루프 본문을 실행할지 결정하며, 업데이트는 각 반복 후 루프 변수를 갱신합니다.
- 루프 변수의 범위는 루프 본문 내부로 제한되며, 루프 외부에서는 접근할 수 없습니다.
- Golang은 for 루프 구조만 제공하지만, for 루프를 사용하여 while 및 do-while 루프의 동작을 구현할 수 있습니다.
- for 루프의 다른 활용 예시로는 배열을 순회하거나 for 루프 본문 내부에서 함수 호출을 지연시키는 것이 있습니다.
다음으로는 Python에서 for 루프를 사용하는 방법을 배우세요. 즐거운 코딩 학습 되세요! 🎉