본문 바로가기

KOSA 클라우드 솔루션즈 아키텍트 양성과정

[5.20] Go 5일차(복습)

# 변수

 

변수 선언( 초기화 X)

* var : 변수 선언 키워드

* x : 변수 이름

* int : 변수 타입

 

 

변수 선언(초기화 O)

* y라는 이름의 int 타입 변수를 100으로 초기화

 

 

여러 개의 변수

* 변수 세 가지(x, y, z)를 순서대로 100, 200, 300으로 초기화

* 변수에 초기값을 주지 않으면 제로 값을 가짐

* 제로 값 :

  - 숫자형의 경우 0

  - bool타입의 경우 false

  - string의 경우 ''(비어 있는 문자열)


# 상수

 

상수 초기화

* const : 상수 선언 키워드

* x, y : 상수의 이름

* int, string : 상수의 타입

* 100, "Go" : 상수의 값

 

 

추론

* Go언어는 10이 할당되면 int 타입이고 "Go"가 할당되면 string이라는 것을 자동으로 추론함

 

 

상수 여러 개 초기화

* const( ) : ( ) 안에 여러 개의 상수를 한 번에 초기화할 수 있음


# 데이터 타입

 

* boolean

* string : immutable(불변) 타입

* int : int, int8, int16, int 32, int64, uint, uint8, uint16, uint32, uint64, uintptr

* float 및 복소수 : float32, float64, complex64, complex128

* 기타 : byte( = uint8, 바이트 코드에 사용됨), rune( = int32, 유니코드 코드 포인트(코드에 부여된 숫자)에 사용)


# 문자열

 

* ` `(백틱), " "(이중 인용)을 통해 표현

* ` `으로 만든 문자열은 입력한 그대로 출력됨(\n과 같은 개행 문자로 그대로 \n으로 출력되고 엔터를 치면 줄 바꿈)

* " "으로 만든 문자열은 이스케이프 문자 전부 인식


# 포인터 연산자

 

포인터 연산자

* & : 주소를 의미

* * : 주소에 있는 값을 의미

* x라는 이름의 변수를 100으로 초기화함

* p라는 변수를 x의 주소로 초기화

* *p는 p에 들어 있는 x의 주소가 가리키는 값을 의미(100) 


# 조건문

 

조건문 if

* { 은 반드시 if와 같은 라인에 위치해야 함

* if의 조건을 ( )로 감싸지 않아도 되지만, 조건식으로 1이나 0과 같은 boolean은 사용할 수 없음


# 반복문

 

for 반복문

* 1에서 100까지 더한 값을 sum에 넣고 출력

* Go의 for문은 for의 초기값, 조건식, 증감을 감싸는 괄호를 사용하면 애러 발생

 

for반복문(조건식X, 증감식X)

* Go는 while문이 없음

* for문의 조건식과 증감식을 사용하지 않으면 while문과 같은 역할

 

 

range 사용

* names 배열이 만들어짐

* names 배열의 범위에서 인덱스와 인덱스에 해당하는 값을 출력함


# 함수

 

파라미터

* 함수의 파라미터는 0개 이상 지정해줘야 함

* 파라미터를 지정할 때는 해당 파라미터의 타입도 함께 적어줘야 함

* 함수의 순서는 관계없음

 

 

주소, 역참조

* main함수의 msg 변수에 "Hello" 대입

* say 함수로 msg의 주소를 인자로 보냄

* say 함수에서 msg의 주소를 역참조로 받음

* msg의 주소를 역참조 했으니 msg의 값인 "Hello"가 출력됨

* msg의 주소를 역참조 했을 때 볼 수 있었던 "Hello"를 "Changed"로 변경

* 다시 main 함수의 마지막 줄인 fmt.Println(msg)를 수행하러 돌아옴

* msg의 바뀐 값인 Changed가 출력됨

 

 

가변파라미터 ...

*... 은 몇 개의 인자를 받을지 모를 때 파라미터의 타입 앞에 적어주는 것

*... 뒤에 오는 타입과 일치하는 인자를 몇 개라도 받을 수 있음

 

 

return 값이 여러개

* 여기서는 count와 sum 두 가지를 리턴 값으로 함

* return 값과 일치하는 타입을 for문의 파라미터 옆에 (int, int) 형식으로 적어줌

 

 

Named Return Parameter

* Named Return Parameter는 return 값들을 return 파라미터들(count와 total)에 할당하는 역할을 함

* 리턴 파라미터 명과 그 타입을 한 번에 적음

* 즉, 결괏값을 리턴하지 않고 직접 count와 total에 할당하는 것

* retrun 값이 없더라도 return을 생략하면 애러 나니까 써주기

 

 

익명 함수

* 함수명이 없는 함수를 익명 함수(Anonymous Function)이라고 함

* 익명 함수를 사용하는 방식은 크게 두 가지

  - 함수 전체를 변수에 할당 (여기서 사용한 방식)

  - 다른 함수의 파라미터에 직접 정의하는 방식

* sum이라는 이름의 변수에 함수가 할당됨

* 변수 명인 sum이 함수명과 동일하게 취급됨

* sum(파라미터들) 형식으로 함수를 호출할 수도 있음

 

 

일급함수

* add라는 이름의 변수에 익명 함수를 할당하는 방식

* 함수의 파라미터에 직접 익명 함수를 정의하는 방식

* 함수가 다른 함수의 파라미터로 전달되거나 다른 함수의 리턴 값으로 사용될 수 있음

 

 

type문

* type문을 통해 함수의 원형을 정의함

* func(x int, y int) int 원형이 계속 반복된다면 type 문을 정의함으로써 함수 원형을 간단히 표현 가능

* 함수 원형을 정의한 후 함수를 타 메서드에 전달하고 리턴 받는 기능을 Delegate라고 함


# 클로저(Closure)

 

클로저 함수

* nextValue() 함수는 int를 리턴하는 익명 함수를 리턴함

* return 반환 값인 익명 함수가 i를 1씩 증가시킴

* i라는 이름을 가진 변수가 익명함수 내부에 있지는 않은 상태

* i가 익명함수 내부에 있지 않기 때문에, 익명함수 바깥의 i := 0은 next()를 호출할 때마다 1씩 증가한 상태를 유지

* next()라는 함수가 i의 상태를 계속 가지고 있음

* anotherNext라는 다른 변수에 nextValue를 할당하면 다시 1부터 시작

* 클로저는 함수 바깥의 변수를 참조하는 함숫값


# 배열

 

배열

* int 타입의 x라는 이름을 가진 변수

* [2]int, [3]int, [4]int 등 배열의 크기도 int와 함께 타입을 구성하는 요소임

* 배열 크기에 따라 서로 다른 타입으로 인식

 

 

배열 초기화

* 배열의 초기값을 설정할 수 있음

* 배열의 크기에 따라 값의 개수가 달라짐

* 배열에 몇 개의 값을 넣을지 정확히 모르겠다면 배열크기를 ...으로 해줌

* 배열 크기가 ...이면 원하는 만큼의 요소만 넣어줄 수 있음

 

 

다차원 배열

* [2][3][4]의 의미

  - 크게 두 덩어리

  - 두 덩이 안에 세 덩어리

  - 세 덩어리 안에 네 개의 원소

=> [[[0 0 0 0] [0 0 10 0] [0 0 0 0]] [[0 0 0 0] [0 0 0 0] [0 0 0 0]]]

 

 

다차원 배열의 초기화

* 2행 3열 배열을 [[1 2 3][4 5 6]]으로 초기화


# 슬라이스

슬라이스 생성하는 방법 배열과 유사

* 슬라이스는 배열을 선언하듯이 함

* 배열과 차이점은 [ ] 안에 아무것도 넣어주지 않는다는 것

 

 

슬라이스 생성하는 방법 make()

* make( ) 함수를 이용해 슬라이스를 선언할 수 있음

* make( ) 함수

  - 첫 번째 파라미터에 생성할 슬라이스 타입 지정

  - 두 번째 파라미터에 길이(len) 지정 -> 길이는 지금 만들 배열의 길이

  - 세 번째 파라미터에 용량(cap) 지정 -> 용량이라는 것은 최대 길이

* 슬라이스의 값을 초기화해주지 않아서 제로 값이 들어감

 

 

nil slice

* 슬라이스의 길이(len)와 용량(cap)을 지정하지 않음

* 길이와 용량을 지정하지 않으면 길이와 용량이 각각 0인 슬라이스가 생성됨

* 길이와 용량이 0인 슬라이스를 nill slice라고 함

* nill slice와 nil을 비교하면 참을 리턴함

cf.) 슬라이스 선언 시 make( ) 함수를 쓰려면 길이와 용량을 지정해주어야 함

 

 

부분 슬라이스(sub-slice)

* 파이썬의 슬라이싱과 동일

* 마지막 인덱스를 포함하지 않기에  [300 400] 출력

 

 

append 함수

* append 함수의 기능과 이름은 파이썬과 같음

* 파이썬의 append와 사용법은 다름

* append(x , ~~~~~) 이런 식으로 append 함수의 첫 번째 파라미터에 슬라이스의 이름이 들어가고 뒤에 추가하고 싶은 값을 한 개 이상 넣어줌

 

 

길이와 용량 비교

* 길이가 용량을 초과하면 용량을 기존의 2배로 늘림

 

 

슬라이스에 슬라이스 추가

* append(슬라이스A, 슬라이스B...)로 슬라이스 추가

* 슬라이스B...에서 ...은 슬라이스B의 모든 요소들의 집합을 나타냄 (여기서는 100, 200, 300)

 

 

copy 함수

* int타입의 슬라이스 source 만들기

* int타입이고 길이 3 용량이 6인 타깃 슬라이스 만들기(타깃 슬라이스는 초기화시켜주지 않아서 제로 값이 들어가 있음)

* target슬라이스에 source 슬라이스를 복사해줌

* target 슬라이스를 출력하면 [0 1 2]

* 타깃 슬라이스의 길이와 용량은 각각 3과 6

* 엄밀히 말하면 슬라이스는 실제 배열을 가리키고 있는 포인터에 대한 정보만 있는 것이므로, 해당 정보를 타깃 슬라이스로 복제하는 것


# 맵(Map) - key에 대응하는 value를 신속히 찾는 해쉬 테이블을 구현한 자료구조

 

맵 변수 선언

* int타입의 키와 string타입의 값을 가지는 myMap이라는 변수를 선언함

* map은 reference타입이므로 nil 값을 가짐 -> Nil Map이라고 부름

* nil map에는 어떤 데이터도 입력 불가능

* map을 초기화하기 위해서는 아래 두 가지 방법 사용

  - make( )

  - 리터럴을 이용

 

 

make( ) 함수 사용한 초기화

* make( ) 함수를 사용하여 map을 초기화함

 

리터럴을 사용한 map의 초기화

* 리터럴을 이용한 초기화는 map[키타입]값타입 뒤에 {키 : 값} 형식으로 정의

 

 

키를 이용해 값 넣기

* myMap[키] = "값" 형식으로 key에 대응하는 value를 넣음

* noData변수에 넣어준 key 100은 존재하지 않음

* 존재하지 않는 키에는 nil을 리턴함

* 존재하지 않는 값에 대해 reference 타입은 nil을 리턴하고 value타입의 경우 제로를 리턴함

* delete(맵 변수 이름, 키 값)을 통해 키와 대응하는 값을 삭제

 

 

키 값이 있는지 확인

* map의 변수이름[키] 는 키에 대응하는 값을 리턴하고, 키가 존재하는지 bool값도 리턴함

* val 변수에는 아무것도 리턴되지 않고, exists변수에 false가 리턴됨

 

 

map 열거

* Map에 for range를 사용하면 key와 value 두 가지 데이터를 리턴 받을 수 있음

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'KOSA 클라우드 솔루션즈 아키텍트 양성과정' 카테고리의 다른 글

[5.24] 오픈스택  (0) 2022.05.24
[5.23] 오픈스택 총정리(설치, 설정 등)  (0) 2022.05.23
[5.19] Go 4일차  (0) 2022.05.19
[5.18] Go 3일차  (0) 2022.05.18
[5.17] Go 2일차  (0) 2022.05.17