본문 바로가기

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

[5.18] Go 3일차

# 개념 #

 

* 블록(block)

  - 선언문이 있는 각각의 공간

  - 관련 있는 문장을 묶은 것

  - 식별자의 스코프(scope)

    - 식별자의 Lifecycle(생명주기)

      - 블록 내에서 선언/정의될 때, 식별자가 생성됨(메모리에 해당 요소 만들어짐)

      - 블록이 끝날 때 식별자가 제거됨

      - 즉, 블록 내에서만 해당 식별자 사용 가능, 블록 밖에서는 접근할 수 없음

  - 패키지 블록

    - 함수 외부에 선언된 것들이 속함

    - := 은 사용 불가

    - 대문자로 시작하는 식별자는 패키지 외부에 노출(expose)됨

    - 노출된 식별자는 점 연산자를 통해 접근

    - .go 파일이 여러 개더라도 package 이름이 같으면 같은 패키지 블록에 포함

  - 파일블록

    - .go 파일에 선언된 것들

    - import문이 포함된 파일

  - 함수 블록

    - 로컬 변수 : 매개변수(파라미터), 반환 변수도 포함

    - 모든 중괄호는 새로운(다른) 블록을 정의

    - 제어 구조도 자체의 블록을 가짐

  - 유니버스 블록

    - 기본 타입, 내장 함수, true/false와 같이 미리 선언된 식별자가 정의된 블록

    - 다른 모든 블록을 포함하는 블록

    - 따라서 다른 블록에 의해 섀도잉될 가능성이 높음

 

* 식별자 접근

  - 외부 블록에서는 내부 블록의 요소(식별자)에 접근 불가

  - 내부 블록에서는 자신과 외부 블록의 요소에 접근 가능

  - 내부 블록

 

* 섀도잉(Shadowning)

  - 외부 블록과 내부 블록의 식별자가 같은 경우 내부 블록의 식별자로 처리

  - 외부식별자가 내부식별자의 그림자에 가려 보이지 않음

 

* := 연산자

  - 여러 변수를 := 연산자로 초기화할 때

    - 현재 블록에서 선언된 변수들만 재사용됨

 

* 임포트된 패키지가 섀도잉되지 않도록 주의

  - 임포트한 패키지 이름과 같은 식별자를 선언하지 말 것

 

* if문

  - 조건을 괄호로 감쌀 수는 있지만 감싸지 않는 것이 일반적임

  - if 블록이나 else 블록내에서만 사용가능한 변수를 if 또는 else에서 바로 선언하는 방법임

 

* for문

  -   for문의 4가지 패턴

    1) C 언어와 동일한 방식의 for

      - 변수 초기화는 반드시 := 사용

      - for에서 선언된 변수도 if처럼 섀도잉 문제 발생 가능

 

* 완전한 for 구문

  1) 선언부는 한 번만 실행

  2) 조건부가 참일 경우에만 for블록 실행, 거짓이면 for문 종류

  3) 증감부는 for 블록 실행이 끝나고 다시 2)로 가기 전에 실행

 

* for문을 이용한 무한루프

  - for문의 조건식을 생략한 형태

 

* break와 continue

  - 파이썬과 같은 개념

  - 코드를 간결하게 보기 좋게 만드는 데 기여

 

* for-range문

  - 내장 타입의 요소(문자열, 배열, 슬라이스, 맵)를 순회하며 루프 수행

  - range가 두 개의 값을 반환

    - (index, value) 쌍을 반환

  cf.) Go에서는 반환되는 값을 사용할 의도나 필요가 없다면 _(underscore)로 받음 (Python과 같은 개념)

 

* 키 값만 순회하는 대표적인 예

  - 맵 타입을 집합 타입으로 사용한 경우

  - 맵의 값보다는 유니크한 키 값이 중요 => 집합(셋)

 

* 맵을 for range로 순회

  - 요소를 처리하는 순서가 일정하지 않음 (보안 이슈)

 

* 문자열을 for-range 순회

  - 룬을 순회, 바이트 순회 아님 

 

* for-range의 값은 복사본

  -  for-range 값으로 원본을 수정할 수 없음

 

* 레이블링(labeling)

  - 레이블 : 프로그램 코드 위치에 이름 붙인 것

  - break, continue, goto 문의 대상이 됨 

  

* switch문

  - switch, case, default, [break]

  - 다른 언어의 switch

    - fallthrough 기능 존재

  - Go는 fallthrough가 기본적으로 금지됨, fallthrough 키워드로 활성화

  [SYNTAX]

  switch [selector] {

  case value | condition :

        문장1

        문장2

         . . .

   case

 

   case

  }

- switch의 fallthrough

  - break문을 만날 때까지 다른 case의 내용도 실행

 

* 공백 스위치

  - case에 불리언 결과(조건식, 불 값을 반환하는 함수)를 사용

  - selector 없음

 

* if문과 switch문 중 선택

 

* goto문

  - Go에서 지원은 하지만 없다고 생각하기 (프로그램 논리의 흐름을 복잡하게 만들 수 있음)

    - goto를 잘못쓰면 변수 선언 이후로 건너뛰어 변수가 선언되지 않은 상태가 되어 애러가 발생할 수 있음

 

* 함수 선언과 호출

  - 1급 객체

  - 메인 함수

    - 프로그램 진입점

    - 실행 파일을 만들기 위해 필요

    - 인자 X

    - 반환값 X

  - 함수 선언 = 함수 헤더(시그니쳐) + 함수 몸체(바디)

    - func 키워드

    - 함수 이름

    - 입력 파라미터 : 반드시 타입 명시 (Go는 정적 언어)

    - 반환값의 타입

      - 함수의 시그니쳐

 

* return 키워드

 

* 이름이 지정된 파라미터(named parameter)와 선택적 파라미터 대응

  - Go는 키워드 파리미터(named parameter)를 지원하지 않음

  - 선택적 파라미터 : 파라미터 기본값X

  - Go는 함수를 호출할 때 함수에서 정의한 파리미터를 생략할 수 없음

    - 구조체를 사용하면 named parameter 및 선택적 파라미터 방식을 간접적으로 실현

 

* 가변 입력 파라미터와 슬라이스

  - 임의 개수의 입력 파라미터 처리

  - 가변 파라미터는 반드시 함수의 입력 파라미터 목록에서 마지막에 위치

  - 타입 이름 앞에 ...

  - 가변 파라미터는 함수 내에서는 해당 타입의 슬라이스 슬라이스임 

 

* 슬라이스를 파라미터로 Unpack 하려면 슬라이스 뒤에...을 붙여줌

 

* 다중 반환값

  - 함수 정의시 반환값의 타입을 콤마로 구분하고 괄호로 묶어줌

  - return 시 반환값을 괄호로 묶지 않음

  - 일반적으로 다중 반환값을 받을 때는 := 사용

 

* 다중 반환값은 다중값

  - 다중 반환값은 개별 변수로 받아야 함

  - 하나의 변수로 받으면 애러

 

* 반환되는 값 무시

  - 함수의 반환값 개수와 받는 개수가 다르면 컴파일 애러 발생

  - 반환되는 값 중 일부만 무시하려면 _(underscore) 사용

  - 모든 반환값을 무시할 수 있음

 

* 이름이 지정된 반환값(named return)

  - 함수 정의 시 반환값의 타입과 파라미터 선언

  - 해당 함수의 로컬 변수로 간주함

  - 코너 케이스

    - 섀도잉 문제

    - 해당 변수들을 반환할 필요 없음

 

* 빈 반환(blank return)

  - return문에 반환값을 사용하지 않은 것

    - 반환 값이 없는 함수

    - 이름 지정된 반환값을 반환하고자 할 때

      - 이 때 return을 생략하면 컴파일 애러

 

* 함수는 값

  - 함수는 일급 객체

 

* 함수타입 선언

  - Go는 강타입 정적 타입 언어

    - 함수를 저장하는 변수는 해당 함수의 타입으로 선언되어야 함

    - 함수 타입 : type 키워드로 정의

[SYNTAX]

type 함수타입명 함수시그니처(함수 이름과 파라미터 이름 제외)

 

* 익명 함수

  - 이름 없는 함수 -> 재사용 하지 않겠음 -> 한 번만 쓸 것

  - 변수에 저장할 용도가 아니므로 인라인으로 작성함

  - 익명 함수를 호출해야 하므로 인라인 작성에서 함수 몸체 정의가 끝나고나서 괄호를 사용하여 인자를 넘겨줘야 함

 

* 클로저

  - 함수 내부에 선언된 함수 = 내부 함수(inner function)

  - 외부 함수에 의해 반환되는 내부 함수, 내부 함수는 외부 변수를 참조함

 

* 파라미터로 함수를 전달

 

* 함수에서 함수 반환

 

 


# 실습 #

 

섀도잉 변수

* 외부 블록과 내부 블록의 식별자 같음

* 출력값은 첫 번째 x와 마지막 x가 30으로 같고, 중간의 x가 15

 

:=과 다중할당 섀도잉

* 내부 블록인 x, y는 30과 10이 출력 되고, 외부에서 x는 50이 출력 됨

* := 은 현재 블록에서 선언된 변수들만 재사용함

 

패키지 이름과 같은 변수 사용X

* fmt라는 패키지 이름을 변수로 사용함

* fmt.Println undefined (type has no field or method Println) 애러 발생

* fmt가 지역변수로써 기능하게 되면, 파일블록에서 fmt 패키지를 섀도잉하여 main함수에서 fmt패키지 사용이 불가

 

for문 사용

* 변수 초기화 시 var를 사용하지 않음

* 변수 초기화 시 반드시 :=을 사용

 

for문 사용

* 파이썬의 in 대신 :=이 들어가는 것은 대입된다는 의미가 강하다고 받아들이자

 

index 리턴

* range는 두 개의 값을 반환함

* 하나는 인덱스 하나는 인덱스에 맞는 값

* 한 가지 파라미터로만 받아주면 인덱스만 반환함

 

return 없는 함수

* 아무 값도 반환하지 않음

 

파리미터 타입

* 여러 입력 파라미터가 같은 타입이라면 콤마로 파라미터를 구분하고 타입은 마지막에 기술할 수 있음

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

[5.20] Go 5일차(복습)  (0) 2022.05.20
[5.19] Go 4일차  (0) 2022.05.19
[5.17] Go 2일차  (0) 2022.05.17
[5.16] Go 1일차  (0) 2022.05.16
[5.13] Python 5일차  (0) 2022.05.13