한 눈에 끝내는 고랭 기초
    • 01
      시작하기에 앞서
    • 강의대상
      Go란?
      실습 환경 구축 - 구름IDE
      Hello goorm! 출력해보기
    • 02
      변수와 상수
    • 콘솔 출력 함수의 기본
      변수의 선언과 초기화
      상수의 선언과 초기화
      간단한 덧셈
      잘못된 신상정보
    • 03
      연산자
    • 연산자 종류
      연산자 우선순위
      콘솔 입력 함수의 기본
      간단한 덧셈과 곱셈
      몫과 나머지
    • 04
      자료형
    • 자료형의 종류와 특징
      문자열의 표현
      자료형의 변환
      강제 형 변환
    • 05
      콘솔 출력과 입력 함수
    • 콘솔 출력 함수(Print)
      콘솔 입력 함수(Scan)
      정돈된 표
      신상정보 입력과 출력
    • 06
      반복문 - for
    • 오로지 for
      구구단
      빛나는 이등변삼각형
    • 07
      조건문 - if/else
    • 조건에 따른 실행과 흐름 분기
      7과 9의 배수
      두 수의 차
    • 08
      분기문 - switch
    • swich문에 의한 선택적 실행
      안좋은 계산기
    • 09
      제어문
    • break, continue, goto문
      구구단2
      두 수를 더하면 99
    • 10
      컬렉션
    • 배열(Array)
      슬라이스(Slice)
      맵(Map)
      역행렬
      가장 긴 이름
      중간고사 평균 점수
    • 11
      함수
    • Go언어에서의 함수
      전역변수와 지역변수
      매개변수
      반환값(리턴값)
      익명 함수
      오름차순 정렬
      아이패드를 사주는 조건
      역학적 에너지
    • 12
      클로저
    • 외부 변수 접근 : 클로저
      동전 정리
    • 13
      구조체와 메소드
    • 구조체
      메소드
      성적 저장 프로그램
      역학적 에너지2
    • 14
      인터페이스(interface)
    • 메소드의 집합 인터페이스
      직육면체와 원기둥
    • 15
      defer와 panic()
    • 지연 처리 defer
      종료하는 panic(), 복구하는 recover()
      엘리베이터
      중간고사 평균 점수2
    • 16
      에러 처리
    • 에러 처리의 기본
      에러 출력 및 처리
      중간고사 평균 점수3
    • 17
      고루틴(Goroutine)
    • 비동기 프로세스의 기본
      고루틴의 활용
      고루틴 실습
    • 18
      채널(Channel)
    • 고루틴의 데이터 통로 : 채널
      비동기 채널과 버퍼
      동기 채널
      채널 닫기
      송신 전용, 수신 전용 채널
      채널 select문
      고루틴 실습2
      메시지 전송
      동기 채널 실습
      비동기 채널 실습
    • 19
      패키지(package)
    • 패키지의 개념
    • 20
      실전 프로젝트 - 마일리지 상점
    • 프로젝트를 시작하기 앞서
      실습모드에서 실습
      마일리지 상점의 주요 기능
      필수 구조체와 매인 메뉴
      잔여 수량, 잔여 포인트 구현
    • 21
      실전 프로젝트 - 주문하기, 장바구니 담기
    • 구매 구현(1)
      구매 구현(2)
      장바구니에 담기
      장바구니 확인(1)
      장바구니 확인(2)
    • 22
      실전 프로젝트 - 고루틴으로 배송하기
    • 배송 상태 확인(1)
      배송 상태 확인(2)
      배송 상태 확인(3)
      최종 코드
    외부 변수 접근 : 클로저
    12 클로저
    외부 변수 접근 : 클로저

    '함수' 챕터에서 '익명 함수'에 대해 배웠습니다. Go언어에서 함수는 일급 함수(First-Class Function)이기 때문에 익명 함수를 활용할 수 있습니다. 함수 자체를 다른 객체들과 마찬가지로 함수형으로서 매개변수와 반환값으로 쓸 수 있는 것입니다. 이번 강의에서 배울 클로저는 함수 안에서 익명 함수를 정의해서 바깥쪽 함수에 선언한 변수에도 접근할 수 있는 함수를 말합니다. 쉽게 말해서, 함수안에서 바깥 변수를 사용하려면 매개 변수를 사용해 Pass by value 형식이나 Pass by reference 형식으로 사용해야합니다. 그런데 익명 함수는 클로저이기 때문에 외부 함수의 변수를 그냥 접근할 수 있습니다.


    아래 클로저를 이용해 함수 외부 변수를 접근하는 아주 간단한 예시를 보겠습니다. 

    go

    함수 안에서 함수를 정의하기 위해서 당연히 익명 함수만 쓸 수 있습니다. 위 예시에서는 main() 함수 내에 선언된 익명 함수들이 main() 함수의 변수를 매개변수 없이 접근합니다.

    지난 강의에서 함수 자체를 매개변수로 전달받는 것은 배웠는데 함수 안에서 함수를 반환하는 것은 이번 강의인 '클로저' 챕터에서 배운다고 했습니다. 이를 활용하는 간단한 예제를 살펴보고 알아보겠습니다. 아래 코드를 바로 실행해보세요.

    go
    실행 결과를 확인해보세요!

    next 함수는 반환형으로 func() int 를 입력해 매개변수가 없고 반환형이 int인 함수형을 선언했습니다. next 함수는 변수 i를 지역 변수로서 0으로 초기화하고 이를 1 증가시키는 익명 함수를 반환합니다. 그리고 이 함수를 nextInt라는 변수에 초기화합니다.  출력되는 결과 값을 확인해보면 nextInt를 실행할 때마다 값이 초기화 되는 것이 아니라 이전의 흐름에 이어서 1을 증가 시킵니다.


    왜냐하면 i의 연산 기능을 하는 익명 함수 안에서 i가 선언되지 않고 익명 함수 밖에 있는 변수 i를 참조하고있기 때문입니다. 익명 함수 자체가 지역 변수로 i를 갖는 것이 아니기 때문에 외부 변수 i가 상태를 계속 유지하면서 값을 1씩 증가시키는 기능을 하게 됩니다. 그리고 새로운 변수인 newInt에 새롭게 함수를 초기화하면 새로운 클로저 함수 값을 생성해 변수 i는 다시 0으로 초기화됩니다.

    질문하기