본문 바로가기

Data analysis story

[R프로그래밍]-함수 만들기2(함수 내의 변수 범위, 지역 변수(logcal variable, 전역 변수(global variable), 지역변수를 전역변수로 바꾸기)

안녕하세요, 여러분!!

 

오늘은 R프로그래밍 사용자 지정 함수 그 두번째 시간!!

 

으로 변수의 범위에 대한 내용을 살펴보고자 합니다!!

 

변수의 범위에 대해서 처음 배우는 분들이라면

변수의 범위라는 말에 대해 감이 안 잡힐 거에요!

 

함수 내의 변수 범위(scoping rules)

 

"변수의 범위란 무엇일까요?"

R에서는 변수마다 자신이 인지될 수 있는 범위가 있는데요!

 

이 문장을 컴퓨터 내부 구조적으로 생각해보면

메모리가 존재하는 수명이 있다.라는 뜻입니다.

 

변수는 메모리에 할당되는 것이잖아요!

그러므로 메모리에 할당되고 그 할당이 끝날 때 까지를

변수의 lifetime이라고 할 수 있는 것이죠!

변수의 생명에 시작과 끝이 있는 것이죠.

 

왜 그런 걸까요?

메모리에는 한계가 있습니다. 무한정 메모리를 사용할 수가 없는 것이죠.

이런 메모리를 효율적으로 관리하기 위해서는 불필요한 메모리는 사용 후 알아서 지워져야 하는 것입니다.

따라서 변수에 생명이 있는 것이죠!

 

“특히 이번에 살펴볼 ‘함수 안에서 쓰이는 변수’는

함수가 시작할 때 변수가 생명을 얻고 함수가 끝나면 생명을 잃습니다.”

, 앞에서도 말했지만 그 변수가 들어있는 메모리가 없어지는 것이죠.

 

이렇게 함수를 부를 때 변수를 메모리에 할당했다가

함수가 끝날 때는 메모리가 없어지게 하면 메모리를 효율적으로 쓸 수 있겠죠?

 

그래서 컴퓨터의 메모리를 효율적으로 사용하기 위해 변수마다 범위를 준 것입니다.

 

이 위의 말들을 예제를 보면서 이해해봅시다!

위의 예시를 보면

 

매개 변수 xy를 받아

둘을 곱한 후 결과 값을 반환하는 fn이라는 사용자 지정 함수를 만들었습니다!

 

그 후 fn이라는 함수 밖에서

x를 출력하려고 하니까

x를 찾을 수 없다고 나오네요?

함수 안에 x값이 없어서 그런 걸까요?

 

그렇다면 fn이라는 함수를 만들 때 x에 값을 준 후에

함수 밖에서 x를 불러보도록 할게요!

아까와 다르게 fn함수 내에서 x3이라는 값을 주었습니다!

 

하지만 이번에도 역시!!

분명 x에다가 3을 할당했음에도 불구하고

x를 찍어보려고 하니 객체 x를 찾을 수 없다고 나오네요. 왜 그럴까요?

 

왜냐하면 x는 함수 fn에서만 알기 때문입니다!

따라서 이렇게 Global Environment를 보면

x에 아무런 값도 할당되지 않은 것을 볼 수 있죠!

 

fn함수 안에 있는 x, y, k는 지역변수(local variable)라고 합니다.

(함수 밖에 있는, 그리고 global environment에 표시되는 변수들은

전역변수(global variable)이라고 하구요!)

 

최종적으로 정리해보면 k, x, y는 함수 fn에서만 인식될 수 있는, 접근되는 값들로

함수가 실행될 때 메모리가 할당되고 함수가 종료될 때 메모리가 사라집니다.

 

이제 전역 변수에 대한 이해를 높이기 위해 좀 더 다른 예를 살펴봅시다.

원래는 function()에서 이 괄호 안에 매개변수를 넣었었는데

이 함수는 매개 변수가 없네요

그런데 이 함수는 x값에다가 5를 더한 값을 프린트하는데요!

 

이럴 때는 함수 내부에 x값이 없기 때문에 바깥을 봅니다.

바깥에 5가 있으니 5를 더해서

test() 이 문장을 실행하면

10이 찍히게 됩니다.

 

만약에 바깥에 x가 없다면 어떻게 될까요?

 

이럴 경우 x가 없다고 나옵니다.

x가 정의된 값이 없으니까요!

 

그럼 또 조금 다른 경우를 봅시다!

바깥에도 x가 있고

함수 안에도 x가 있는 경우를 말이죠!

 

test()를 불렀을 때는 10이 나오고

print(x+20)을 실행시키면 30이 나오네요!

 

test()를 실행할 때 앞선 예에서는 함수 안에 x가 없었기 때문에

바깥의 x를 가지고 와서 실행했지만

지금은 함수 안에 있기 때문에 5를 가져오는 것입니다.

 

이 함수 안의 x<-5에서 x는 지역변수가 되는 것이죠.

 

하지만 test 함수 밖의 x<-10은 글로벌변수겠죠!

 

print(x+20)에서 x

글로벌 변수이기 때문에

10+20을 해서 30이 출력되는 겁니다!

 

다른 예제를 통해 다시 한번 복습해봅시다!!

test 함수 안의 x는 지역 변수입니다.

test함수를 수행하려고 봤더니 함수 안에 x가 없죠?

 

그러므로 바깥의 10 x를 가져와서

test 함수 body 부분에 적혀져 있는 대로 10을 더해주죠.

그렇게 더한 값을 다시 x 할당하라고 되어 있는데

(이 부분이요!!)

 

이때 이 x는 여전히 test함수 안에 있으므로 지역변수입니다.

이렇게 지역변수가 20이 되지만 글로벌 변수는 이 지역변수의 영향을 받지 않습니다.

실제로 print(x)를 해보면 그냥 글로벌 변수에 할당된 10이라는 값이 나오네요!

 

따라서 R에서는 함수를 만들 때 마음대로 변수를 사용할 수 있어요!

 

이 말은 즉슨 사용하려고 하는 매개변수가

전역 변수의 다른 곳에서 쓰였나 걱정할 필요가 없다는 뜻입니다.

 

이렇게 지역 변수는 그 함수 내에서만 사용되기 때문이죠.

그래서 이름을 자유롭게 지어도 됩니다.

 

지역변수를 전역변수로 바꾸기

 

그런데 그럼에도 불구하고 함수 내에서 쓴 지역 변수

밖의 global 수로 꼭 바꾸고 싶다고 하면 어떻게 해야 할까요?

 

이럴 때는 <<- 라는 연산자를 사용하면 됩니다!

이제 좀 많이 헷갈리니까 집중해봅시다!

여기서 이 많은 x를 전역 변수와 글로벌 변수로 분류할 수 있을까요?

여기서 빨간 색 동그라미는 global 변수이고 파란 색 동그라미는 local 변수입니다.

왜일까요?

 

굉장히 헷갈리죠?? 천천히 설명해볼게요!!

일단

여기만 보면 x<-10은 글로벌 변수이고

test라는 함수 안에 x가 없기 때문에

바깥의 이 글로벌 변수 10을 지역 변수로 가져옵니다.

지역 변수 x(현재 상태 10)에다가 10을 더해주고 그 값을 다시 x에 할당하는데,

이 때 할당된 20이라는 값은 <<- 연산자 때문에 글로벌 변수가 됩니다.

 

그리고 밑의 print(x)는 위에서 글로벌 변수로 바꾼 것과는 상관없이

test라는 함수를 정의할 때 그 안에서만 효력이 있기로 되어 있는

지역 변수 xprint하라는 문장입니다.

 

x<<-x+10이라는 문장이 없었다면

이랬다면 왜 print(x)에서 x가 지역 변수인지 더 쉽게 이해가 가실거에요!

x<<-x+10이라는 문장은 전역 변수의 값을 바꿔주는 문장일 뿐입니다.

 

그런 후

test함수에 x라는 매개 변수를 넣고 출력하고

print라는 함수에 x라는 매개 변수를 넣고 출력하려고 할 때

test 안의 x에는 맨 위에서 정의되었던

 

이 글로벌 변수가 들어가는 것이고

 

print 안의 x에는

test함수에서 바꿔 치운 글로벌 변수’ 20이 들어가는 것이죠!

 

진짜 정말 헷갈리죠?ㅠㅠ 천천히 한 번 보세요!

 

그러면 앞선 예랑 똑같지만

지역 변수도 바꾸는 코드를 추가로 넣어볼게요.

왜 값이 이렇게 나오는지는 앞의 모든 걸 이해하고 혼자 스스로 이해해보시길 추천할게요!

 

 

변수의 값 결정

 

그러면 어떤 변수의 값을 언제 결정하는지에 대해 정리해보도록 하죠!

변수가 먼저 함수 안에 있는지 찾아봅니다!

 

앞의 많은 예에서 봤듯이 함수 안에 변수가 있으면

그 변수의 값을 썼었죠!!

 

함수 안에 있는지 찾아본다는 것은 먼저 매개 변수에 있는지 찾아보고

없으면 함수 내부에 있는지 찾아본다는 것입니다.

 

이렇게 함수 안에 있는 변수들은 함수 안에서만 적용됩니다.

혹은 변수가 함수 안에 찾아지지 않는다면 밖을 봅니다.

 

밖을 볼 때는 global environment에 변수가 있는지 보는 것이고

global environment 마저 없다면 에러가 나는 것입니다!!

 

오늘은 이렇게 해서 R의 사용자 지정 함수 두번째 포스팅을 마쳤습니다!

함수 안의 변수 효력 범위는

처음에 보면 굉장히 어렵고 헷갈리지만

계속 보다 보면

어느 순간 딱 이해가 될 테니

자주 공부하길 바랄게요!!