본문 바로가기

코딩/Python

[Python/파이썬] 객체를 함수 매개변수로 전달하기 - 전역변수, 지역변수, 매개변수

반응형

 

  최근에 좀더 효율적인 코드, 구조적인 코드를 짜보기 위해 Class를 사용해보고 있다. 비전공자이기 때문에 메모리 구조가 어떻고 자료구조가 어떤지 아직 모르는 내용이 많지만 해당 내용을 알고 있으면 좋을 것 같아 정리해보았다.

 

   본 내용을 작성하기에 앞서 함수의 지역변수, 전역변수, 매개변수의 개념을 이해해야 한다. 파이썬뿐만 아니라 여러 프로그래밍 언어에 있는 개념이다.

 

 

1. 전역변수, 지역변수

 

  전역변수는 함수 밖에서 정의된 변수를 말한다. 함수 밖에서 정의되어 함수 내에서도 별다른 매개변수 입력없이 접근할 수 있다. 아래 예시를 보자.

 

<코드>

#함수 선언
def function():
    print (name+"의 "+blog+" 블로그입니다.")

#전역변수 선언
blog = "투손플레이스"
name = "와비"

#함수 호출
function()

 

<결과>

와비의 투손플레이스 블로그입니다.

 

 

  blog와 name은 함수 밖에서 선언 된 전역변수이다. 함수로 정의한 function( )은 매개변수는 없지만 전역변수에 자유롭게 접근할 수 있다. 이번엔 위 코드 반대로 함수 안에서 변수를 선언해보았다. 아래와 같이 선언하는 방법을 지역변수라고 한다. 지역변수는 함수 내에서 선언 된 변수이다.

 

<코드>

#함수 선언
def function():
    blog = "투손플레이스"
    name = "와비"


function()
print (name+"의 "+blog+" 블로그입니다.")

 

<결과>

NameError: name 'name' is not defined

 

 

  함수 내에서 변수를 선언하고 함수 밖에서 해당 변수에 접근하면 NameError가 발생한다. 이유는 지역변수로 선언 된 blog와 name을 함수 밖에서 접근할 수 없기 때문이다. 

 

  만약, 함수 내에서 선언한 변수를 함수 밖에서 접근하려면 전역변수 선언을 해줘야 한다.

전역변수 선언은 global '변수명'을 통해 먼저 선언해줘야 한다.

 

<코드>

#함수 선언
def function():
    #전역변수 blog, name 선언
    global blog
    global name
    
    #전역변수에 문자열 값 할당
    blog = "투손플레이스"
    name = "와비"


function()
print (name+"의 "+blog+" 블로그입니다.")

 

<결과>

와비의 투손플레이스 블로그입니다.

 

  class로 선언 된 인스턴스의 속성값에도 마찬가지로 전역변수와 지역변수 개념이 적용된다.

 

 

<코드>

#ob 인스턴스 속성값을 바꾸는 함수 정의
def function(value):
    ob.test_value = value

#test class정의
class test():
    def __init__(self):
        self.test_value = 1


#test class 인스턴스 'ob' 선언
ob = test()
print(ob.test_value)

#fucntion 을 통해 test class 속성값 바꾸기
function(100)
print(ob.test_value)

 

<결과>

1
100

 

 

  결과에서 보듯이 함수 내에서 'ob' 객체의 속성값 test_value에 접근하여 수정할 수 있다. 함수 밖에서 선언 된 클래스의 인스턴스의 속성도 마찬가지로 전역변수 개념이 적용되는 것이다.

 

  하지만, 위 코드는 효율적이지 않다. 함수 내에서 'ob'라는 특정 객체에 접근하는 것이므로 'ob'라는 인스턴스를 선언하지 않으면 해당 함수는 동작할 수 없다. 좀더 효율적으로 코드를 짜려면 함수의 매개변수 개념을 이용한다.

 

 

 

2. Class를 함수 객체로 전달하기 - 매개변수, 인수

 

  함수를 통해 매개변수를 선언하면 함수 사용시 인수를 통해 함수 내에서 사용할 수 있다. 찾아보니 매개변수는 지역변수와 같은 개념으로 인수로 받은 값들은 지역변수의 개념이 적용 된다.

 

 

  위 예시는 인수를 정수를 전달했지만 사실 Class의 객체도 전달이 가능하다.

 

<코드>

#Objtest : 객체 / value : 정수
def function(Objtest, value):
    Objtest.test_value = value

#test class정의
class test():
    def __init__(self):
        self.test_value = 1

#test class 인스턴스 'ob' 선언
ob = test()
print(ob.test_value)

#fucntion의 매개변수에 객체 'ob'와 정수 100를 인수로 전달
function(ob, 100)
print(ob.test_value)

 

<결과>

1
100

 

  위와 같이 코드를 작성하면 클래스의 인스턴스명이 어떻든간에 함수에 인수로 객체를 전달하여 객체의 속성값을 변경할 수 있다. 

 

 


※ 추가로 공부 할 부분

 

    정리를 하다보니 한가지 의문사항이 들었다.  

 

-. 전역변수를 통해 함수 내에서 사용하는 방법

-. 전역변수를 함수 매개변수의 인수로 전달하여 함수 내에서 사용하는 방법

 

  위 2가지는 무슨 차이가 있는걸까? 아래 2가지 방식은 전역변수를 함수 내에서 사용하는 방식에서 동일하다. 추측으로는 매개변수는 지역변수와 같이 사용되므로 메모리 사용에 차이가 있지 않을까 싶다. 아직 여기까지는 내 수준이 아니어서 다음에 공부 하여 정리해볼 예정이다.

728x90