Golang - 함수, 상수,if, Switch, for

Lumi·2022년 2월 6일
0

Golang

목록 보기
5/38
post-thumbnail

🔥 함수

함수의 구조에 대해서 알아보았습니다.

func 이름(인자 int, 인자 int) 반환타입{
	return a + b
}
  • 별로 어려운 구조는 아닙니다.

호이스팅과 비슷한 형식을 지원하기 떄문에

먼저 정의된 함수만 사용이 가능한 구조는 아닙니다.

a 함수

func main(){
	a()
}

- 이것도 가능하지만

func main(){
	a()
}

a 함수

- 이것도 가능합니다.

  • 만약 들어오는 인자의 타입이 같을떄에는 타입을 하나만 적어도 됩니다.
  • 또한 Solidity와 반환값을 여러개 선정해 줄수 있습니다.

함수를 다루는 부분은 익숙하니 재귀도 같은 맥락으로 구현 가능합니다

🔥 상수

상수 부분은 정말 단순하지만 구조체와 비슷한게 단체로 적용 가능한 부분이 있어서 이 부분만 다루어 보았습니다.

// ()를 통해서 상수를 한번에 선언 가능
const(
 	Red int = iota    // 0
    Blue int = iota   // 1
    Green int = iota  // 2
)
- iota는 1씩 증가하는 용어이며 이처럼 사용가능하다

const(
 	Red int = iota + 1    //  0 + 1 =1 
    Blue				// 1 + 1 = 2 
    Green 				// 2 + 1 = 3
)
- 이런식으로도 활용이 가능하다.

const(
 	Red int = 1 << iota    //  1 = 1 <<o
    Blue				// 2 = 1 << 1
    Green 				// 4 = 1 << 2
    black				// 8 = 1 << 3
)
- 좀더 심화하여 사용하면 이런식으로 활용이 가능합니다.
- 이를 bitFlag라고 합니다.

BitFlag를 활용한 예시 코드

  • Youtube참고한 코드
package main
import "fmt"

type Room uint8

const (
	Master = Room = 1 << iota   // iota = 0 이므로 1을 의미
    Bath  						// 2
    Kitchen						// 4
    Living						// 8
)

func SetLight(rooms, room Room) Room{
	return rooms | room
}
func ResetLight(rooms, room Roomo) Room{
	return rooms &^ room
}
func Isturnon(rooms, room Room) bool {
	return rooms & room == room
}

func TurnonLight(rooms Room){
	if Isturnon(rooms, Master){
    	fmt.Println("turn on Master)
    }
    // 이 과정을 상수값들마다 적어줌
}

func main(){
	var rooms Room    // 초기화를 안하면 초기값은 0
    rooms = SetLight(rooms, Master)
    rooms = SetLight(rooms, Living)
    TurnonLight(rooms)
}

불을 키고 끄는 과정을 코드로 표현을 한것입니다.

어떤식으로 작동을 하는지를 살펴보면

Master      	=> 0001
Bath 			=> 0010
Kithcn			=> 0100
Living 			=> 1000

rooms 			=> 0000

초기에 값들은 이런식으로 구성이 되어 있습니다.

만약 SetLight함수를 통하게 되면
- Master과 rooms를 인자로 넣어주면

0001
0000

==> 0001 이 완성이 됩니다.

이값을 다시 rooms로 갱신을 하고 다음 과정을 같은 작업으로 진행을 하게 됩니다.

코드에는 적지 않았지만 만약 ResetLight를 실행시키면
- Living까지 진행이 되었고 이후 Living을 끈다는 가정

1001    == rooms
1000    == Living

우선 ^를 실행을 하게 됩니다.

1001   == rooms
0111  == ^Living

이후 &를 통해서 같은 값들끼리만 연결이 되면

결과 : 0001 이 되게 됩니다.

- 이러한 과정을 통해 불을 켜고 끄는 것을 bit값을 통해서 수정이 가능합니다.
  • 자주 쓰는 형태는 아니지만 사용을 해야 할떄가 있는 방법입니다.

보통 a = b라는 구문을 생각해보면 a에 b의 값을 대입한다는 의미가 됩니다.

이떄 b의 값이 a의 메모리 주소에 할당이 되는 방식으로 작동을 하게 되고 결과적으로는

왼쪽은 메모리 주소, 오른쪽은 을 나타내게 됩니다.

하지만 기본적으로 상수를 a의 위치에 두고 b를 값에 위치에 둘수는 없습니다.

  • 초기화 부분 말고 이미 변수가 선언되어 있는 상태에서 다시 초기화 하는 것을 말합니다.

왜냐하면 상수는 변수와 다르게 따로 메모리 주소를 할당하지 않기 떄문입니다.

  • 즉 메모리 공간에 주소공간이 따로 있는 것이 아니라 그냥 박혀있다?? 는 의미로 이해를 하면 될것 같습니다.

🔥 IF문

사실 if문은 다른 언어와 유사함과 동시에 같습니다.

하지만 다른 부분을 발견하였고 해당 부분에 대하여 학습을 하였습니다.

if filename, success := 함수; success(조건문){
	~~~
}

함수의 결과에 따라서 if문을 통과시키는 코드 입니다.

  • 반환되는 값이 filename, success 두가지가 있기 떄문에 함수 또한 두가지를 반환한다는 것을 알수 있습니다.

또한 Golang에서는 ;를 사용하지는 않지만 특이케이스로 이렇게 구분해야 하는 경우가 생긴다면 사용하게 됩니다.

예를들어보면

func 함수 () bool {
	return 3, true
}

func main() {
  if a, b := 함수; b {
      fmt.Println("success!!")
  }
}

함수는 반드시 true값을 출력하기 떄문에 a=3, b=true값을 가진다는 것을 알 수가 있고

이런 조건에서는 if문은 통과가 이루어 진다는 것을 확인할수 있습니다.

🔥 Switch문

기본적인 구조는 이전에 알던 Switch문과 동일합니다.

  • if문을 반복해서 사용하기 싫을때 사용
  • 값을 통해서 비교를 할때 사용
package main

import "fmt"

type ColorType int

const (
	Red ColorType = iota
	Blue
	Green
	Yellow
)

func colorToString(color ColorType) string {
	switch color {
	case Red:
		return "RED"
	case Blue:
		return "Blue"
       // fallthrough
	case Green:
		return "Green"
	case Yellow:
		return "Yellow"
	default:
		return "No Color!!"
	}
}

func getMyFavoriteColor() ColorType {
	return Red
}

func main() {
	fmt.Println("Myfavorite color is", colorToString(getMyFavoriteColor()))
	// 아무것도 주지 않으면 0과 같기 떄문에 iota에 의해서 0이 됩니다.
	// 인자로 줄수 있는 부분은 Type의 형태에 의해서 int값만 들어 갈수 있습니다.
}
  • 간단한 Switch를 통한 테스트 코드 입니다!
  • Golang에서는 원하는 값을 찾게 되면 바로 break가 작동이 되기 떄문에 굳이 적어주지 않아도 됩니다.

만약 검색이 완료가 되어도 break문을 작동시키고 싶지 않다면

  • fallthrough를 추가해 주면 됩니다.

🔥 for

기본적인 형태는 이와 같습니다.

for 초기문; 조건문; 후처리 {
	~~~
}
- ()적어주지 않아도 됩니다.
  • break, continue부분도 같은 방식으로 작동합니다.
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	stdin := bufio.NewReader(os.Stdin)
	for {
		fmt.Println("숫자를 입력하세요!")
		var number int
		//
		_, err := fmt.Scanln(&number)
		// _의 역할을 사용하지 않고 싶은 변수일 경우 사용합니다.
		if err != nil {
			fmt.Println(err)
			// 버퍼를 지워줍니다
			stdin.ReadString('\n')
			// return값으로는 string, err가 나오게 됩니다.
			continue
		}
		fmt.Printf("입력한 숫자는 %d입니다.\n", number)

		if number%2 == 0 {
			fmt.Println("2로 나눠지는 값이기 때문에 for문을 종료합니다")
			break
		}
	}
	fmt.Println("for문이 종료되었습니다")
}
  • 이또한 간단하게 작성한for문 활용 예시입니다.

다음에는 break문 입니다.

제가 학습햇던 부분과 다르지는 않지만 그래도 정리를 해볼겸 적어보았습니다.

func main() {
	a := 1
	b := 1
	flag := false

	for ; a <= 9; a++ {
		for b = 1; b <= 9; b++ {
			if a*b == 45 {
				flag = true
				break
			}
		}
		if flag {
			break
		}
	}
	fmt.Println(a * b)
}
  • 단순히 2중 for문을 벗어나는 코드입니다.

이런식으로 flag라는 변수를 통해서 벗어날수도 있지만 label을 통해서도 벗어날수 있습니다.

  • 3중 for문이 되면 중복되는 부분이 많아지니깐 이러한 부분에서 적용을 하는 경우에 사용 합니다.
func main() {
	a := 1
	b := 1

OuterFor:
	for ; a <= 9; a++ {
		for b = 1; b <= 9; b++ {
			if a*b == 45 {
				break OuterFor
			}
		}
	}
	fmt.Println(a * b)
}

이렇게 for문에 이름을 짓어준다는 느낌으로 활용하면 됩니다.

  • 사실 label은 되도록 사용하지 않는 편이 좋습니다.
profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글