# 개념 #
* 블록(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이 출력 됨
* := 은 현재 블록에서 선언된 변수들만 재사용함
* fmt라는 패키지 이름을 변수로 사용함
* fmt.Println undefined (type has no field or method Println) 애러 발생
* fmt가 지역변수로써 기능하게 되면, 파일블록에서 fmt 패키지를 섀도잉하여 main함수에서 fmt패키지 사용이 불가
* 변수 초기화 시 var를 사용하지 않음
* 변수 초기화 시 반드시 :=을 사용
* 파이썬의 in 대신 :=이 들어가는 것은 대입된다는 의미가 강하다고 받아들이자
* range는 두 개의 값을 반환함
* 하나는 인덱스 하나는 인덱스에 맞는 값
* 한 가지 파라미터로만 받아주면 인덱스만 반환함
* 아무 값도 반환하지 않음
* 여러 입력 파라미터가 같은 타입이라면 콤마로 파라미터를 구분하고 타입은 마지막에 기술할 수 있음
'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 |