Golang_정리하기_4

[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
        17
        func 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
      12
      type 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
      13
      type 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
      51
      package 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
        17
        package main

        import "fmt"

        func printVal(i interface{}) {
        fmt.Println(i)
        }

        func main() {
        var x interface{} //빈 인터페이스 선언

        x = 1
        printVal(x)

        x = "test"
        printVal(x)
        }
      • 위의 예에서 x의 값에따라 다르게 형을 선언하지 않고 출력하는것을 확인할 수 있다.

#

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×