서론
Go 언어는 간결성, 명확성, 일관성을 중요시하는 철학을 바탕으로 설계되었다. 이러한 철학은 Go의 문법과 기능 설계에서 뚜렷하게 나타나며, 코드가 복잡해지지 않도록 돕고 간결하고 읽기 쉬운 코드를 작성할 수 있게 한다.
Go에서 반복문이 while문이나 do-while문과 같은 반복문은 제공하지 않고 for문만을 제공하는 것을 보면 이러한 철학을 느낄 수 있다. 이는 Go 언어가 코드의 복잡성을 줄이고 개발자가 한 가지 방법으로 문제를 해결하도록 유도하는 설계 방식이라고 생각한다.
반복문과 다르게 조건문에서는 if문과 switch문이 공존한다. switch문은 여러 조건을 한 번에 처리할 수 있는 강력한 도구이지만 대부분의 경우 if문으로도 대체할 수 있다. 하지만 switch문에서 fallthrough 기능은 조건문 처리에 있어 유연성을 제공하여 if문과 차별점을 가질 수 있다. 이러한 점이 Go에서 if문과 함께 switch문이 공존할 수 있었던 이유라고 생각된다.
이 글에서는 간단하게 if문과 비교해서 switch문이 좋은 상황을 정리해본다.
ELSE IF-ELSE IF-ELSE IF
if문은 직관적인 조건문으로 많이 사용되지만 특정 값에 따라 여러 분기 처리를 해야 할 때는 코드가 복잡해질 수 있다. 아래는 else if문이 반복적으로 사용된 예제다.
if model == "iPhone17,1" {
fmt.Println("iPhone 16 Pro")
} else if model == "iPhone17,2" {
fmt.Println("iPhone 16 Pro Max")
} else if model == "iPhone17,3" {
fmt.Println("iPhone 16")
} else if model == "iPhone17,4" {
fmt.Println("iPhone 16 Plus")
} else {
fmt.Println("Unknown model")
}
위 코드는 switch문을 사용하면 훨씬 간결하게 작성할 수 있다.
switch model {
case "iPhone17,1":
fmt.Println("iPhone 16 Pro")
case "iPhone17,2":
fmt.Println("iPhone 16 Pro Max")
case "iPhone17,3":
fmt.Println("iPhone 16")
case "iPhone17,4":
fmt.Println("iPhone 16 Plus")
default:
fmt.Println("Unknown model")
}
switch문은 반복되던 변수명과 비교 연산자를 제거하며 코드의 가독성을 크게 향상시킨다.
OR OR OR OR OR
if문에서는 OR 조건을 활용해 특정 값에 대한 처리를 할 수 있지만 동일한 변수를 반복적으로 비교해야 한다는 단점이 있다.
if day == "월" || day == "화" || day == "수" || day == "목" || day == "금" {
fmt.Println("평일")
} else if day == "토" || day == "일" {
fmt.Println("주말")
} else {
fmt.Println("400")
}
위 코드는 switch문을 사용하면 더 간결하게 표현할 수 있다.
switch day {
case "월", "화", "수", "목", "금":
fmt.Println("평일")
case "토", "일":
fmt.Println("주말")
default:
fmt.Println("400")
}
switch문에서는 다중 case를 하나로 묶을 수 있어 반복되는 조건식을 제거할 수 있다.
fallthrough without break;
Go의 switch문은 기본적으로 다른 언어에서 break를 작성한 것처럼 동작한다. 그러나 fallthrough 키워드를 사용하면 특정 조건을 만족한 후 다음 조건으로 진행하도록 할 수 있다. 아래는 권한을 역할별로 설정하는 예제다.
if문을 사용한 예제
type Permission struct {
View bool
Edit bool
Admin bool
}
func GetPermissionsByRole(role string) (p Permission) {
if role == "admin" {
p.Admin = true
p.Edit = true
p.View = true
} else if role == "editor" {
p.Edit = true
p.View = true
} else if role == "viewer" {
p.View = true
}
return
}
위 코드는 역할별 권한 설정을 위해 코드 중복이 발생한다. 이를 switch문과 fallthrough로 대체하면 중복을 제거할 수 있다.
switch문과 fallthrough를 사용한 예제
func GetPermissionsByRole(role string) (p Permission) {
switch role {
case "admin":
p.Admin = true
fallthrough
case "editor":
p.Edit = true
fallthrough
case "viewer":
p.View = true
}
return
}
fallthrough를 사용하면 admin은 editor와 viewer의 권한을 모두 포함하게 되고 코드 중복 없이 간결하게 처리할 수 있다.
마무리
여러 조건을 동시에 처리할 수 있는 switch문은 코드의 가독성과 유지보수성을 높이는 데 유리하며, fallthrough 기능을 통해 조건문 처리에 유연성을 더한다. Go 언어에서 while문이나 do-while문이 제공되지 않지만 switch문은 if문과 차별점을 인정받아 살아남았다고 생각한다. 개발자는 상황에 맞게 if문과 switch문을 적절히 활용하여 더 간결하고 효율적인 코드를 작성할 수 있다.
'Language > Go' 카테고리의 다른 글
[golang] path/filepath 패키지로 멀티 플랫폼에서 파일 경로 처리 (1) | 2024.11.20 |
---|---|
[golang] flag 패키지로 명령줄 옵션 처리하기 (0) | 2024.11.19 |
[golang] runtime 패키지로 메모리 사용 추적 (0) | 2024.11.17 |
[golang] 메모리 지역성을 고려한 2차원 슬라이스 순회 (0) | 2024.11.16 |
[golang] URL 및 쿼리 파라미터 파싱과 수정하기 (0) | 2024.11.15 |