본문 바로가기

갈아먹는 go [2] 제어문 사용하기

들어가며

go에서 조건문, 반복문, break, continue 등의 기본적인 사용 방법은 다른 언어들과 유사합니다. 그러나 go에서만 제공하는 편리한 기능들이 숨어 있습니다. 이번 포스팅에서는 go의 각종 제어문들의 기본적인 사용 방법과 기능들에 대해서 알아보겠습니다. 

 

모든 소스코드는 다음 레포에서 확인 가능합니다.

https://github.com/yeomko22/go_basics/tree/master/ch2_flow_control

 

yeomko22/go_basics

go basic sample codes for practice. Contribute to yeomko22/go_basics development by creating an account on GitHub.

github.com

if 조건문 사용하기

func basicIf() {
	a := 10
	if a > 5 {
		fmt.Println("bigger than 5")
	} else {
		fmt.Println("equal or less than 5")
	}
}

// 출력 결과
bigger than 5

go에서 조건문 if를 사용하기 위해서는 if 다음 () 없이 곧바로 조건을 넣어주면 됩니다.

if 조건문 안에서 함수 사용하기

func functionInsideIf() {
	filepath := "hello.txt"
	if a, err := ioutil.ReadFile(filepath); err == nil {
		fmt.Printf("%s", a)
	} else {
		fmt.Println(err)
	}
	filepath = "bye.txt"
	if a, err := ioutil.ReadFile(filepath); err == nil {
		fmt.Printf("%s", a)
	} else {
		fmt.Println(err)
	}
}

// 출력 결과
hello world!
open bye.txt: no such file or directory

if문 안에서 조건문을 실행하고 변수를 할당할 수 있습니다. 이렇게 사용할 경우 코드 라인 수가 확 줄어드는 효과가 있습니다. 

for 문 사용하기

func basicFor() {
	for i := 0; i < 5; i++ {
		fmt.Println(i)
	}
	i := 0
	for {
		if i > 5 {
			break
		}
		fmt.Println(i)
		i++
	}
}
// 출력 결과
0
1
2
3
4
0
1
2
3
4
5

for문의 경우도 마찬가지로 괄호를 생략한 채로 사용하면 됩니다. 그리고 go에서는 while 문이 없기 때문에 그냥 for문을 열고 조건을 입력하지 않으면 무한 루프로 동작합니다. 

label 이용해서 nested for문 break 하기

func nestedForWithLabel() {
Loop:
	for i := 0; i < 5; i++ {
		fmt.Println("i: ", i)
		for j := 0; j < 5; j++ {
			if j == 2 {
				break Loop
			}
			fmt.Println("j: ", j)
		}
	}
}

// 출력 결과
i:  0
j:  0
j:  1

라벨을 이용하면 중첩 for문을 한꺼번에 break 할 수 있습니다. 이 때 label 아리에 다른 코드가 들어가면 안되고 곧바로 for문이 시작해야 합니다.

goto문 사용하기

func basicGoto() {
	a := 1
	if a == 1 {
		goto ERROR1
	} else {
		goto ERROR2
	}
ERROR1:
	fmt.Println("error 1")
	return
ERROR2:
	fmt.Println("error 2")
	return
}

// 출력 결과
error 1

라벨을 이용하면 goto 문을 구현할 수 있습니다.

Switch문 사용하기

func basicSwitch(num int) {
	switch num {
	case 1:
		fmt.Println("ONE")
	case 2:
		fmt.Println("TWO")
		fallthrough
	case 3:
		fmt.Println("TRHEE")
	}
}

basicSwitch(1)
basicSwitch(2)

// 출력 결과
ONE
TWO
TRHEE

go에서의 switch문은 다른 언어와 유사하게 사용 가능합니다. 특징적인 부분은 해당 케이스만 실행하고 switch문을 종료합니다. 만일 해당 케이스를 실행하고 위에 이어져오는 케이스들을 실행하고 싶다면 fallthrough 명령어를 추가합니다.

func multipleCases(num int) {
	switch num {
	case 1, 2:
		fmt.Println("ONE or TWO")
	case 3:
		fmt.Println("TRHEE")
	}
}

multipleCases(1)
multipleCases(2)

// 출력 결과
ONE or TWO
ONE or TWO

여러 케이스들을 쉼표로 묶어서 처리해버릴 수도 있습니다.

func conditionInsideCase(num int) {
	switch {
	case num < 5:
		fmt.Println("UNDER FIVE")
	case num == 5:
		fmt.Println("EQUAL FIVE")
	case num > 5:
		fmt.Println("OVER FIVE")
	}
}

conditionInsideCase(4)
conditionInsideCase(5)
conditionInsideCase(6)

// 출력 결과
UNDER FIVE
EQUAL FIVE
OVER FIVE

case문에 조건문을 삽입하여 swtich 문을 사용할 수도 있습니다. (사실 이럴꺼면 if문을 쓰면 되지 않을까 싶은 생각이 들긴합니다.)

마치며

이번 포스팅에서는 go에서 반복문, 조건문 등 기본적인 제어문을 어떻게 사용할 수 있는지, 그리고 go에서 제공하는 독특한 기능들은 어떤 것들이 있는지 알아보았습니다. 언어라는 것이 자주 쓰지 않으면 자꾸만 까먹어서 이러한 기초적인 문법도 헷갈리는 상황을 많이 경험했습니다. 언제나 그렇듯 기본기가 중요하다는 것을 알고 있었지만 소홀했던 것이 반성이 되네요 ㅎㅎ

 

이어지는 포스팅들에서도 go의 기초적인 개념들을 훑어보겠습니다.

 

감사합니다.