인내는 쓰나, 그 열매는 달다.
- 장 자크 루소
이전 글에서 파이썬 내장 함수 중 처음에 유용하게 사용할 수 있는 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)
여기까지가 파이썬에서 특별하게 사용되는 언더스코어의 기능이라고 볼 수 있습니다. 이 외의 대부분 사용되는 경우들은 다른 프로그래밍 언어들과 비슷하게 변수나 함수의 네이밍에 사용되는 경우입니다.
'A. Programming > Python' 카테고리의 다른 글
[파이썬 코딩 #2] 텍스트 파일 저장하기 - 로또(Lotto) 번호 생성 프로그램 - 2 (0) | 2022.01.06 |
---|---|
[파이썬 코딩 #1] 랜덤 숫자 생성 - 로또(Lotto) 번호 생성 프로그램 - 1 (0) | 2021.12.24 |
[파이썬 기초] dir(), help() 내장 함수(빌트인 함수) 사용법 (1) | 2021.09.07 |
[파이썬 기초] 인덱싱(Indexing), 슬라이싱(Slicing), 불변(immutable), 가변(mutable) (0) | 2021.08.13 |
[파이썬 기초] 자료형과 변수 (0) | 2021.08.06 |