Golang 스터디(with 큐시즘 개발팀) - 1주차

PM/iOS Developer KimKU·2022년 9월 12일
0

Go Study

목록 보기
1/4

d

1. Go의 역사

Go 언어는 2009년 발표된 오픈 소스 프로그래밍 언어이다. 무료로 사용할 수 있고, 누구나 내부 구조를 살펴볼 수 있다.

오픈 소스 허브인 깃허브에 올라간 소스 코드 중 가장 많이 사용되는 언어 5위에 랭크될 만큼 많이 사용된다.

ㄴ

2. Go 언어의 특징

1. 클래스가 없다 - 클래스는 없지만 매서드를 가지는 구조체를 지원
2. 상속이 없다 - 상속을 지원하지 않는다.
3. 제네릭 프로그래밍을 지원하지 않는다.

3. Hello Go World 코드 뜯어보기

package main                       //1

import "fmt"                       //2

func main() {                      //3
	fmt.Println("Hello Go World")    //4
}

1. package main
Go 언어의 모든 코드는 반드시 패키지 선언으로 시작해야 한다. 또한 main 패키지는 프로그램 시작점을 포함하는 특별한 패키지이다.

  • Go 언어는 패키지 선언으로 시작되어야 한다'는 점과 'package main은 프로그램 시작점이 있는 패키지'이다.

2. import 'fmt'
fmt 패키지를 가져온다. fmt 패키지는 표준 입출력을 다루는 내장 패키지이다. 표준 입출력으로 텍스트를 출력하거나 입력받을 때 사용한다.

3. func main()
main() 함수는 프로그램 진입점 함수이다. 그래서 프로그램은 항상 main() 함수에서 시작한다. 즉 Go 언어로 만든 모든 프로그램은 main() 함수부터 시작되고 main() 함수가 종료되면 프로그램이 종료된다. 즉, 프로그램의 시작과 끝이 main() 함수이다.

4. fmt.Println("Hello Go world")
fmt.Println()는 표준 출력으로 문자열을 출력하는 함수이다. fmt.Println("Hello go World")는 Hello Go world를 출력한다.

4. 변수

4.1 Golang의 변수 선언과 출력 코드

package main

import "fmt"

func main() {
	var a int = 10
	var msg string = "Hello Variable"
	
	a = 20
	msg = "Good Morning"
	fmt.Println(msg, a)
}

위의 코드는 Golang 언어에서 볼 수 있는 변수 선언과 출력 코드이다. 코딩을 하면 다른 언어와는 다르다는 것을 바로 알 수 있을 것이다.

기본적인 Golang 에서의 변수 선언은 아래와 같다.

var a int = 10

var는 변수의 영문인 variable 의 약자로 변수 선언을 알리는 키워드이다. 이어서 변수의 이름을 적는다. 그 다음 타입을 적고 대입 연산자 = 오른쪽에 초깃값을 적어서 변수 선언을 마친다.

변수 선언을 알리는 키워드를 먼저 적는것도 그렇고, 변수의 이름 뒤에 변수 타입을 적는다는 것이 굉장히 생소하다.

다른 코드를 한번 보겠다.

package main

import "fmt"

func main() {
	var minimumWage int = 10
	var workingHour int = 20

	var income int = minimumWage * workingHour

	fmt.Println(minimumWage, workingHour, imcome)
}

그리고 ; 가 없는것 또한 굉장히 눈에 띄는 특징이다.

4.2 변수 선언의 다른 형태

Go 언어에서는 프로그래머의 편의를 위해 여러 형태의 변수 선언을 지원한다.

package main

import "fmt"

func main() {
	var a int = 3// 기본 형태  
	var b int    // 초깃값 생략. 초깃값은 타입별 기본값으로 대체 
	var c = 4    // 타입 생략. 변수 타입은 우변 값의 타입이 됨
	d := 5       // 선언 대입문 := 을 사용해서 var 키워드와 타입 생략

//출력값: 3 0 4 5

Go 언어는 타입별 기본값이 정해진것 같다. 변수를 선언할 때 초깃값을 생략하면 아래 표와 같은 기본값이 자동으로 대입된다고 한다.

타입기본값
모든 정수 타입0
모든 실수 타입0.0
불리언false
문자열""(빈 문자열)
그외nil

Go 함수에서는 타입을 생략할 수 있다. 타입을 생략하게 되면 우변의 타입으로 좌변(변수)의 타입이 지정된다. 만약 우변이 숫자이면 기본 타입으로 결정된다. 정수는 Int, 실수는 float64 가 기본 타입이다.

그리고 제일 눈에 띄는게 있다면 선언 대입문 := 이다. 선언 대입문이란 말 그대로 선언과 대립을 한꺼번에 하는 구문이다. 선언 대입문을 사용하면 var 키워드와 타입을 생략해 변수를 선언할 수 있다.

var b = 3.1415     //b는 float64 타입으로 자동 지정
c := 365           //c는 int 타입으로 자동 지정
s := "hello world" // s는 string 타입으로 자동 지정

4.3 타입 변환

프로그래밍 언어를 구분할 때 타입 검사를 하는가 안 하는가에 따라 강 타입 언어와 약 타입 언어로 나눈다. Go 언어는 강 타입 언어 중에서도 가장 강하게 타입 검사를 하는 최강 타입 언어이다.

Go 언어에서는 연산이나 대입에서 타입이 다르면 에러가 발생한다.

a := 3                //int
var b float64 = 3.5   //float64

var c int = b         //Error - float64 변수를 int에 대입 불가
d := a * b            //Error - 다른 타입인 int 변수와 float64 연산 불가

var e int64 = 7 
f := a * e            //Error - a는 int 타입, e는 int64 타입으로 같은 정수값이지만 
                      //타입이 달라서 연산 불가

var g int = b * 3     //Error - 실수가 정수로 자동으로 바뀌지 않는다

같은 숫자라도 타입이 다르면 연산이 안되기 때문에 타입을 변환해서 연산을 해줘야 한다. 이것을 타입 변환이라고 한다.

타입 변환을 이용해서 위의 코드를 에러 없이 다시 써보면 다음과 같다.

package main

import "fmt"

func main() {
	a := 3                  //int
	var b float64 = 3.5     //float64

	var c int = int(b)      //float64에서 int로 변환
	d := flaot64(a * c)     //int에서 float64로 변환

	var e int64 = 7
	f := int64(d) * e       //float64에서 int64로 변환

	var g int = int(b * 3)  //float64에서 int로 변환
	var h int = int(b) * 3  //float64에서 int로 변환. g와 값이 다르다.
	fmt.Println(g, h, f)
}

타입 변환 시 두 가지 유의점이 있다.

첫째, 실수 타입에서 정수 타입으로 타입이 변환하면 소수점 이하 숫자가 없어진다는 점이다. 그래서 위의 코드에서 c 값은 3.5에서 소수점 이하 숫자가 사라진 3이 된다. 소수점 이하의 숫자는 반올림되지 않고 버려진다.

둘째, 큰 범위를 갖는 타입에서 작은 범위를 갖는 타입으로 변환하면 값이 달라질 수 있다. 아래 코드를 보겠다.

package main

import "fmt"

func() main{
	var a int16 = 3456
	var c int8 = int8(a)
	
	fmt.Println(a)
	fmt.Println(c)
}
//출력값
//3456
//-128

타입 변환을 했더니 c값이 3456에서 -128로 변했다. 2바이트 정수 int16에서 1바이트 정수 int8로 변환할 때 상위 1바이트가 없어지기 때문이다.

4.4 변수의 범위

변수는 자신이 속한 중괄호 {} 범위를 벗어나면 사라진다. 범위 예제 코드를 보자.

package main

import "fmt"  

var g int = 10 //패키지 전역 변수 선언

func main() {
	var m int = 20 //지역 변수 선언

	{
		var s int = 50  //지역 변수 선언
		fmt.Println(m, s, g)
	} //s 지역 변수는 사라짐
	
	m = s + 20 //Error
}

예제에서 어떤 중괄호에도 속해 있지 않은 g 변수는 패키지 전역 변수로 같은 패키지 내에서는 어디서나 접근할 수 있다. m 변수는 main() 함수에 속해 있는 지역 변수로 선언 이후부터 main() 함수가 끝나는 부분까지 접근할 수 있다. s 변수는 속해 있는 중괄호 {}가 끝나는 지점에서 사라진다. 그래서 마지막 m = s + 20 명령어에서 오류가 난다.

profile
With passion and honesty

0개의 댓글