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

2024. 11. 18. 23:25·Language/Go

서론

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
'Language/Go' 카테고리의 다른 글
  • [golang] path/filepath 패키지로 멀티 플랫폼에서 파일 경로 처리
  • [golang] flag 패키지로 명령줄 옵션 처리하기
  • [golang] runtime 패키지로 메모리 사용 추적
  • [golang] 메모리 지역성을 고려한 2차원 슬라이스 순회
在晟
在晟
  • 在晟
    Jae-Sung
    在晟
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • Language (23)
        • Go (23)
      • DBMS (1)
        • MariaDB (1)
      • Notes (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Jae-Sung
    • GitHub
  • 인기 글

  • 태그

    fasthttp
    go
    interface{}
    recover
    filepath
    오블완
    Runtime
    unsafe
    http
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
在晟
[golang] Go 언어 철학에서 switch문이 살아 남은 이유
상단으로

티스토리툴바