TigerCow.Door

'파이썬 이론'에 해당되는 글 2건


안녕하세요. 문범우입니다.

이번 포스팅에서는 파이썬에서 사용되는 언더스코어(_)에 대해서 정리해보고자 합니다.

언더바라고도 읽는, ' _ ' 와 같은 표시를 언더스코어라고 하는데 이것이 파이썬에서는 보다 특별한 의미를 가지고 사용되는 경우가 있습니다. 어떤 의미로 어떻게 사용되는지 하나씩 알아보도록 하겠습니다.


1. 값을 무시하고 싶은 경우


제일 먼저 알아볼 경우는 값을 무시하고 싶은 경우입니다. 물론 쓰레기 변수를 만들어서 사용해도 되겠지만 언더스코어를 사용하는 경우 더 깔끔하고, 코드를 확인할 때 사용하지 않는 값임을 나타내기 때문에 보다 직관적일 수 있다고 생각합니다.

사실상, 값을 무시하는 경우가 언제 필요할까? 라는 생각이 드시는 분도 있겠지만 간단하게는 아래와 같은 코드에서 값을 무시할 경우가 생깁니다.



예제가 깔끔한지는 의문이 들지만..

대략 무슨 느낌인지 아시겠나요?

우리가 for 문을 사용할때 지정되는 인덱스가 굳이 필요 없을때가 있습니다. 이럴때 언더스코어를 사용하며 또는, 우리가 함수 등에서 한번에 두개의 값을 반환받을 때 둘 중 하나의 값만 이용하고 싶다면, 아래와 같이 사용할 수 있습니다.



즉, 우리가 원래 변수로 사용하던 곳에 대신하여 언더스코어( _ )를 사용하면 그 값은 무시하게 되는 것 입니다.



2. 숫자 자리수 구분을 하는 경우


숫자의 자리수 구분으로 사용하는 경우는 간단합니다. 우리는 보통 1000 대신 1,000와 같이 반점을 이용해 숫자를 세자리씩 구분하는데 이러한 역할이라고 생각하면 됩니다.




3. private으로 선언하고 싶은 경우


이번에는 private으로 선언하고 싶은 경우입니다. 물론 변수/메소드/클래스 등 모든 것을 포함하는데, 사실상 이는 private 이라고 보기에는 약간 애매할 수 있습니다.

예들 들어, 아래와 같이 함수와 변수를 선언했다고 생각해보겠습니다.


물론 이후에, _hello() 함수를 실행시키거나 _private_var를 출력해도 결과가 올바르게 나옵니다. 그럼 무엇때문에 private 선언이라고 하느냐?

예를 들어, 위의 코드를 hello.py 라는 이름으로 저장하고, 다른 파일에서 이를 불러온다고 생각해봅시다.

그럼 우리는 from hello import * 와 같은 식으로 모듈을 불러오게 됩니다.

하지만, 이때 언더스코어( _ )로 시작된 함수나 클래스, 변수는 사용할 수 없게됩니다. 사용할 수 없다기보다 불러와지지 않는다는 말이 맞을듯 합니다.

즉, 외부에서 모듈을 불러올때 언더스코어로 시작된 변수나 함수, 클래스는 사용하지 못하는 것입니다.

하지만.. 이 또한 사용할 수 있는 방법이 있기는 있습니다.

import 를 할때 * 를 사용해서 하는 것이 아니고, 직접 함수나 변수명을 언급하여 import를 하면 사용할 수 있게됩니다.


완벽하게 private이라고 볼 수는 없겠지만, 숨기고 싶은 함수나 변수, 클래스를 만들때는 직관적으로라도 이해하기 위해 언더스코어를 사용하여 네이밍하는 것이 좋을 것 같습니다.



4. 중복된 이름을 피하고 싶은경우


이는 맹글링을 사용한다고 표현하기도 합니다.

맹글링이란 프로그래밍 언어 자체적으로 가지고 있는 규칙에 의해서 함수나 변수의 이름을 변경하는 것을 말합니다. 즉, 파이썬에서 가지고 있는 규칙에 의해서 우리가 네이밍한 변수나 함수의 이름을 변경하는 것 입니다.

위와 같이 코드가 구현되었을 때, A 클래스와 B 클래스의 두개의 함수명이 서로 같습니다. 물론 잘 구분해서 사용한다면 문제가 없겠지만, 코드가 복잡해지고 변수이름이 다양해졌을때에는 충분히 헷갈릴 수 있게됩니다.

이럴때 각 클래스에 대해서 중복된 함수명을 우리가 만들더래도, 맹글링을 통해 알아서 구분되는 함수명으로 변경시키기 위해 더블언더스코어( __ )를 사용합니다.

즉, 다음의 코드와 같습니다.

위와 같이, 함수를 네이밍할때 그 앞에 더블언더스코어( __ )를 사용하였습니다.

그리고 각 함수를 호출하기 위해서는 하단에서 보이는 것처럼 _<클래스명><함수명>과 같이 호출해야 합니다.

즉, 같은 함수명을 가졌더라도 함수를 호출할 때 직접적으로 클래스명을 언급해주어야 하므로 코드를 이해할때 보다 직관적으로 이해할 수 있습니다.



+ 인터프리터에서 사용할 때


마지막으로 알아볼 것은 언더스코어를 인터프리터에서 사용할 때 입니다.

인터프리터에서는 마지막 변수의 값을 일시적으로 가지고 있는 용도로 사용됩니다.


위와 같이, 마지막으로 실행된 결과 값이 언더스코어에 저장되는 것을 볼 수 있습니다.

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


안녕하세요. 문범우입니다.

지난 포스팅에서 파이썬의 내장 및 외장함수까지 알아보며 파이썬에 대한 전체적인 설명은 마무리 된 것 같습니다.

추가적으로 이번 포스팅에서는 정규 표현식이라는 개념에 대해서 알아보려고 합니다.

정규 표현식은 파이썬 이외에도 많은 곳에서 사용될 수 있습니다.


1. 정규 표현식(Regular Expressions)이란?


정규 표현식(Regular Expressions)은 복잡한 문자열을 처리할 때 사용하는 기법입니다. 위에서도 말씀드렸듯, 파이썬 만의 고유 무법이 아니라 문자열을 처리하는 모든 곳에서 사용되는 것입니다. 즉, 정규표현식을 배우는 것과 파이썬과의 직접적인 연관은 크게 없습니다.

정규 표현식은 고급 주제이기 때문에 아직 프로그래밍이 익숙하지 않으신 분들에게는 많이 어려울 수 있습니다.


정규식이라고도 불리는 정규표현식은 왜 필요할까요?

아래의 간단한 예제를 보면 쉽게 이해할 수 있을 것입니다.

다음과 같은 문제가 주어졌다고 가정합니다.


- 주민등록번호를 포함하고 있는 텍스트가 있다. 이 텍스트에 포함된 모든 주민등록번호의 뒷자리를 * 문자로 변경하시오.


먼저, 정규식을 몰랐다고 했을 때 여러개의 조건을 활용하여 위의 문제를 해결하기 위한 코드를 작성한다면 다음과 같을 것입니다.



이와 다르게, 정규식을 사용한다면 아래와 같은 코드를 통해 문제를 해결할 수 있습니다.



아직 정규식에 대해 제대로 배우지 않았으니 간편히 코드만 어떤느낌인지 보시면 됩니다.

이렇게 간단한 문제 하나를 비교해보아도 한눈에 보이는 것은 코드의 복잡성입니다.

정규식으로 해결한 코드는 코드가 매우 간단하고 직관적으로 보입니다.

문자열에 대해 우리가 보다 복잡한 문제가 주어졌을때 정규식은 보다 큰 효용성을 보여줄 것입니다.

그리고 이러한 것이 우리가 정규표현식을 배우고, 알아야 할 이유와 같습니다.



2. 정규 표현식의 기초, 메타 문자


먼저 정규 표현식에서는 메타 문자라는 것을 사용 합니다.

메타문자란, 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용되는 것을 이야기 합니다.

정규 표현식에서 사용되는 메타 문자(meta characters)는 다음과 같은 것들이 있습니다.


. ^ $ * + ? { } [ ] \ | ( )


그럼 하나씩 알아보도록 하겠습니다.


먼저, 문자 클래스 [ ]

우리가 가장 먼저 살펴볼 메타 문자는 문자 클래스(character class)인 [ ] 입니다.

문자 클래스로 만들어진 정규식은 [ 과 ] 사이의 문자들과 매치하는 것 이라는 의미를 가집니다.

즉, [abc] 라는 정규 표현식이 있다면 해당 표현식의 의미는 'a, b, c 중 한개의 문자와 매치되는 것'이라는 의미를 가집니다.

예를 들어 본다면 [abc]는 문자열 "a", "before"와 매치되며 "dude"와는 매치되지 않습니다.


그리고 문자클래스 [ ] 안에서 하이픈(-)을 사용하게 되면 범위를 말하게 됩니다.

즉, [0-4] 는 [01234]와 같은 의미의 정규표현식이며 [a-e] 는 [abcde]와 같은 의미의 정규표현식 입니다.


또한 자주 사용되는 문자 클래스는 아래와 같이 별도의 표기법으로 표현할 수도 있습니다.


별도 표기법

정규 표현식

설명

\d

[0-9] 

모든 숫자와 매치되는 의미 

\D

[^0-9]

숫자가 아닌 것과 매치됨을 의미

\s

[ \t\n\r\f\v]

whitespace 문자와 매치되는 것을 의미

\S

[^ \t\n\r\f\v]

whitespace 문자가 아닌 것과 매치됨을 의미

\w

[a-zA-Z0-9]

문자+숫자와 매치 되는 것을 의미 

\W

[^a-zA-Z0-9]

문자+숫자가 아닌 것과 매치됨을 의미



두번째로, Dot(.)

정규 표현식의 Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미합니다.

즉, a.b 는 a와 b사이에 줄바꿈 문자를 제외한 어떤 문자가 들어가도 모두 매치되는 것입니다.

하지만 주의할 점은 a와 b 사이에 어떤 문자라도 하나 이상은 꼭 들어가야 매치 됩니다.

예를 들어보면, a.b 정규식과 "aab"와 "a0b"는 매치되지만 "abc"는 매치되지 않습니다. 문자 a와 b 사이에 어떤 문자가 최소 하나 존재하지 않기 때문입니다.


추가적으로, a[.]b 라는 정규식은 "a.b"와 매치되는 정규식입니다.



세번째, 반복(*)

go*gle 이라는 정규식을 보겠습니다.

여기서 반복의 의미를 가진 메타문자 * 는 해당 메타문자 앞의 문자가 0번이상 무한대로 반복될 수 있음을 의미합니다.

즉, go*gle 이라는 정규식은, "ggle", "gogle", "google", "goooooooogle" 과 모두 매치됩니다.



네번째, 반복(+)

반복을 나타내는 메타문자는 하나 더 있습니다. 바로 + 인데 *와 다른 점은, + 메타문자는 반복 회수가 최소 1번이상이어야 합니다.

즉, go+gle 이라는 정규식에 대해 "ggle"은 매치되지 않습니다.



다섯번째, 반복({m,n})

그런데, 반복 회수를 정하고 싶다면 어떻게 해야될까요?

무한번 반복까지 매치되는 것이 아니라, 예를 들어, 3번 또는 2번만 반복되는 문자열만 매치되게 하고 싶다면?

이럴떈 { } 메타문자를 이용하면 됩니다.

{m, n} 정규식을 사용하면 반복 횟수가 m부터 n까지 인 것을 매칭할 수 있습니다. 또한 m 이나 n 둘중 하나를 생략할 수 있습니다. 즉, {,3} 이라면 반복회수가 3이하인 것을 의미합니다.

이를 통한 몇가지 예시를 보면 다음과 같습니다.

go{2}gle : 해당 정규식은 o가 반드시 2번 반복되는 문자열과 매치됩니다.

go{2,4}gle : 해당 정규식은 o가 반드시 2번이상, 4번이하 반복되는 문자열과 매치됩니다.



여섯번째, 반복(?)

마지막으로 알아볼 메타문자는 ? 입니다.

? 가 의미하는 메타문자는 {0,1} 입니다.

즉 0번~1번 반복되는 것을 의미합니다.


이렇게 해서 정규식에 대한 기본적인 개념과 몇가지 메타문자에 대해 알아보았습니다.

다음 포스팅에서는 파이썬에서 정규 표현식을 지원하는 re 모듈에 대해 알아보도록 하겠습니다.

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요