[Go] 06. if문, switch문, for문

2024. 1. 16. 17:00Go

반응형

go에서는 java for문에서 초기값을 선언할 수 있는 것과 같이 if문과 switch문에서도 초기값을 선언할 수 있습니다.


1. if문

1.1. if 초기문; 조건문

go에서는 if문 내에서만 사용가능한 초기문을 선언할 수 있습니다.
단, 그 선언문문은 if-else 블럭 밖에서는 사용할 수 없습니다.

package main

import "fmt"

func main() {
	if age, ok := getAge(); ok && age < 20 {
		fmt.Println("You are young", age)
	} else if ok && age < 30 {
		fmt.Println("Nice age", age)
	} else if ok {
		fmt.Println("You are beautiful", age)
	} else {
		fmt.Println("Error")
	}
	// age, ok 사용 불가능
}

func getAge() (int, bool) {
	return 24, true
}

2. switch

go에서는 switch문의 case에서 break를 작성하지 않아도, 기본적으로 case하나 실행 후 switch문을 빠져나갑니다.

fallthrough 키워드를 이용할 경우, case 실행 후 그 다음 case도 실행하지만, 이 키워드는 코드 혼동을 주기 때문에 사용하지 않는 것을 권장합니다.


2.1. 여러값을 한번에 비교

switch문에서 하나의 case에 여러개의 값을 쉼표로 구문하여 비교할 수 있습니다.

package main

import "fmt"

func main() {
	day := "friday"

	switch day {
	case "friday":
		fmt.Println("금요일은 불금!")
	case "saturday", "sunday":
		fmt.Println("주말 너무 좋아요")
	default:
		fmt.Println("월화수목 월화수목")
	}
}

2.2. 조건문 비교

스위치의 비교값에 true를 넣어, if문과 같이 조건문 비교를 case에 설정할 수 있습니다.

이때, switch true {}switch {}로 줄여쓸 수 있습니다.

switch true {

}

비교값이 true인 경우에는 case에 비교구문을 작성할 수 있습니다.

or 조건을 case에 작성하고 싶다면 , 또는 || 로 구분지어 조건을 나열하면 되고
and 조건은 && 를 사용하면 됩니다

switch {
case temp < 10, temp > 30:
  fmt.Println("놀러가기 좋지 않은 날씨입니다")
case temp > 15 && temp < 20:
  fmt.Println("적당한 겉옷을 입고 나가면 좋을 날씨입니다")
default:
  fmt.Println("기타")
}

2.3. switch문에서 초기문 사용

switch문에서도 초기문을 설정할 수 있으며, 초기문에 설정한 변수는 switch블럭 내에서만 사용 가능합니다.

package main

import "fmt"

func getAge() int {
	return 30
}
func main() {
	switch age := getAge(); age {
	case 18:
		fmt.Println("18살!")
	case 30:
		fmt.Println("30!!!")
	default:
		fmt.Println("내 나이는", age)
	}

	// switch 블록 밖에서는 age 변수 사용 불가
}

초기문 사용과 함께 조건문을 사용하고 싶다면 아래와 같이 비교값을 생략하면 됩니다.

switch age:= getAge(); {
}

2.4. switch문에 const 열거값 활용

const 열거값을 파라미터로 받아, 열거타입에 따른 switch case 실행하는 것도 자주 이용되는 방식입니다.

package main

import "fmt"

type ColorType int

const (
	Red ColorType = iota
	Blue
	Yellow
	Black
)

func colorToString(color ColorType) string {
	switch color {
	case Red:
		return "red"
	case Blue:
		return "blue"
	default:
		return "etc"
	}
}

func getMyColor() ColorType {
	return Blue
}

func main() {
	fmt.Println("내가 가장 좋아하는 색은", colorToString(getMyColor()))
}


3. for문

for문은 for 초기문; 조건문; 후처리 {}로 구성되며,
if문과 switch문과 마찬가지로 초기문에 선언된 변수는 for코드블럭 안에서만 사용가능합니다.

for i := 0; i < 10; i++ {
	fmt.Print(i, ", ")
}
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

초기문, 후처리는 생략 가능하고, 생략할 때에는 기본적으로 쉼표는 표시해야하나,

for i := 0; i < 10; {
	fmt.Print(i, ", ")
	i++
}

i := 0
for ; i < 10; i++ {
	fmt.Print(i, ", ")
}

조건문만 있는 경우에는 쉼표 생략이 가능합니다.

java에서 while문을 대신하는 기능입니다.

i = 0
for i < 10 {
	fmt.Print(i, ", ")
	i += 2
}

3.1. 무한루프

if문에서도 그랬던것 처럼 조건문에 true를 설정할 수 있습니다.
이를 이용하여 무한루프를 나타낼 수 있습니다.

for true {

}

조건문 true는 생략 가능하여 아래와 같이 간단한 형태도 가능합니다.

for {

}

3.2. continue, break

java에서 제공하는 continue, break도 지원합니다.

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	stdin := bufio.NewReader(os.Stdin)
	for {
		fmt.Print("숫자를 입력하세요(종료: 0): ")
		var num int
		_, err := fmt.Scanln(&num)
		if err != nil {
			fmt.Println("Error! 숫자 값을 입력해야합니다")
			_, _ = stdin.ReadString('\n')
			continue
		}
		fmt.Printf("입력한 숫자는 %d 입니다\n", num)
		if num == 0 {
			break
		}
	}
	fmt.Println("End")
}
숫자를 입력하세요(종료: 0): 29
입력한 숫자는 29 입니다
숫자를 입력하세요(종료: 0): hi
Error! 숫자 값을 입력해야합니다
숫자를 입력하세요(종료: 0): 2
입력한 숫자는 2 입니다
숫자를 입력하세요(종료: 0): 0
입력한 숫자는 0 입니다
End
public void test() {
	hi
}

3.3. label

레이블을 설정하여, 중첩 for문에서 특정 for문을 종료시킬 수도 있습니다.

package main

import "fmt"

func main() {

	a := 1
	b := 1

OuterFor:
	for ; a <= 9; a++ {
		for b = 1; b <= 9; b++ {
			if a*b == 30 {
				break OuterFor
			}
		}
	}
	fmt.Printf("%d * %d = %d\n", a, b, a*b)
}
5 * 6 = 30

다만, label 을 이용한 반복문 종료는 사용자 혼란을 주는 면이 있기 때문에 사용하지 않는 것을 권장합니다.

또, 중첩 반복문은 최대한 제거하는 방향으로 코드를 작성하여, 플래그 변수나 레이블 사용 없이 코드를 작성하는 것을 권장합니다.

package main  

import "fmt"  

func main() {  
  a := 1  
  b := 1  

  for ; a <= 9; a++ {  
   var found bool  
   if b, found = find30(a); found {  
    break  
   }  
  }  
  fmt.Printf("%d * %d = %d\n", a, b, a*b)  
}  

func find30(a int) (int, bool) {  
  for b := 1; b <= 9; b++ {  
   if a*b == 30 {  
    return b, true  
   }  
  }  
  return 0, false  
}
728x90
반응형

'Go' 카테고리의 다른 글

[Go] 08. 포인터  (0) 2024.01.18
[Go] 07. 배열, 구조체  (1) 2024.01.17
[Go] 05. 함수, 상수  (0) 2024.01.15
[Go] 03. fmt - 2. 표준입력  (0) 2024.01.14
[Go] 03. fmt - 1. 출력  (0) 2024.01.14