if 조건문

if statement

Go의 if 조건문은 조건에 괄호(())를 쓰지 않아도 된다는 점을 제외하면 C/C++, Java 등 언어의 그것과 유사하다. 물론 조건에 괄호를 쓰는 것도 가능하며, 복잡한 조건인 경우에는 괄호가 반드시 필요한 경우도 많다. 다만 세미콜론 자동 삽입 규칙에 따라 엔터를 마음껏 쓸 수 없다는 점에서는 차이가 있다.

var i = 1
if i == 1 {
	fmt.Println("One")
}

elseelse if를 쓰는 방법도 유사하다.

var i = 1

if i == 0 {
	fmt.Println("Zero")
} else if i == 1 {
	fmt.Println("One")
} else {
	fmt.Println("?")
}

Go는 암시적 형변환이 일어나지 않는 점은 명심하자. 즉, 다음과 같은 코드는 오류가 발생한다.

var i = 1
var p *int = &i

if i { // int is non-bool
	fmt.Println("not zero")
}

if p { // *int is non-bool
	fmt.Println("not nil")
}

변수에 값을 할당한 후 바로 조건에 사용하는 것도 가능하다. C를 예로 들면 다음과 같은 코드가 Go에서도 가능하다는 뜻이다.

/* C code */
int i;
if ((i = 1) == 1)
{
	printf("One\n");
}
// Go code
var i int
if i = 1; i == 1 {
	fmt.Println("One")
}

// or

if j := 1; j == 1 {
	fmt.Println("One")
}

위 Go code처럼 세미콜론(;)을 사용해 값 할당과 조건을 분리한다는 점에서 차이가 있다.1

간단한 실행문에서도…

조건문 내부에 간단한 실행문을 작성할 경우 C/C++, Java에서는 중괄호({})를 생략할 수 있었다.

// c/c++
if (i == 0)
	printf("Zero\n");

if (j == 0) printf("Zero, too\n");
// Java
if (i == 0)
	System.out.println("Zero");

if (j == 0) System.out.println("Zero, too");

하지만 Go의 if 조건문 작성 규칙은 다음과 같다.

IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" ( IfStmt | Block ) ] .

중요한 것은 Block인데,

Block = "{" StatementList "}" .

한 마디로 반드시 중괄호가 필요하다. 따라서 위 예는 Go에서는 다음과 같이 작성해야 한다.

// Go
if i == 0 {
	fmt.Println("Zero")
}

if j == 0 {fmt.Println("Zero, too")}

?

Go는 삼항 조건 연산자(Ternary operator)가 없다. 즉, 다음과 같은 코드는 작성할 수 없다.

int i = (j == 0 ? 0 : 1);

if, else를 사용하자.


  1. ‘세미콜론을 썼으니 대신 엔터를?’ 이라고 생각했다면 박수 받아 마땅하다. [return]