본문 바로가기
Language/Golang

Golang (Go언어) IF문 (조건문)

by HeeWorld 2024. 10. 30.

Tucker의 Go 언어 프로그래밍 책과 유튜브를 통해 학습 중입니다.

 

Golang 마스코트 Gopher(고퍼)

 

IF문 (조건문)

- 만족하는 조건문의 {} 안에 있는 문장을 실행

- 만족하는 조건문이 없으면 else 구문 {} 안에 있는 문장을 실행

- else if 와 else 구문은 생략할 수 있음

- if문의 컨디션은 불리언 타입이라 조건을 사용하면 결과는 true, false로 나옴

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

 

package main

import "fmt"

func main() {
	tmep := 33

	if tmep > 28 {
		fmt.Println("에어컨을 켠다")
	} else if tmep >= 3 {
		fmt.Println("히터를 켠다")
	} else if tmep <= 18 {
		fmt.Println("나가자")
	} else {
		fmt.Println("덥다")
	}
}

// 결과

에어컨을 켠다.

 

- 맨위부터 검사를 해서, true면 결과를 실행하고 if문을 빠져 나오게 됨 (다른 조건은 검사 안함)

 

 

&&(AND) / ||(OR) 조건

- &&와 ||는 논리연산자로, &&는 그리고(AND)로 해석하고, ||(OR)는 또는으로 해석

- A와 B 두 불리언 값이 있을 때 &&는 양쪽이 모두 true인 경우에 true이며, ||은 둘 중 하나만 true여도 true

package main

import "fmt"

func main() {
	var age = 32

	if age >= 10 && age <= 15 {
		fmt.Println("You are young")
	} else if age > 30 || age < 20 {
		fmt.Println("You are not 20s")
	} else {
		fmt.Println("Best age of your life")
	}
}

// 결과

You are not 20s

 

if age >= 10 && age <= 15 {
- age가 10 이상이고 15 이하인 경우


} else if age > 30 || age < 20 {

- age가 30보다 크거나 20보다 작은 경우, 20대가 아닌 경우

 

 

쇼트서킷

- && 연산은 좌변이 false 이면 우변을 검사하지 않고 flase 처리를 함

- || 연산도 좌변이 true이면 우변은 검사하지 않고 true 처리를 함

- 이를 쇼트 서킷(Short-Circuit)이라고 함

 

문제가 될 수 있는 소지가 있는데, 우변이 function을 call하는 경우 리턴을 불리언으로하는 function을 호출하는 경우,

function 자체가 호출이 되지 않아서 생길 수 있는 문제가 있음.

package main

import "fmt"

var cnt int = 0

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

func main() {
	if false && IncreaseAndReturn() < 5 {
		fmt.Println("1 increase")
	}
}

// 결과 값

없음

 

- 해당 예문은 쇼트서킷에 의해 IncreaseAndReturn() 함수가 호출되지 않음

 

if false && IncreaseAndReturn() < 5 {

- && 좌변이 false이기 때문에 우변 IncreaseAndReturn() 함수를 호출하지 않고 조건문 결과가 fasle가 됨

 

만약 if true && IncreaseAndReturn() < 5 { 였다면, true이기 때문에 "1 inscrease"가 결과 값으로 출력되었을 것임.

아니면 if false || IncreaseAndReturn() < 5 { 였다면, 앞에가 false여도 우변을 검사하기 때문에 true이면 결과 값이 출력 됨.

 

✓ If문은 값만 비교해야지 내부 조작/연산을 하는 것은 쇼트서킷이 발생될 수 있어서 조건 검사에만 사용하는 것이 안전함

 

 

소괄호 활용

- 복잡한 조건문을 사용할 때, 어떤 연산을 먼저할 것인지 소괄호를 활용하여 쉽게 만들 수 있음.

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

 

hasBooked()부터 실행하여 true이면, or이니 뒷 부분은 다 무시되어 true가 될 것이고,

false라면, (money > 200 && hasEmptySear())을 검사하는데 memoy 부터 조건 검사를 시작함.

money가 없다면 쇼트 서킷이 일어나서 false이 되고, money가 200이상이라면 빈자리가 있으면 true로 내부 구문이 실행되고,

자리가 없어서 false가 되면 해당 구문을 빠져 나옴

 

 

중첩 If

- if문 안에 if문을 중첩해 사용할 수 있음

 

예문)

"음식값이 5만원이 넘고 친구 중에 부자가 있다면 신발끈을 묶는다. 부자가 없다면 돈을 나눠 낸다. 음식값이 3만원 이상 5만원 이하이고 같이 간 친구 수가 3명이 넘으면 신발끈을 묶는다. 3명 이하면 돈을 나눠 낸다. 3만원 미만이면 내가 낸다."

 

- 음식값 > 5만원 && 부자 친구 = true (신발끈을 묶는다) / false (돈을 나눠낸다)

- 음식값 >= 3만원 && 음식값 <= 5만원 

- 같이 간 친구 수 > 3 || 같이 간 친구 수 <=3 = true(신발끈을 묶는다) / false (돈을 나눠낸다)

- 음식값 < 3만원 = 내가 낸다

package main

import "fmt"

func richfriend() bool {
	return true
}

func friendscount() int {
	return 3
}

func main() {
	price := 35000

	if price > 50000 {
		if richfriend() {
			fmt.Println("앗! 신발끈이 풀렸네!")
		} else {
			fmt.Println("나눠내자")
		}
	} else if price >= 30000 && price <= 50000 {
		if friendscount() > 3 {
			fmt.Println("아이고, 신발끈이..!!")
		} else {
			fmt.Println("3명 밖에 없는데 나눠내자")
		}
	} else {
		fmt.Println("내가 살게!")
	}
}

// 결과

3명 밖에 없는데 나눠내자

 

- if문은 계속 중첩할 수 있지만, 중첩이 심한 경우 코드를 이해하기 어렵기 때문에 되도록 3중첩 이상은 하지 않도록 권장

 

 

If 초기문; 조건문

- if문 조건을 검사하기 전에 초기문(initialize=초기화)을 사용할 수 있음

- 검사에 사용할 변수를 초기화할 때 주로 사용

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

 

- 초기문 자리에 하나의 구문이 올 수 있으며 끝에 ;를 붙여서 구문이 끝남을 표시 후 조건문을 넣음

if filename, success := UploadFile(); success {
  fmt.Println("Upload success", filename)
} else {
  fmt.Println("Failed to upload")
}

 

filename, success := UploadFile(); 

- 초기문으로 UploadFile을 호출하는데, 결과를 filename과 success에 넣음 (uploadfile의 리턴 값은 2개일 것 string 타입과 불리언 타입=true/false)

 

success {

- 조건문으로 Upload에 성공했으면 그 아래 "Upload success", filename을 호출하고 실패했다면, else 구문을 출력