[golang] Go 언어 철학에서 switch문이 살아 남은 이유

서론
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 |