이 글은 Tucker의 Go언어 프로그래밍책의 if문,switch문,for문을 공부하고 정리한 내용이다.
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문 조건을 검사하기 전에 초기문을 넣을 수 있다. 초기문은 검사에 사용할 변수를 초기화한다.
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문은 비굣값과 같은 case에 해당하는 문장을 수행한다. 변숫같에 따라서 다른 명령을 수행해야 하는 경우 유용하다.
switch 비굣값 {
case 값1:
문장
case 값2:
문장
default:
문장
}
switch문을 사용하면 복잡한 조건의 if else 문을 사용할때 보다 깔끔하게 정리하여 가독성을 높일수 있다.
package main
import "fmt"
func main() {
day := "thursday"
switch day {
case "monday", "tuesday":
fmt.Println("월,화요일은 수업 가는 날입니다.")
case "wednesday", "thursday", "friday":
fmt.Println("수,목,금요일은 실습 가는 날입니다.")
}
}
하나의 case는 하나 이상의 값을 비교할수 있다.
if문 처럼 true가 되는 조건문을 검사할 수 있다.
if문 처럼 switch문에도 초기문을 넣을수 있다.
switch 초기값; 비굣값 {
case 값1:
...
case 값2:
...
default :
}
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()))
}
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 초기문; 조건문; 후처리{
코드 블록 // 조건문이 true인 경우 수행됩니다.
}
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문이라고 한다.
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문 후처리로 가거나 해당 반복문을 빠져나갈 수 있습니다.
참고