갈루아의 반서재

다음과 같이 1에서 10까지 숫자 옆에 짝수, 홀수 여부도 같이 출력되는 프로그램을 만들어보자. 

1
2
3
4
5
6
7
8
9
10
1 odd
2 even
3 odd
4 even
5 odd
6 even
7 odd
8 even
9 odd
10 even
cs

먼저 해당 숫자가 짝수인지 홀수인지 판명하는 방법이 필요하다. 가장 쉬운 방법은 2로 나눈 것이다. 만약 나머지가 없으면 짝수이고, 그렇지 않으면 홀수이다. 

그다음 해당 조건에 입각해서 짝수, 홀수 여부에 따라 서로 다른 결과를 출력하는 명령문을 만든다. 대략 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
if i % 2 == 0 {
 
  // even
 
else {
 
  // odd
 
}
 
 
cs

If 문은 조건 다음에 블록이 오는 형태가 for 문과 유사하다. 하지만 If 문에는 els;e 파트가 있다. If 문이 true 인 경우 조건문 다음 블록의 명령을 실행하게 되고, 그렇지 않은 경우에는 해당 블록은 건너뛰거나 else 문이 있으면 그 블록안의 명령을 실행한다. 

If 문은 else if 파트도 포함할 수 있다. 다음을 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if i % 2 == 0 {
 
  // divisible by 2
 
else if i % 3 == 0 {
 
  // divisible by 3
 
else if i % 4 == 0 {
 
  // divisible by 4
 
}
 
 
cs

조건은 위에서 아래 방향으로 그 부합여부를 따져보게 된다. 위의 예에서 8을 i 값으로 입력한 경우, 8은 2와 4 모두 나눠서 나머지가 0 이지만, 위에서 아래로 실행하다보니, // divisible by 4 블록은 절대 실행될 일이 없다. 

이상의 내용을 합쳐보면 다음과 같다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
 
import "fmt"
 
func main() {
  for i := 1; i <= 10; i++ {
    if i % 2 == 0 {
        fmt.Println(i, "even")
    } else {
        fmt.Println(i, "odd")
    }
  }
}
cs

다음과 같이 실행되는 셈이다.

int 타입의 변수 i 를 생성해, 초기값 1을 부여한다.

i 가 10보다 작거나 같은가? Yes

블록으로 진입해 코드를 실행한다.

i 를 2로 나눈 나머지가 0인가? No

else 블록 진입

i odd 출력

i 값을 1 증가시킨다

i 가 10보다 작거나 같은가? Yes

블록으로 진입해 코드를 실행한다.

i 를 2로 나눈 나머지가 0인가? No

if 블록 진입

i even 출력

실행결과는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
~/go/src/golang-book/chapter5# go run main.go
1 odd
2 even
3 odd
4 even
5 odd
6 even
7 odd
8 even
9 odd
10 even
cs