GO언어 입문 #3

학미새🐥·2022년 2월 23일
1
post-custom-banner

if문

if 조건문 {
	문장
} else if 조건문 {
	문장
} else {
	문장
}

if 초기문; 조건문

  • initializer
    if 초기문; 조건문 {
    	문장
    }
  • ex
if filename, success := UploadFile(); success {
	fmt.Println("Upload success", filename)
} else {
	fmt.Println("Failed to upload")
}
//filename, success는 if문 전체에서 사용 가능하다

switch문

switch 비굣값 {
case1:
	문장
case2:
	문장
default:
	문장
}
  • 비굣값이 여러개일 땐 콤마로 나열
switch day {
case "monday", "tuesday":
	fmt.Println("월, 화요일은 수업 가는 날입니다.")
case "wednesday", "thursday", "friday":
	fmt.Println("수,, 금요일은 실습 가는 날입니다.)
}

조건문 비교(if문을 switch문으로 사용)

switch true {
case temp<10, temp>30:
	fmt.Println("바깥 활동하기 좋은 날씨가 아닙니다.")
case temp>=10 && temp<20:
	fmt.Println("약간 추울 수 있으니 가벼운 겉옷을 준비하세요.")
case temp>=15 && temp<25:
	fmt.Println("야외 활동하기 좋은 날씨입니다.")
default:
	fmt.Println("따뜻합니다.")
}

비굣값이 true가 되기 때문에 case(조건)의 결과가 true에 해당하는 경우 내부 문장을 실행한다.

switch 초기문

switch 초기문; 비굣값 {
case1:
	...
case2:
	...
default:
	...
}
  • ex
func main() {
	switch age := getMyAge(); age {
    case 10:
    	fmt.Println("Teenage")
    case 33:
    	fmt.Println("Pair 3")
    default:
    	fmt.Println("My age is", age)  //switch 내부에서 age변수 사용가능
    }
    
    fmt.Println("age is", age)  //에러-switch문 밖에서는 age변수 사용불가
}

const 열거값과 switch

package main

import "fmt"

type ColorType int //별칭타입 - int형을 ColorType형이라고 부른다는 뜻
const (
	Red ColorType = iota	//0
    Blue					//1
    Green					//2
    Yellow					//3
)

func colorToString(color ColorType) string {
	switch color {
    case Red:
    	return "Red"
    case Blue:
    	return "Blue"
    case Green:
    	return "Green"
    case Yellow:
    	return "Yellow"
    default:
    	return "Undefined"
    }
}

func getMyFavoriteColor() ColorType {
	return Red
}

func main() {
	fmtPrintln("My favorite color is", colorToString(getMyFavoriteColor()))
}
//My favorite color is Red

break & fallthrough

  • C언어에서는 switch문을 사용하는 경우 각 case마다 break문을 실행하지 않으면 아래 case의 실행문까지 모두 실행되었다.
  • 그러나 Go언어에서는 break문이 없어도 값에 해당하는 case문이 끝나면 알아서 switch문을 빠져나가게 되기 때문에 break를 사용하지 않아도 된다.

    fallthrough : 다음 case문까지 이어서 실행한다는 뜻

func main() {
	a := 3
    
    switch a {
    case 1:
    	fmt.Println("a==1")
    case 2:
    	fmt.Println("a==2")
    case 3:
    	fmt.Println("a==3")
        fallthrough
    case 4:
    	fmt.Println("a==4")
    default:
    	fmt.Println("a != 1, 2, 3")
    }
}

// a==3
// a==4
  • a의 값이 3이기 때문에 case3에 해당되어 "a==3"을 출력하지만, case 3 내부에 fallthrough가 있기 때문에 case4의 실행문까지 함께 출력된다.

for 반복문

  • Go언어에서는 반복문의 종류가 for밖에 없다 (while문, do-while문이 없다)
for 초기문; 조건문; 후처리 {  //괄호를 사용하지 않아도 된다
	코드블록
}
  • 초기문 생략
    for ; 조건문; 후처리 { }
  • 후처리 생략
    for 초기문; 조건문; { }
  • 초기문과 후처리 생략
    for ; 조건문; { } or for 조건문 { }
  • 무한 루프 (모두 생략 가능)
    for true { } or for { }

continue와 break

  • continue : 후처리로 건너뛴다
  • break : for문을 종료한다
package main

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

func main() {
	stdin := bufio.NewReader(os.Stdin)
    for {
    	fmt.Println("입력하세요")
        var number int
        _, err := fmt.Scanln(&number)  //_:변수를 안쓰겠다는 의미
        if err!= nil {
        	fmt.Println("숫자로 입력하세요")
            
            //키보드 버퍼를 지우기
            stdin.ReadString('\n')  //변수로 받을 필요 없음
            continue
        }
        fmt.Println("입력하신 숫자는 %d입니다.\n", number)
        if number%2 == 0 {   //짝수검사
        	break
        }
    }
    fmt.Println("for문이 종료되었습니다.")
}

중첩for문과 break, 레이블

특정 조건일 때 for문을 종료하고 싶다면?
1. 플래그 변수 활용 (flag 변수)
2. 레이블 활용

  • 플래그 활용 예제
func main() {
	a := 1
    b := 1
    found := false
    for ; a<=9; a++ {
    	for b = 1; b <= 9; b++ {
        	if a * b == 45 {
            	found = true
                break
            }
        }
        if found {
        	break
        }
    }
    fmt.Println("%d * %d = %d\n", a, b, a*b)
}
// 5 * 9 = 45

플래그 변수를 사용하지 않고 break만 사용하면 break가 속한 하나의 for문(내부for문)에서만 벗어나게 된다.
중첩된 모든 for문에서 벗어나기 위해, break전에 플래그 변수를 true로 설정하여, 내부for문에서 벗어난 뒤 바깥 for문에서 바로 플래그 변수를 조건문으로 검사하여 한번더 break를 실행하여 모든 for문에서 빠져나갈 수 있다.

  • 레이블 활용 예제
func main() {
	a := 1
    b := 1
    
OuterFor:  //Label
    for ; a<=9; a++ {
    	for b = 1; b <= 9; b++ {
        	if a * b == 45 {
                break OuterFor  
            }
        }
    }
    fmt.Println("%d * %d = %d\n", a, b, a*b)
}

OuterFor: // 레이블 명 지정
~
break OuterFor // 레이블이 첫번째로 만나는 for문까지 벗어나기

profile
뭐든 다해보려는 공대생입니다
post-custom-banner

0개의 댓글