06
03

fmt ์ถœ๋ ฅ์ด๋ž‘ ๊ฐ„๋‹จํ•œ ๋ณ€์ˆ˜์„ ์–ธ์€ ์ดˆ๊ธฐ์„ธํŒ… ๋•Œ ํ•ด๋ดค์œผ๋‹ˆ๊นŒ ๋„˜์–ด๊ฐ€๊ณ , ๋‹ค๋ฅธ ๊ธฐ์ดˆ๋ฌธ๋ฒ•๋ถ€ํ„ฐ ์ •๋ฆฌํ•˜๊ฒ ๋‹ค. ๋ณ€์ˆ˜ ์„ ์–ธ์—์„œ ์ถ”๊ฐ€๋กœ ๊ธฐ์–ตํ• ๋งŒํ•œ๊ฑด destructuring๋ž‘ ์Šค์™‘ ์ •๋„๋‹ค.

var d, e, f int = 40, 50, 60
g, h, i := 70, 80, 90
x, y := 1, 2
x, y = y, x // ์ด๊ฒŒ ๋œ๋‹ค...

# ํ•จ์ˆ˜ func - ๋‹จ์ผ ๊ฐ’ ๋ฐ˜ํ™˜, ๋‹ค์ค‘ ๊ฐ’ ๋ฐ˜ํ™˜, ๋ฐ˜ํ™˜ ๋ณ€์ˆ˜๋ช… ๋ช…์‹œ

go์˜ ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด์„œ ์žฌ๋ฐŒ๋‹ค๊ณ  ๋Š๋‚€๊ฑด ๋ฆฌํ„ด๊ฐ’์„ ์—ฌ๋Ÿฌ๊ฐœ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์— ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ ๋‹ค๋ฃจ๋Š” ๋ถ€๋ถ„๋„ ํŠน์ดํ•˜๋‹ค.

package main

import "fmt"

func add(x int, y int) int {
    return x + y
}

func plusMinus(x int, y int) (int, int) {
    return x + y, x - y
}

func namedPlusMinus(x int, y int) (p int, m int) {
    p = x + y // ํ•จ์ˆ˜ ์„ ์–ธ ๋•Œ ๋ช…์‹œํ•ด๋‘” ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๊ณ  ์™€์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค
    m = x - y
    return  // ๋ช…์‹œ์  ๋ฐ˜ํ™˜๊ฐ’ ์—†์ด ๋ฐ˜ํ™˜
}

func main() {
    result := add(1, 1)
    plus, minus := plusMinus(1, 1) 
    fmt.Println(result) // 2
    fmt.Println(plus) // 2
    fmt.Println(minus) // 0
}

# ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ˜๋ณต๋ฌธ if, switch, for

golang์—์„œ ์กฐ๊ฑด์„ ๋ถ™์ผ ๋•Œ๋Š” ๊ด„ํ˜ธ๋กœ ๋ฌถ์ง€ ์•Š๋Š”๋‹ค. ๊ด„ํ˜ธ๊ฐ€ ์žˆ์œผ๋‚˜ ์—†์œผ๋‚˜ ์ƒ๊ด€์—†์–ด์•ผ๋  ๊ฒƒ ๊ฐ™์€๋ฐ ๊ด„ํ˜ธ๊ฐ€ ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋‚ด๋ฟœ๋Š”๋‹ค. vscode์—์„œ goํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹ฌ์•˜๋”๋‹ˆ ์•Œ์•„์„œ ๊ด„ํ˜ธ๋ฅผ ๋นผ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

package main

import "fmt"

func main() {
    x := 10
    if (x > 5) {
        fmt.Println("x๋Š” 5๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค.")
    }
    if x > 5 { // ์ด๊ฒŒ ๋งž์Œ
        fmt.Println("x๋Š” 5๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค.")
    }
}

else if๋‚˜ else๋„ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค.

if๋ฌธ์—์„œ ๋ณ€์ˆ˜์„ ์–ธ๋„ ๊ฐ€๋Šฅํ•œ๋ฐ, ์—ฌ๊ธฐ์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” if๋ฌธ ์Šค์ฝ”ํ”„ ๋ฐ–์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

if x := 10; x > 5 {
    fmt.Println("x๋Š” 5๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค.")
}
fmt.Println(x) // x์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

๊ฐ„๊ฒฐํ•จ์„ ์ง€ํ–ฅํ•˜๋Š” ์–ธ์–ด๋‹ต๊ฒŒ ๋ญ๊ฐ€ ๋งŽ์ด ์—†๋‹ค.

switch~case

x := 2
switch x {
case 1:
    fmt.Println("One")
case 2:
    fmt.Println("Two")
case 3:
    fmt.Println("Three")
default:
    fmt.Println("Other")
}

if~else if ~ else ๋ž‘ ๋™์ผํ•œ ๊ฐœ๋…์ด๋‹ค. ๊ธฐ์กด switch case๋ž‘ ๋‹ค๋ฅธ ์ ์ด๋ผ๋ฉด break๊ฐ€ ์—†์–ด๋„ ๋ฐ‘์œผ๋กœ ์ญ‰ ๋‚ด๋ ค๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ์กฐ๊ฑด์„ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ ์ฝ”ํ‹€๋ฆฐ์˜ when๊ณผ ๋” ์œ ์‚ฌํ•˜๋‹ค๊ณ  ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

age := 25
switch {
case age < 18:
    fmt.Println("Child")
case age >= 18 && age < 30:
    fmt.Println("Young Adult")
case age >= 30 && age < 60:
    fmt.Println("Adult")
default:
    fmt.Println("Senior")
}

์ญ‰ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€๊ฒŒ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด fallthrough ํ‚ค์›Œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค.

x := 1
switch x {
case 1:
    fmt.Println("One")
    fallthrough
case 2:
    fmt.Println("Two")
default:
    fmt.Println("Other")
}

์ด ์ฝ”๋“œ๋Š” One, Two๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๋ฐ˜๋ณต๋ฌธ์—์„œ๋„ while์ด ์—†๊ณ  for๋กœ ๋‹ค์–‘ํ•œ ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜  ์žˆ๋‹ค.

for i := 1; i <= 5; i++ {  // ์ดˆ๊ธฐ๊ฐ’; ์กฐ๊ฑด; ์ฆ๊ฐ
    fmt.Println(i)  // 1๋ถ€ํ„ฐ 5๊นŒ์ง€ ์ถœ๋ ฅ
}

์ด๊ฒŒ ๊ธฐ๋ณธ for๋ฌธ์ด๋‹ค. while์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์กฐ๊ฑด๋งŒ ์žˆ๋Š” for๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค. 

i := 0
for i < 5 {
    fmt.Println(i)
    i++
}

๋ฌดํ•œ๋ฃจํ”„๋ฅผ ์›ํ•œ๋‹ค๋ฉด??? ์กฐ๊ฑด ๋งˆ์ €์—†์• ๊ณ , break ์กฐ๊ฑด์„ ๋„ฃ์–ด๋‘๋ฉด ๋œ๋‹ค.

i := 0
for {
    fmt.Println(i)
    i++
    if i >= 5 {
        break
    }
}

# ๋ฐฐ์—ด

var arr [3]int  // ์ •์ˆ˜ํ˜• ๋ฐฐ์—ด ์„ ์–ธ, ๊ธธ์ด 3
// arr := [3]int{1, 2, 3} // ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” ํ•ด์•ผ๋˜๋‹ˆ๊นŒ {} ์ด๊ฑธ๋กœ ๋ฌถ์–ด์„œ ํ•ด์ค€๋‹ค
// arr := [...]int{1, 2, 3} // ๋ฐฐ์—ด๊ธธ์ด๊ณ„์‚ฐ์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ€๋Šฅํ•˜๋‹ค
arr[0] = 1
arr[1] = 2
arr[2] = 3

fmt.Println(arr)  // [1 2 3] ์ถœ๋ ฅ

๋ฐฐ์—ด ๋ถ€ํ„ฐ๋Š” ํ˜ผ์„ ์ด ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ž๋ฐ”์˜ ๊ฒฝ์šฐ int[] arr ์ด๋Ÿฐ ์‹์œผ๋กœ ์“ฐ๊ณ , c๋ฉด int arr[] ์ด๋ ‡๊ฒŒ ์ผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹คํ–‰ํžˆ ์„ ์–ธ๋งŒ ๋‹ค๋ฅด๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋น„์Šทํ•ด์„œ ์ ์‘๋˜๊ณ  ์žˆ๋‹ค.

for๋ฌธ๊ณผ ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ์ˆœํšŒ๋„๋Š”๊ฒƒ๋„ ๊ฐ€๋Šฅํ•œ๋ฐ range๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

for index, value := range arr {
    fmt.Printf("index: %d, value: %d\n", index, value)
}

# ๊ตฌ์กฐ์ฒด

์ด ๋ถ€๋ถ„์€ ์ž๋ฐ”๋กœ class ๋งŒ๋“ค๋‹ค ์™€์„œ ๊ทธ๋Ÿฐ์ง€ ๊ทธ๋‚˜๋งˆ ์‰ฝ๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค.

type Node struct {
    v 	int
    w   int
}

p := Node{v: 1, w: 30}

์„ ์–ธํ•˜๋Š” ๊ฒŒ ์ข€ ๋‹ค๋ฅด๊ธดํ•œ๋ฐ ๋ณด๊ณ  ์ดํ•ด ๋ชปํ•  ์ •๋„๋Š” ์•„๋‹ˆ๋‹ค. ๊ทผ๋ฐ golang์€ ๊ธฐ๋ณธ์ ์œผ๋กœ call by value์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ž๋ฐ”์ฒ˜๋Ÿผ ์›๋ณธ์— ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ...๋ฅผ ์จ์•ผ๋œ๋‹ค.

p := &Node{v: 3, w: 25}

๊ทธ๋ƒฅ ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ๋„ new๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

p2 := new(Node) // ๊ฐ’์ด ๋น„์–ด์žˆ๋Š” ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ
p2.v = 7
p2.w = 77

๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ผ๋ฐ˜ ํฌ์ธํ„ฐ ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฒ˜๋Ÿผ *๋ฅผ ์•ˆ๋ถ™์—ฌ๋„ ๋œ๋‹ค.

func (p *Node) zero() { // ๋ฐ˜ํ™˜ํƒ€์ž… ์—†๋‹ค
    p.v = 0
}

*๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์œผ๋ฉด ํฌ์ธํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฑฐ๋ผ์„œ ์ด ํ•จ์ˆ˜์˜ ์‹คํ–‰์€ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋ฐ”๊นฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋ž‘ ์กฐ๊ธˆ ๋‹ค๋ฅธ๋ฐ, Node ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

# ์ธํ„ฐํŽ˜์ด์Šค

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌ์กฐ์ฒด์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๊ฒŒ ์ƒ๊ฒผ๋‹ค.

type Describer interface {
    Describe() string
}

type Person struct {
    Name string
    Age  int
}

interface๋ผ๊ณ  ์ง€์ •ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์œ„ ์ฝ”๋“œ ์ƒ์œผ๋กœ๋Š” Describe ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ๋˜๋Š” Describer ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.

// Person ๊ตฌ์กฐ์ฒด๊ฐ€ Describer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„
func (p Person) Describe() string {
    return fmt.Sprintf("Name: %s, Age: %d", p.Name, p.Age)
}

func main() {
    var d Describer
    p := Person{Name: "Alice", Age: 30}
    d = p
    fmt.Println(d.Describe())  // "Name: Alice, Age: 30"
}

Person ๊ตฌ์กฐ์ฒด๊ฐ€ Describe ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— d = p๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์ค‘ ์ƒ์†๊ณผ ๊ฐ™์€ ๊ฐœ๋…๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

type Describer interface {
    Describe() string
}

type Worker interface {
    Work()
}

type Person struct {
    Name string
    Age  int
}

func (p Person) Describe() string {
    return fmt.Sprintf("Name: %s, Age: %d", p.Name, p.Age)
}

func (p Person) Work() {
    fmt.Printf("%s is working.\n", p.Name)
}

func main() {
    var d Describer
    var w Worker
    p := Person{Name: "Alice", Age: 30}
    d = p
    w = p
    fmt.Println(d.Describe())  // "Name: Alice, Age: 30"
    w.Work()                   // "Alice is working."
}

 

๋นˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•ด์„œ ์ œ๋„ค๋ฆญ์ฒ˜๋Ÿผ ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค.

func foo(i interface{}) {
    fmt.Printf("Type: %T, Value: %v\n", i, i)
}

 

 

 

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT