A. Programming/Python

[파이썬 기초] 언더바, 언더스코어(_, __) 사용법

_DK_ 2021. 9. 9. 12:00
반응형
인내는 쓰나, 그 열매는 달다.
- 장 자크 루소

 

  이전 글에서 파이썬 내장 함수 중 처음에 유용하게 사용할 수 있는 dir() 함수와 help() 함수에 대해 알아보았습니다.

[A. Programming/Python] - [파이썬 기초] dir(), help() 내장 함수(빌트인 함수) 사용법

 

[파이썬 기초] dir(), help() 내장 함수(빌트인 함수) 사용법

오늘 나무 그늘에서 쉴 수 있는 이유는 예전에 나무를 심었기 때문이다. - 워렌 버핏 이전 글들을 통해서 파이썬 자료형과 특징들에 대해 알아보았습니다. [A. Programming/Python] - [파이썬 기초] 자료

yongbba.tistory.com

 

  이번에는 파이썬으로 코딩을 하다 보면 자주 보게 되는 언더스코어(_)가 어떤 경우에 쓰이는지, 어떤 의미를 가지고 있는지에 대해서 알아보려고 합니다.('언더바' 또는 '언더스코어'라고 불리는데 여기서는 '언더스코어'로 지칭하도록 하겠습니다.)

 

 

 

 언더스코어(_), 더블언더스코어(__)

 

  파이썬에서는 언더스코어(_)가 다양한 용도로 사용이 되는데 다른 사람이 작성한 코드에서 이 부분을 이해하기 위해서는 사용 방법에 대해서 한 번 봐 두고 가는 것이 좋다고 생각합니다.(물론 잘 활용한다면 훨씬 효율적인 코드 작성도 가능하다고 생각합니다.)

 

 인터프리터에서 사용될 경우 : 마지막 실행 값을 저장

 

a = 1
b = 2
a + b
_
_ + a
_

 

  위와 같은 순서로 파이썬 인터프리터 창에 입력을 해보도록 하겠습니다.

  실행 결과를 보면 '_'를 이용하여 마지막 실행된 결과를 볼 수 있고, 또 이를 이용하여 다른 연산에 사용할 수도 있는 것을 확인할 수 있습니다.

 


  위의 예제에서 보듯이 파이썬 인터프리터에서 사용될 경우에는 언더스코어(_)를 이용하여 마지막에 실행된 결과 값을 이용할 수 있습니다.

 

 변수로 사용될 경우 : 값을 저장할 필요가 없을 경우

 

for _ in range(1, 5):
    print(_)

  위의 예제와 같이 for문 등에서 반복을 위한 인자로 사용되는 경우에 사용이 될 수 있습니다. 이와 유사하게 튜플 등의 값을 받아올 때도 활용할 수 있습니다.

 

numTuple = (1, 2, 3, 4)
a, _, _, b = numTuple
print(a)
print(b)

  위의 예제와 같이 튜플 등에서 필요한 값들만을 이용하고자 할 때도 사용이 가능합니다.

 

  이처럼 반복문을 위한 인자튜플 등의 변수에서 필요한 값만을 얻어올 때, 불필요한 변수의 사용을 피하기 위해 활용될 수 있습니다.

 

 

 변수나 함수의 네이밍(Naming)에 사용될 경우

 

 _이름


  파이썬은 객체지향 언어의 특징 중 하나인 정보 은닉을 위한 접근 제어자를 지원하지 않지만, private 접근 제어자와 비슷한 기능을 하도록 할 때 사용할 수 있습니다.

 

# Temp.py
def printValue():
    print(100)

def _printValue():
    print(200)

  먼저 위와 같이 코드를 작성한 후 'Temp.py'로 저장을 합니다. 이후 아래와 같이 코드를 작성하여 실행을 해보도록 하겠습니다.

 

from Temp import *

printValue()
_printValue()

 

  언더스코어가 앞에 붙은 함수는 'from ~ import *'을 통해서는 가져오지 못한 것입니다. 하지만 이것도 import 방법을 *을 이용하지 않고 직접 호출하여 이용하면 어디서든지 사용이 가능합니다.

 

import Temp

Temp.printValue()
Temp._printValue()

  완벽하게 private 접근 제어자의 기능을 할 수는 없지만 모듈 내부에서만 사용하고자 하는 의도 등을 나타낼 때는 도움이 될 수 있다고 생각합니다.

 

 

 __이름

 

  '맹글링(Mangling)'을 위해 사용되는데, 파이썬에서 규정한 규칙에 의해 변수나 함수의 이름이 바뀌는 것을 의미합니다. '__이름'과 같이 클래스 내부적으로 사용이 가능하지만, 외부에서는 '__이름'만으로 사용할 수 없습니다.

 

# Temp.py
class Temp:
    def __init__(self):
        self.a = 100
        self.__a = 200

  먼저 위와 같이 코드를 작성한 후 'Temp.py'로 저장합니다. 이 후 아래와 같은 코드 작성 후 실행해보도록 하겠습니다.

 

import Temp

temp = Temp.Temp()
print(temp.a)
print(dir(temp))
print(temp.__a)

  실행 결과를 보면 '__a'로 정의된 변수를 사용할 수 없는 것을 알 수 있습니다. 또한 'print(dir(temp))'의 결과를 통해 '__a'란 변수가 정의되지 않았으며, '_Temp__a'란 변수가 생성된 것을 볼 수 있습니다. 아래와 같이 코드를 변경하여 실행을 해보도록 하겠습니다.

 

import Temp

temp = Temp.Temp()
print(temp.a)
print(temp._Temp__a)

 

  이처럼 외부에서 사용할 경우에는 '_클래스__이름'을 통해서 사용할 수 있습니다. 이런 맹글링은 주로 하위 클래스에서 상위 클래스를 상속받을 때 속성이 오버 라이딩이 되는 것을 막기 위해 사용됩니다.

 

 

 __이름__

 

  이 경우에는 파이썬에서 특별히 정의한 변수나 함수에 대해 사용됩니다. 위의 예제에서 작성했던 'Temp.py'의 코드 중 '__init__'이 그중 하나로 클래스 생성자에 활용됩니다.

 

# Temp.py
class Temp:
    def __init__(self):
        self.a = 100
        self.__a = 200

 

  또한 아래와 같이 자주 사용되는 구문인 'if __name__ == "__main__":' 에 나오는 '__name__'도 파이썬에서 특별히 정의된 변수입니다.(이 구문에 대한 설명은 다음에 다시 설명할 예정입니다.)

 

import Temp

if __name__ == "__main__":
    temp = Temp.Temp()
    print(temp.a)

 

  위의 예제에서 사용된 '__init__', '__name__' 등은 파이썬 프로그래밍의 기본 중 하나로 앞으로도 자주 보게 될 것입니다.

 

 

 위 경우 외의 언더스코어 사용

 

  위에서 언급한 경우 외에도 숫자의 자릿수를 표현할 때도 사용되기도 합니다.

 

a = 12_000_000
b = 55_500
print(a)
print(b)

 

  여기까지가 파이썬에서 특별하게 사용되는 언더스코어의 기능이라고 볼 수 있습니다. 이 외의 대부분 사용되는 경우들은 다른 프로그래밍 언어들과 비슷하게 변수나 함수의 네이밍에 사용되는 경우입니다.

 

 

 

반응형