오늘은 Go의 배열, if문, Switch문을 알아봅시다!
배열
package main
import "fmt"
func main() {
names := []string{"nico", "lyn", "dal"}
names = append(names, "flynn")
fmt.Println(names[2])
}
배열 선언 방식은 다음과 같습니다 names := []string{~}을 통해 문자열 배열을 만들어 줬습니다
그리고 ppend를 통해 "flynn"을 배열에 추가해주었구요 그런데 여기서 append("flynn)만 적는다면 오류가 됩니다
names = append(어디에 append(추가)할 것인가, "무엇을 추가할 것인가?") (참고 append는 맨 뒤에 값을 넣어준다)
또 여기서 중요한 점은 append(names, "flynn")는 새로운 값이 추가된 slice를 return 하기 때문에
바로 names의 값이 바뀌거나 하지 않습니다 names = append(names, "flynn")라고 코드를 짜주셔야 합니다
그렇다면 또 한 번 고민해보자면 append는 void type은 아니겠죠? 궁금해서 찾아보니까 append는 일단 void type은 아니였습니다
그런데 신기한 점이 있었습니다
append는
새로운 요소를 추가할 충분한 공간이 있는 경우, 새로운 슬라이스는 기존 슬라이스의 메모리 주소를 사용하게 됩다네요 하지만, 기존 슬라이스에 충분한 공간이 없는 경우, append는 새로운 메모리 주소에 기존 슬라이스를 복사한 후, 새로운 요소를 추가하게 됩니다.
음 그렇다면 굳이 메모리를 더 써야하나 싶었습니다 기존 names 메모리상에서 배열로 따지면 한 칸만 더 가서 그 메모리만 쓰면 될텐데 굳이 새로운 공간을 확보할 필요가?
ㄴnames := [4]string을 생각해보았지만 선언이 불가합니다 var를 이용해봤지만 그것또한 안에 0으로 값이 차있습니다
배열 크키만 확보할 순 없다는 걸로 결론내렸습니다 그리고 append는 넣어도 맨 뒤에 넣기때문에 메모리상으로는 당연히 [4]만큼에 공간을 확보해놨겠죠 생각해보니까 말이 안되는 생각이었던거? 같습니다
그러다가 처음 Go의 이론을 봤을 때를 생각해보니까 Go는 가비지컬렉터가 있었습니다
아! 그러면 가비지컬렉터로 불필요한 메모리는 날리겠지! 신기하네요 ㅎㅎ
결과값은 당연히 "lyn"이 찍히겠죠?
if
package main
import "fmt"
func canIDrink(age int) bool {
if koreanAge := age + 2; koreanAge < 18 {
return false
}
return true
}
func main() {
fmt.Println(canIDrink(16))
}
Go에 if문 안에는 특이하게 변수 선언과 동시에 그 변수로 값을 바로 비교할 수 있습니다
위에 코드 처럼 말이죠 복습을 해보자면
func canIDrink(age int) bool
canIDrink라는 func를 만들고 age라는 인자값은 type을 int로 선언해주고 bool type으로 결과값을 반환합니다
if koreanAge := age + 2; koreanAge < 18 { // age < 18 도 가능 {
return false
}
return true
koreanAge := age + 2는 koreanAge라는 변수를 새로 만들어 age+2값을 넣어줍니다 당연히 type은 Go에서 알아서 해줍니다
Switch
package main
import "fmt"
func canIDrink(age int) bool { //if , else if 남발 생략
switch koreanAge := age + 2; koreanAge {
case 10:
return false
case 18:
return true
case 50:
return false
}
return false
}
func main() {
fmt.Println(canIDrink(16))
}
자 다음으로는 Switch문으로 코드를 깔끔하게 만들어봅시다
인자값 type과 반환 type은 같습니다 그저 switch라는 키워드를 쓴 것뿐이죠
똑같이 koreaAge라는 변수를 만들수 있습니다 그리고 switch키워드를 통해 코드를 깔금하게 바꿨습니다.
Pointer
포인터는 C를 조금 해보셨다면 이해하기 편하실 텐데 Go에서도 똑같습니다
package main
import "fmt"
func main() {
a := 2 //a라는 변수에 2를 넣어준다
b := &a //b라는 변수는 a의 주소값을 복사한다
*b = 20 //b의 값을 20으로 바꾼다 -> 여기서 b는 a의 주소를 똑같이 쓰고 있기 때문에
//a의 값도 당연히 20으로 바뀐다
fmt.Println(a)
}
포인터 부분을 잘 모르시겠다면 C로 한 번 공부해보시길 바랍니다
질문 & 틀린점은 댓글 부탁드립니다
'Go' 카테고리의 다른 글
[Go] Go루틴이란 무엇인가? (0) | 2023.02.16 |
---|---|
[Go] struct를 생성하고 error코드 작성하기 (0) | 2023.01.09 |
[Go] $GOPATH/go.mod exists but should not 오류 (0) | 2023.01.09 |
[Go] Go의 특별한 인자값 전달 (0) | 2023.01.08 |
[Go] Main Package와 접근 제한자 & 변수 (2) | 2023.01.08 |