본문 바로가기

Go/[Go]User Function

Golang User Function

Go 언어와 다른 언어(C/C++, Java)와 다른 User Function의 차이점은 무엇일까요?

가장 큰 차이점은 다음과 같습니다.

  • 다중 반환 값
    (물론, C++17에서 다중 반환 값을 가질 수 있게 되었습니다. ex. <tuple> )
  • 에러의 유무 확인

User Function에서 알아갈 내용은 크게 두 가지로 나뉩니다.

  1. 다른 언어와 다른 Go 언어의 User Function
  2. 포인터

그러나, 포인터와 같은 경우엔 C언어와 동일하게 동작하므로 해당 카테고리에서 포인터에 대한 설명은 생략하겠습니다.

 

따라서 Go 언어만의 특징인 User Function에 대해서 알아보겠습니다.

 

Go언어의 strings의 함수 중 Atoi()라는 것에 대하여 설명드렸었습니다.

https://devhsops.tistory.com/8?category=519324 

 

Up Down Counting Game 키보드 입력하기(정수값 입력하기)

Up Down Counting 게임을 시작하기 앞서 사용자가 키보드에 어떻게 입력할지에 대해 설명하겠습니다. 위 그림은 사용자가 input을 어떻게 하게될지에 대해 보여주는 결과물입니다. 위 그림과 같이 입

devhsops.tistory.com

 

.Atoi()은 string 값을 정수형으로 변환해주는 기능을 수행합니다.

그러나, .Atoi()의 반환 값은 총 2가지로 변수를 2가지 선언해주지 않는다면 컴파일 에러가 발생하게 됩니다.

따라서 정상적으로 변환된 값을 저장해줄 int 형 변수 1개, 에러의 유무를 알 수 있는 error 형 변수 1개를 세팅하여 해당 함수를 사용했어야 했습니다.

 

Go 언어의 User Function은 이미 정의된 함수(.Atoi())와 마찬가지로 다중 값을 반환하여 에러의 유무를 살펴볼 수 있습니다.

 

한 가지 예시를 들어 설명하겠습니다.

func paintNeeded(width float64, height float64) float64{
	return width * height / 10.0
}

func main() {
	var width, height float64
	width = 4.2
	height = 3.0
    	area := paintNeeded(width, height)
    	fmt.Printf("%.2f liters needed\n", area)
}

해당 코드는 넓이와 높이의 곱 / 10.0 을 계산한 코드입니다.

width와 height의 값에 따라 출력 값은 다양해질 것입니다.

그러나, width 또는 height 값이 음수라면 어떻게 될까요? 넓이와 높이가 음수를 가지는 경우가 존재할까요?

 

넓이와 높이는 음수를 가지는 경우는 "절대" 없을 것입니다. 즉, user function을 작성하는데 있어 허점이 발견될 수 있다는 것입니다.

 

그렇다면 Go 언어에서는 과연 어떻게 이러한 오류를 해결할 수 있을까요?

 

.Atoi() 함수와 같이 다중 반환 값을 통해 에러 유무를 알려주면 해결할 수 있습니다. 그 방법은 다음과 같습니다.

func paintNeeded(width float64, height float64) (float64, error) {
	if width < 0 {
		return 0, fmt.Errorf("a width of %.2f is invalid", width)
	}
	if height < 0 {
		return 0, fmt.Errorf("a height of %.2f is invalid", height)
	}

	area := width * height
	fmt.Printf("%.2f liters needed\n", area/10.0)
	return area / 10.0, nil
}


func main() {
	var width, height float64
	width = 4.2
	height = 3.0
	total, err := paintNeeded(width, height)
	if err != nil {
		log.Fatal(err)
	}
}

해당 코드를 보면 알 수 있듯이, 필자가 작성한 코드는 다중 반환 값을 가지는 것을 확인할 수 있습니다.

 

이때 다른 언어와 다른 Go 언어만의 특징을 살펴보겠습니다.

  • 자료형(Type)은 항상 뒤쪽에 붙습니다.
    다른 언어와 착각하여 자료형을 앞쪽에 붙이는 실수를 하지않아야합니다. 변수의 자료형을 나타내고 싶을 땐 항상 뒤쪽에 붙어야한다는 것을 인지하는 것이 좋습니다.

  • Go 언어는 다중 반환값을 가질 수 있습니다.
    즉, 기존 C언어에서 불편했던 점을 개선할 수 있습니다.
    예를 들어, 보통 C언어에서는 에러가 발생할 때 음수 반환 값으로 에러가 발생했음을 알립니다. 그러나 Go 언어는 이것과는 다르게 음수 반환 값으로 에러를 확인할 필요없이, 모든 정보를 포함하여 반환할 수 있는 장점이 있습니다.