한 눈에 끝내는 고랭 기초
    • 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)
      최종 코드
    전역변수와 지역변수
    11 함수
    전역변수와 지역변수

    매개변수는 값 자체를 전달하는 방식(Pass by value)과 값의 주소를 전달하는 방식(Pass by reference)이 있습니다. 주소의 값을 참조하는 방식과 값을 복사해오는 방식의 개념에 대해서는 슬라이스와 맵 강의를 통해 먼저 설명했습니다. 하지만 이 개념을 매개변수의 적용하기 위해서는 지역변수와 전역변수의 개념에 대한 이해가 선행되어야 합니다. 왜냐하면 매개변수에 전달하려는 변수가 어떤 유형의 변수이냐에 따라 사용 방법과 결과가 다르기 때문입니다.

    지역변수와 전역변수는 선언되는 위치에 따라 그 유형이 결정됩니다. 지역변수는 중괄호({}) 안에서 선언된 변수를 말합니다. 이렇게 선언된 지역변수는 선언된 지역 내에서만 유효합니다. 전역변수는 특정 지역(중괄호) 밖에서 선언된 변수를 말합니다. 이 변수는 지역과 관계없이 어느 곳에든 유효합니다.  따라서 이 두 변수는 두 가지에 차이점이 있습니다.

    • 메모리에 존재하는 시간
    • 변수에 접근할 수 있는 범위 

    지역변수는 해당 지역에서 선언되는 순간 메모리가 생성되고 해당 지역을 벗어나면 자동으로 소멸됩니다.  하지만 전역변수는 코드가 시작되어 선언되는 순간 메모리가 생성되고 코드 전체가 끝날때까지 메모리를 차지하고 있습니다. 이것이 바로 '메모리에 존재하는 시간'에 대한 설명입니다. 


    아래 지역변수에 대한 예시 코드를 실행해보고 하나씩 알아보겠습니다.

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

    위 코드에서는 3개의 함수에서 총 4개의 변수가 선언되고 초기화됩니다. 지역변수는 해당 지역에서만 유효하다는 것을 보여주기 위해 일부러 main 함수 안의 a와 exampleFunc1 함수 안의 a의 변수 이름을 똑같이 설정했습니다.

    우선 main 함수가 호출되면서 지역변수 a가 선언되고 메모리상에 a라는 이름의 변수가 할당되고 28로 초기화됩니다.

    default

    var a int = 28 다음 문장을 실행하면 바로 exampleFunc1 함수가 호출되고 지역변수 a를 선언하고 초기화를 했기 때문에 메모리 공간에는 추가로 변수 a가 할당되고 10으로 초기화됩니다. 하지만 이 상태는 main 함수가 종료된 상황이 아니기 때문에 main 함수 호출 시 할당된 변수 a도 메모리 공간에 함께 존재하게 됩니다. 위에 설명한 것처럼 지역변수는 실행되고 있는 지역에서만 유효하므로 다른 지역의 변수의 변수명과 관계없습니다. 따라서 변수명이 같으면 가린다는 느낌이 듭니다. 

    default

    그리고 exampleFunc1의 코드를 차례로 실행하고 함수가 종료되면 exampleFunc1 함수에서 선언된 변수 a는 메모리 공간에서 사라지게 됩니다. 그래서 메모리 공간에는 main 함수의 변수 a만 남게됩니다. 그리고나서 코드의 흐름은 다시 main 함수로 돌아와 exampleFunc2 함수를 호출합니다. exmapleFunc2 함수 역시 지역변수 bc를 선언해 메모리 공간에 변수 b와 c가 각각 할당되고 20, 30으로 초기화 됩니다.

    default

    그리고 exampleFunc2의 코드를 차례로 실행하고 함수가 종료되면, 또 함수 내에서 선언했던 변수 b와 c는 소멸하게 되고 코드의 흐름이 다시 main 함수로 돌아와 a만 메모리에 남게됩니다. 그리고 main 함수도 종료되면  메모리 공간의 모든 변수가 소멸되는 것입니다.

    default
    지역변수를 이해했다면 전역변수는 수월할 것입니다.  

    아래 간단한 예시를 실행해보고 알아보겠습니다.

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

    코드가 실행되고 main 함수가 호출되기 전에 전역변수로 선언한 a가 메모리 공간에 할당됩니다. 이 변수는 프로그램이 종료될 때까지 메모리 공간에 남아있을 것이고, 어느 지역에서든 사용할 수 있습니다. 그리고 main 함수가 호출되고 localVar 함수도 호출됩니다. localVar 함수에서 지역변수 a가 선언되고 10으로 초기화됩니다. 아까 말한 것처럼 전역변수와 이름이 같아도 지역변수는 해당 지역에서 유효하다고 했기 때문에 오류가 나는 것이 아니라 전역변수를 가리게 됩니다. 따라서 지역변수 a로 연산을 수행하고 종료합니다. 그리고 이어서 globalVar 함수를 호출하게되는데 이 함수에서는 변수를 선언하지 않았습니다. 전역변수는 어느 지역에서든 사용이 가능하기때문에 특별한 선언 없이 바로 전역변수를 사용해 연산을 하고 그 값을 반환합니다. 이렇게 지역변수를 활용한 함수와 전역변수를 활용한 함수의 쓰임과 원리를 확인했습니다.


    이렇게 보면 전역변수는 선언해놓고 필요할 때마다 어디서든 쓰면 되니까 지역변수보다 훨씬 유용하게 쓰일 것처럼 보일 수 있습니다. 하지만 전역변수의 선언은 가급적 피해야합니다. 왜냐하면 전역변수는 프로그램의 구조를 복잡하게 만들고 사용빈도와 상관 없이 프로그램이 끝날때까지 메모리를 차지하고있기 때문입니다. 따라서 전역변수를 사용하는 것은 신중해야합니다.

    질문하기