[golang] for loop

개발者·2024년 8월 22일
0

Golang

목록 보기
6/6
post-thumbnail

Go언어에서 For 문에 대해 알아보자

Go는 단순한 언어의 특성을 반영하듯 반복문에 while 문은 없고 for 문만 존재한다. 이러한 특징은 Go의 철학인 "단순함"을 잘 보여준다. 하지만 for문 하나로 다양한 반복 패턴을 구현할 수 있어 실용적이기도 하다.
각 형태별로 메모리 사용 측면에서 어떤 특징이 있는지 살펴보자.


기본 for 루프

for i := 0; i < 10; i++ {
    fmt.Println(i)
}

이 형태는 C 언어 스타일의 for 루프와 유사하다. 메모리 측면에서 가장 효율적인 방식이다. 루프 변수 i는 단 한 번만 초기화되고, 매 반복마다 값만 변경된다. 따라서 추가적인 메모리 할당이 발생하지 않는다.

integer range for loop

go 1.22 관련

위 글에서도 언급한 적 있는 기능으로 go 1.22 부터 추가된 기능이다.

// 기존의 for 루프
for i := 0; i < 5; i++ {
    fmt.Println(i)
}

// 새로운 range 구문
for i := range 5 {
    fmt.Println(i)
}

위와 같이 좀 더 간결하고 가독성 있는 코드를 기존과 거의 동일하게 효율적으로 사용할 수 있게 되었다.

조건문만 있는 for 루프

i := 0
for i < 10 {
    fmt.Println(i)
    i++
}

이 형태는 다른 언어의 while 루프와 비슷하다. 메모리 사용 측면에서 기본 for 루프와 크게 다르지 않다. 단, 루프 변수를 외부에서 선언하므로 루프 종료 후에도 해당 변수가 메모리에 남아있게 된다.

range를 이용한 for 루프

numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
    fmt.Printf("Index: %d, Value: %d\n", index, value)
}

range를 사용한 for 루프는 편리하지만, 메모리 사용 측면에서 주의가 필요하다. 이 방식은 각 반복마다 인덱스와 값의 복사본을 생성한다.작은 데이터 타입(int, float 등)에서는 큰 문제가 되지 않지만, 큰 구조체나 배열을 다룰 때는 성능 저하가 발생할 수 있다.

메모리 효율을 높이려면 다음과 같이 포인터를 활용할 수 있다.

for i := range numbers {
    value := &numbers[i]
    // value를 통해 직접 numbers[i]를 수정할 수 있다
}

이 방식은 값의 복사 없이 직접 원본 데이터에 접근하므로, 대용량 데이터를 다룰 때 유용하다.


결론적으로, Go의 for 루프는 단순하면서도 다양한 상황에 대응할 수 있는 유연성을 제공한다. 메모리 효율성을 고려한다면 기본 for 루프나 포인터를 활용한 range 루프를 사용하는 것이 좋다. 하지만 항상 코드의 가독성과 유지보수성도 함께 고려해야 한다는 점을 잊지 말자.
Go 언어의 이러한 특성은 "실용주의적 프로그래밍"을 지향하는 Go의 철학을 잘 보여준다. 단순하면서도 강력한 도구를 제공함으로써, 개발자가 효율적으로 코드를 작성할 수 있게 해준다.

profile
solrasido

0개의 댓글