[Go tutorial] Go 정리하기 - 4
Go-tour 참조
구름edu 참조
스위치 (switch)
case의 라벨과 일치하는경우를 찾아 실행
어느것에도 맞지않다면 default문으로 실행 가능
break를 따로 입력하지 않아도 해당되는 case문만 실행된다.
스위치의 각 조건은 위에서 아래로 평가한다. 참인 case를 찾으면 평가를 마침.
switch 전달 인자
태그
표현식
전달되는 인자 없이 case에 표현식 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17func main() {
var a, b int
fmt.Print("정수 a와 b를 입력하시오:")
fmt.Scanln(&a, &b)
switch {
case a > b:
fmt.Println("a가 b보다 큽니다.")
case a < b:
fmt.Println("a가 b보다 작습니다.")
case a == b:
fmt.Println("a와 b가 같습니다.")
default:
fmt.Println("모르겠어요.")
}
}
메소드와 인터페이스
메소드란 특정 속성들(구조체)을 이용해 기능을 수행하기 위해 만들어진 함수이다.
선언
- “func (매개변수이름 구조체이름) 메소드이름() 반환형 {}” 형식으로 선언
매개변수 이름은 메소드 내에서 매개변수처럼 사용
1
2
3
4
5
6
7
8
9
10
11
12type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
fmt.Println(v.Abs()) ### print : 5
}위의 예에서는 메소드에 구조체를 붙였다.
뿐만 아니라 메소드에는 아무 타입이나 붙일 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13type MyFloats float64
func (f MyFloats) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
func main() {
k := MyFloats(-math.Sqrt2)
fmt.Println(k.Abs()) ### print : 1.4142135623730951
}위의 예에서는 float타입을 메소드에 붙였다.
인터페이스
구조체가 변수를 묶어놓은 것이라면, 인터페이스는 메소드를 모아놓은 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51package main
import (
"fmt"
"math"
)
type geometry interface {
area() float64
perimeter() float64
}
type Rect struct {
width, height float64
}
type Circle struct {
radius float64
}
func (r Rect) area() float64 {
return r.width * r.height
}
func (c Circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func (r Rect) perimeter() float64 {
return 2 * (r.width + r.height)
}
func (c Circle) perimeter() float64 { .Pi * c.radius
}
func main() {
r1 := Rect{10, 20}
c1 := Circle{10}
r2 := Rect{12, 14}
c2 := Circle{5}
printMeasure(r1, c1, r2, c2)
}
func printMeasure(m ...geometry) {
for _, val := range m {
fmt.Println(val)
fmt.Println(val.area())
fmt.Println(val.perimeter())
}
}위의 예를 보면 인터페이스 안에 메소드가 들어가있다. 또한, 같은 이름의 메소드가 두개씩 있다.
이름이 동일하게 선언되어도 메소드가 전달받는 구조체가 다르기 때문에 괜찮은것이다.
메인함수에서 구조체를 초기화하고 for문을 통해 각 구조체를 전달받은 메소드에 대해 결과값을 출력하고 있다.
빈 인터페이스
인터페이스는 어떠한 타입도 담을 수 있는 dynamic type 이다.
인터페이스는 매개변수로 사용할 수 있다.
인터페이스는 내용을 따로 선언하지 않아도 형으로 사용할 수 있다.
하나의 변수를 형이 다른 형태로 저장해 출력한다고 생각한다면, 매개변수형에 따른 2개 이상의 함수를 만들어야한다.
하지만 빈 인터페이스를 사용한다면, 어떤 형도 담을 수 있기 때문에 편하게 사용이 가능하게된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package main
import "fmt"
func printVal(i interface{}) {
fmt.Println(i)
}
func main() {
var x interface{} //빈 인터페이스 선언
x = 1
printVal(x)
x = "test"
printVal(x)
}위의 예에서 x의 값에따라 다르게 형을 선언하지 않고 출력하는것을 확인할 수 있다.