본문 바로가기
방구석코딩/파이썬 기초문법

[파이썬] 외부변수와 내부변수, 함수 내/외부에서 사용하는 방법(global)

by 석세상 2024. 8. 8.
반응형

파이썬 뿐 아니라 다른 프로그램을 사용 시에도 내부변수와 외부변수가 구분되는 프로그램이 많다. 하지만 프로그램마다 외부변수와 내부변수를 나누는 기준이 조금씩 다른데 파이썬에서는 함수정의 시 함수 내에서 사용되는 내부변수와 함수 밖에서 사용되는 외부변수로 나눈다.

파이썬에서 활용되는 내부변수와 외부변수에 대해 알아보자.

 

 

변수란

변수란 말 그대로 변하는 수를 의미하는데, 프로그램에서는 값을 할당한다는 의미가 더 크게 사용된다. 변수는 여러가지 기준으로 분류할 수 있는데 변수의 타입에 따라 숫자, 문자 등으로 분류할 수도 있고, 데이터 형태에 따라 리스트, 딕셔너리, 셋, 집합 등의 형태로도 분류할 수 있다.

 

여기서는 외부변수와 내부변수를 구분할 수 있는 분류 기준에 대해서 알아보도록 하자. 일반적으로 외부변수를 많이 사용하지만 이해를 위해 내부변수부터 이해하면 외부변수와 차이를 쉽게 알 수 있다.

 

내부변수

내부변수란 함수정의 시 함수 내에서만 작동하는 변수를 의미한다.

 

함수 내에서 여러가지 연산을 하고 return문을 사용하지 않는 한 함수 외부에서는 함수 내 변수값을 불러올 수 없다. 반대로 함수 내 결과값을 불러오기 위해서는 return문을 이용해서 결과를 내보내야 한다는 의미이다.

 

또한 변수명이 동일하더라도 함수 내에서 존재하는 내부변수와 함수 밖에 존재하는 외부변수와는 다른 변수로 생각해야 한다. 아래 예시를 보면서 내부변수에 대해 자세히 알아보도록 하자.

def calculate(height):
    row = 10
    col = 20
    volume = 10 * 20 * height
    return volume

calculate(5)

위의 예시는 내가 가지고 있는 땅에 건물을 지을 때 높이를 어느정도로 지으면 부피가 어떻게 되는지 알고싶다고 가정하자.

 

그러면 땅의 크기는 일정할테니 가로를 row = 10으로 고정하고, 세로는 col이라는 변수로 20이라는 값을 주었다. 여기서 건물을 얼만큼의 높이로 지었을 때 부피를 알고 싶다고 하면 가로 x 세로 x 높이를 하면 부피를 알 수 있는데 높이는 아직 정해지지 않았으니 height라는 매개변수로 정의했다.

 

여기서 row, col, volumn의 경우는 모두 함수 내에 있으니 내부변수이다. 이 내부변수의 값 중 난 부피만 알고싶으니 부피는 return문을 사용했다. 그러면 위의 함수에 높이 5를 가진 건물을 적용하면 부피는 1000이라는 값이 나오는 것을 볼 수 있다.

 

이처럼 함수 내부에 있는 변수의 값을 함수 실행 결과로 보기 위해선 return문을 사용해야 한다.

 

그럼 함수를 실행시켜 생성된 결과가 아닌 함수 내부에 있는 변수인row나 col, volumn을 그냥 함수 외부에서 print문을 이용해 본다면 어떻게 될까? 그 중 하나로 row변수를 예를 들어 보자.

다음 결과를 보면 row라는 변수가 없다라고 나온다. 함수 밖에서는 함수 내부에서 생성된 변수는 실행되지 않는다. row외에 col이나 volumn의 경우도 실행해보면 동일하게 정의되지 않은 변수라고 나온다.

 

 

▶︎ return문에 대해서 좀 더 알고 싶다면 아래 링크를 참고하자.

 

[파이썬] return문 사용하기, 결과 생성 명령어

파이썬에서 결과 생성을 위한 함수는 어떤게 있을까요? 앞의 내용들에서는 print문을 이용해서 출력만 해봤는데요. 출력문은 사실 결과를 보여주기 보다는 그냥 해당 부분을 사람이 확인할 수 있

gusugi.tistory.com

 

 

외부변수

외부변수란 함수정의 외에 일반적으로 사용되는 변수를 외부변수라 한다. 특정한 함수 내에 포함되는 변수가 아니면 외부변수라 생각하면 된다. 외부변수의 값은 함수정의 시 함수 내부에 사용되는 경우가 아니라면 어디서나 가져와서 사용할 수 있다.

 

앞에서 내부변수에 대해서 제대로 이해했다면 외부변수는 쉽게 이해할 수 있다.

 

다만 여기서 알아야 할 부분은 내부변수를 함수외부에서 결과값을 가져오기 위해서는 return문을 사용하여 함수를 실행하면 된다는 것을 앞에서 얘기했다. 그럼 반대로 함수 내부에서 함수 외부에 있는 변수의 값을 가져오려고 한다면 어떨까?

 

이 경우는 global이라는 명령어를 통해 함수 내부에 밖에 있는 변수를 가져와 활용할 수도 있다. global 명령어의 사용여부를 통해 결과가 어떻게 달라지는지 아래 예시를 통해 알아보자.

 

global 미사용 예시

만약 땅의 가로 길이를 의미하는 row변수의 경우 함수외부에서도 다른 코드부분에서도 비용 등을 산출하기 위해 사용된다고 가정하자. 함수 내부에서 생성된 변수는 함수 밖에서 사용될 수 없기 때문에 row 변수는 아래와 같이 함수 외부에 생성했다.

row = 10

def calculate(height):
    col = 20
    volume = row * col * height
    return volume

그리고 나서 부피를 구하는 함수를 정의했다. 이 함수를 실행하면 과연 결과가 생성될까? 아래에서 어떻게 실행되는지 결과를 보자. 

결과를 확인하면 row 변수를 함수 내에서 생성한 것과 동일한 결과가 생성되는 것을 볼 수 있다. 따라서 함수 밖에서 필요한 변수들은 만들어두어도 큰 문제가 없는 것처럼 보인다.

 

하지만 만약 함수내부와 함수외부에 동일한 이름으로 되어있는 변수를 생성한다면 결과는 어떻게 달라질까? 아래 예시를 보면 외부변수에도 row가 있고 내부변수에도 row라는 이름을 가진 변수가 있다.

결과값을 확인해보면 이 경우에는 함수내부에 있는 row의 값을 가지고 계산한 것을 알 수 있다. 논리적으로 생각해보면 함수를 실행한 결과이기 때문에 함수내부에 있는 변수값을 이용한 결과값이 나온다는 것이 당연해 보인다.

 

또 앞에서 우리는 함수외부와 내부에 동일한 변수명으로 생성되도 다른 변수라는 것을 이야기 했다. 이렇게 간단한 코드에서는 사람이 조금만 논리적으로 생각해본다면 직관적으로 이해할 수 있지만 엄청나게 복잡한 코드를 사용하는 상황이라면 이 둘을 모두 기억하고 구분할 수 있을까?

 

또 이런 내/외부 변수명이 동일한 경우가 많다면 어떻게 기억할 수 있을까? 그렇기 때문에 사람이 인식하고 생각하는 한계가 있기 때문에 변수명을 다르게 주는 것이 훨씬 코드를 생성하는데 있어 올바른 방법이라 생각한다.

 

global 사용 예시

코딩을 하다보면 함수 외부에 있는 변수를 이용해서 함수내부에서 값을 변화시키며 사용해야하는 경우도 발생한다. 이런 경우 외부에 있는 변수를 사용하기 위해선 global이라는 명령어를 활용해야 한다.

아래 예시를 보면 내땅의 가로길이는 10인데 만약 옆에 땅을 가지고 있는 사람이 땅을 판다면 매수할 생각이 있다. 그러면 현재 내 땅의 가로 길이는 그대로 두고 내가 매수할 땅의 가로길이를 더해서 부피를 계산하고 싶다.

 

그러면 다음과 같이 코드를 작성할 수 있는데 이렇게 된다면 함수내부에서 가로 길이를 매수할 길이만큼 더해져야 하는 것이다.

row = 10

def calculate(height):
    row = row + 1
    col = 20
    volume = row * col * height
    return volume

이 함수를 실행해보면 아래와 같은 에러가 발생하는데, 이 경우는 변수가 초기화되지 않았을 경우 발생한다. 

좀 더 자세히 보면 앞서 얘기했듯이 함수내부와 외부에 있는 변수는 다른 변수로 인식하는데 함수 내부에서 연산하기 위해 row 변수에 row값에 +1을 해야하는데 인간은 함수 밖의 row와 같은 변수라 생각할 수 있지만 프로그램 상에서는 그렇지 않다.

 

이름만 동일한 전혀 다른 변수이기 때문에 row라는 변수가 없는데 row에 +1을 하라고 하니 에러를 토해내는 것이다. 따라서 아래와 같이 함수 내부에서row = 1이다 라고 먼저 정의를 해주어야 한다. 그러면 에러없이 프로그램이 실행되는 것을 볼 수 있다.

하지만 이 경우에도 조금 더 생각해볼 필요가 있는데, 여기서 함수내부에 있는 row의 초기값을 10으로 지정하고 싶었는데 실수로 1을 넣은 것이다. 이렇게 사람이 동일한 값을 사용하고 싶은데 실수로 잘못입력할 수 있기 때문에 외부변수에 있던 값을 그대로 가져와서 연산하고 싶다.

 

그런 경우 global 명령어를 이용하여 해당 문제를 해결할 수 있다. 다음과 같이 함수 내부에 global 명령어를 쓰고 변수명을 입력해주면 해당 변수는 전역 변수로 인식한다.

 

전역변수란 함수내에 국한된 값이 아니라 함수 외부에서도 전(지)역에서 사용되는 변수다라는 의미를 가진다. 따라서 함수외부에 있는 row의 값을 함수내부에서도 비로소 사용할 수 있기 때문에 이 값을 가져와 연산하기 때문에 초기값의 문제없이 프로그램이 실행된다.

 

다만 앞에서 얘기한바와 마찬가지로 동일한 변수명으로 다른 값을 사용한다면 사람이 직관적으로 인식하기 어려운 문제점이 발생할 수 있다.

 

그럼에도 이와 같은 경우는 꼭 필요한 경우가 있는데 그 부분에 대해서는 현재 진행하고 있는 주식 데이터 크롤링에 있어 함수를 적용하여 하는 부분에서 실제 어떤 경우에 사용되는지 알아보도록 하자.

728x90
반응형

댓글