[GoLang] if문,switch문,for문

Pyo·2023년 10월 28일
0


이 글은 Tucker의 Go언어 프로그래밍책의 if문,switch문,for문을 공부하고 정리한 내용이다.

if문

if문은 조건에 따라 프로그램 명령 흐름을 분기하는 구문이다. if문을 사용하면 다양한 상황에 대응해 처리 할수 있다.

if문 기본 사용법

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

if문에 만족하지 않으면 else if문을 , else if문을 만족하지 않으면 else문을 실행하게 된다.

그리고 && , 또는 ||

논리 연산자를 사용하여 if문을 작성할수 있다.

쇼트서킷

&& 연산 : 좌변이 false이면 우변을 검사하지 않고 false 처리 한다.
|| 연산 : 좌변이 true이면 우변을 검사하지 않고 true 처리 한다.


package main

import "fmt"

var cnt int = 0

func IncreaseAndReturn() int {
	fmt.Println("IncreaseAndReturn()", cnt)
	cnt++
	return cnt

}

func main() {

	// && 연산자 이기 때문에 false 바로 반환 함수 호출 x , 출력 x
	if false && IncreaseAndReturn() < 5 {
		fmt.Println("1증가")
	}

	// || 연산자 이기 때문에 true 바로 반환 함수 호출 x , 출력 o
	if true || IncreaseAndReturn() < 5 {
		fmt.Println("2증가")
	}

	fmt.Println("cnt:", cnt)

}

소괄호 () 활용

소괄호를 사용하게 되면 다양한 조건문을 쉽게 만들수 있다.

if hasBooked() || (money > 200 && hasEmptySeat())

중첩 if

if문 안에 if문을 중첩해 사용할 수도 있다. 복잡한 경우를 표현할 때 사용한다.

if 초기문;조건문

if문 조건을 검사하기 전에 초기문을 넣을 수 있다. 초기문은 검사에 사용할 변수를 초기화한다.

package main

import "fmt"

func getMyAge() (int, bool) {
	return 33, true
}

func main() {

	if age, ok := getMyAge(); 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")
	}
	// fmt.Println("Your age is", age) 소멸

}

초기문에서 선언한 변수의 범위는 if문 안으로 한정된다. 따라서 if문을 벗어나면 선언된 변수에 접근할 수 없다.

정리


if 조건문 {
	문장
}


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

if 조건문1 {
	문장
} else if 조건문2 {
	문장
} else if 조건문3 {
	문장
} else{
	문장
}

if 초기문; 조건문{
	문장
}

switch문

switch문은 비굣값과 같은 case에 해당하는 문장을 수행한다. 변숫같에 따라서 다른 명령을 수행해야 하는 경우 유용하다.

switch문 동작 원리

switch 비굣값 {
case 값1:
	문장
case 값2:
    문장
default:
    문장
}

switch문을 언제 쓰는가?

switch문을 사용하면 복잡한 조건의 if else 문을 사용할때 보다 깔끔하게 정리하여 가독성을 높일수 있다.

다양한 switch문 형태

한번에 여러값 비교

package main

import "fmt"

func main() {
	day := "thursday"

	switch day {
	case "monday", "tuesday":
		fmt.Println("월,화요일은 수업 가는 날입니다.")
	case "wednesday", "thursday", "friday":
		fmt.Println("수,목,금요일은 실습 가는 날입니다.")
	}

}

하나의 case는 하나 이상의 값을 비교할수 있다.

조건문 비교

if문 처럼 true가 되는 조건문을 검사할 수 있다.

switch 초기문

if문 처럼 switch문에도 초기문을 넣을수 있다.

switch 초기값; 비굣값 {
case 값1:
...
case 값2:
...
default :
}

const 열거값과 switch

const 열거값에 따라 수행되는 로직을 변경할때는 switch문을 주로 사용한다.

package main

import "fmt"

type ColorType int

const (
	Red ColorType = iota
	Blue
	Green
	Yellow
)

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 Blue
}

func main() {
	fmt.Println("My favorite color is", colorToString(getMyFavoriteColor()))
}

break와 fallthrough

Go언어 에서는 break를 사용하지 않아도 case 하나 실행후 자동으로 switch문을 빠져나간다.
만약 case문 실행후 다음 case문까지 같이 실행하고 싶을때는 fallthrough 키워드를 사용한다. fallthrough 되도록 사용하지 않는다.

package main

import "fmt"

type ColorType int

const (
	Red ColorType = iota
	Blue
	Green
	Yellow
)

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 Blue
}

func main() {
	fmt.Println("My favorite color is", colorToString(getMyFavoriteColor()))
}

정리

switch 비굣값{
case 값1:	// 비굣값과 값1이 같을 때 수행합니다.
	문장
case 값2:	// 비굣값과 값2이 같을 때 수행합니다.
	문장
default:	// 만족하는 case가 없을 때 수행합니다.
	문장	// default 구문은 생략 가능합니다.
}


switch {		// 비굣값을 생략하면 비굣값은 true가 됩니다.
	case 값1:	// 조건문1이 true이면 실행합니다.
		문장
	case 값2:	// 조건문2이 true이면 실행합니다.
		문장
	default:	// 모든 case의 조건문이 false이면 실행합니다.
		문장	// default 구문은 생략 가능합니다.
}


// 초기문이 먼저 실행되고 비굣값을 case들과 비교합니다.
switch 초기문; 비굣값{
	case 값1:	// 비굣값과 값1이 같을 때 수행합니다.
		문장
	case 값2:	// 비굣값과 값2이 같을 때 수행합니다.
		문장
	default:	// 만족하는 case가 없을 때 수행합니다.
		문장	// default 구문은 생략 가능합니다.
}

for문

for문은 반복된 일을 수행할 때 유용한 구문이다.

for문 동작 원리

for 초기문; 조건문; 후처리{
	코드 블록			// 조건문이 true인 경우 수행됩니다.
}
  • 초기문 생략 : for ; 조건문 ; 후처리 {...}
  • 후처리 생략 : for 초기문 ; 조건문 {...}
  • 조건문만 있는 경우 : for ;조건문; {...}
  • 무한 루프 : for true {...}

continue 와 break

  • continue : continue는 이후 코드블록을 수행하지 않고, 후처리를 하고 조건문 검사부터 다시 한다.
  • break : for문에서 곧바로 빠져나온다.
package main

import "fmt"

func main() {
	for i := 0; i < 10; i++ {
		if i == 3 {
			continue
		}
		if i == 6 {
			break
		}
		fmt.Println("6 *", i, "=", 6*i)
	}
}

출력

6 * 0 = 0
6 * 1 = 6
6 * 2 = 12
6 * 4 = 24
6 * 5 = 30

중첩 for문

for문을 중첩해서 사용가능 하며 , 한 번 이상 중첩해 사용한 for문을 중첩 for문이라고 한다.

중첩 for문과 break,레이블

중첩 for문에서 빠져나가는 방법

  • 플래그 사용
package main

import "fmt"

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.Printf("%d * %d = %d\n", a, b, a*b)
}
  • 레이블 사용
package main

import "fmt"

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

OuterFor:
	for ; a <= 9; a++ {
		for b = 1; b <= 9; b++ {
			if a*b == 45 {
				break OuterFor
			}
		}
	}

	fmt.Printf("%d * %d = %d\n", a, b, a*b)
}
  • 함수 사용
package main

import "fmt"

func find45(a int) (int, bool) {
	for b := 1; b < 9; b++ {
		if a*b == 45 {
			return b, true
		}
	}
	return 0, false
}

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

	for ; a <= 9; a++ {
		var found bool

		if b, found = find45(a); found {
			break
		}
	}

	fmt.Printf("%d * %d = %d\n", a, b, a*b)
}

출력

5 * 9 = 45

정리

for문은 조건이 true이면 코드 블록을 반복 수행합니다. continue와 break를 통해서 for문 후처리로 가거나 해당 반복문을 빠져나갈 수 있습니다.

참고

https://www.youtube.com/@TuckerProgramming

0개의 댓글