Switch문 동작 원리
Go 언어의 switch문은 하나 이상의 변수 값이나 표현식의 결과에 따라 다양한 분기로 코드 실행을 전환한다. 기본적으로, switch 다음에 오는 표현식의 값과 case 라벨에 명시된 값이 일치하는 경우 해당 case 블록의 코드가 실행된다.
Switch문을 언제 쓰는가?
하나의 변수나 표현식에 대해 여러 가능한 값이 있고, 각각의 경우에 대해 다른 작업을 수행해야 할 때.
여러 if-else 조건문을 보다 명확하고 가독성 있게 표현하고 싶을 때.
다양한 Switch문의 형태를 알아보자
기본 형태: 특정 변수의 값에 따라 분기 처리한다.
switch 변수 {
case 값1:
// 실행 코드
case 값2:
// 실행 코드
default:
// 기본 실행 코드
}
표현식을 사용한 형태: switch 다음에 변수를 명시하지 않고, 각 case에서 표현식을 사용할 수 있다.
switch {
case 표현식1:
// 실행 코드
case 표현식2:
// 실행 코드
}
x := 5
y := 10
switch {
case x < y:
fmt.Println("x는 y보다 작습니다.")
case x == y:
fmt.Println("x와 y는 같습니다.")
default:
fmt.Println("x는 y보다 큽니다.")
}
타입 스위치: 변수의 타입에 따라 분기 처리한다. 주로 인터페이스 타입의 변수에 사용된다.
switch 변수.(type) {
case 타입1:
// 실행 코드
case 타입2:
// 실행 코드
}
var i interface{} = "Hello"
switch v := i.(type) {
case int:
fmt.Println("정수:", v)
case string:
fmt.Println("문자열:", v)
default:
fmt.Println("알 수 없는 타입")
}
인터페이스 변수란?
다양한 타입의 값들을 저장할 수 있는 동적 타입을 가진 변수.
var i interface{}
i = "Hello" // 처음에는 string 타입의 값을 저장
fmt.Println(i)
i = 42 // 나중에는 int 타입의 값을 저장
fmt.Println(i)
i = true // 그 다음에는 bool 타입의 값을 저장
fmt.Println(i)
<잠깐!>
인터페이스의 개념은 다양한 프로그래밍 언어에서 찾아볼 수 있는데
구현 방식과 사용 방법이 언어마다 다르다.
Java의 인터페이스는 메서드의 시그니처만을 정의하는 추상 타입이다.
개인은 클래스에서 하나 이상의 인터페이스를 구현할 수 있는데 이때 인터페이스의 모든 메서드를 구현해야 한다.
(여기서부터는 내가 실제로 안 다뤄 본 영역이다.)
C#에서도 인터페이스가 구현을 포함하면 안 된다고 한다. 클래스 또는 구조체에서 인터페이스를 구현한다고 한다.
Python에서는 인터페이스를 사용하지 않고 덕 타이핑(duck typing)을 사용한다고 한다. 그러나 abc(Abstract Base Classes) 모듈을 사용하여 인터페이스와 유사한 추상 기반 클래스를 정의할 수 있다고 한다.
TypeScript와 같은 정적 타입 언어에서도 인터페이스를 사용한다고 한다. TypeScript의 인터페이스는 컴파일 타임에 타입 체크를 위해 사용되는데 런타임에는 제거된다고 한다.
Swift에는 인터페이스가 없고 그와 유사한 역할을 하는 프로토콜이 있다고 한다. 프로토콜은 메서드, 프로퍼티, 기타 요구사항의 청사진을 정의하고, 클래스, 구조체, 열거형은 이러한 프로토콜을 채택하여 요구사항을 구현할 수 있다고 한다.
흥미롭다.
어쨌든 인터페이스(또는 유사한 개념)는 타입의 추상화, 다형성 지원, 코드의 결합도 낮추기 등의 목적으로 사용된다.
더 기록하고 싶은 게 많은데 여기서 끊겠다.
Const 열거값과 Switch
const로 선언된 열거값들과 switch문을 함께 사용하여 코드의 가독성을 높이고, 에러 가능성을 줄일 수 있다.
const (
상수1 = iota
상수2
상수3
)
switch 변수 {
case 상수1:
// 실행 코드
case 상수2:
// 실행 코드
}
break와 fallthrough 키워드
Break: Go의 switch문에서는 각 case가 자동으로 break된다. 즉, case에 해당하는 코드를 실행한 후 자동으로 switch문을 빠져나온다. 따라서 별도의 break 키워드 사용이 필요 없다.
Fallthrough: 명시적으로 다음 case로 넘어가고 싶은 경우 fallthrough 키워드를 사용한다. 이는 해당 case의 코드를 실행한 후, 다음 case의 코드도 실행하도록 한다. 단, fallthrough는 조건을 검사하지 않고 다음 case로 바로 넘어간다.
switch 변수 {
case 값1:
// 실행 코드
fallthrough
case 값2:
// 값1이나 값2에 해당할 때 실행될 코드
}
fallthrough는 참 재밌다.
switch x {
case 1:
fmt.Println("x는 1입니다.")
fallthrough
case 2:
fmt.Println("x는 1 또는 2입니다.")
}
여기서 x가 1이면 조건 검사하고 x는 1이라는 메시지가 나온다.
그런데 'fallthrough'가 달려 있으면
바로 아래의 조건을 '검사 안 한다'.
그냥 x는 1 또는 2입니다가 나온다.
그리고 자동으로 break 걸려 있으니까 빠져 나온다.
Tucker의 Go 언어 프로그래밍 10장을 이렇게 정리합니다.
11장으로 꼬우!!!