이 포스트에서는 파이썬으로 콰인을 만드는 방법을 서술합니다.
콰인(Quine)은 미국의 철학자 윌러드 밴 오먼 콰인(Willard Van Orman Quine)에서 유래한 것으로, 자기 자신의 소스 코드를 출력하는 프로그램을 말합니다.
소스 코드와 출력 결과가 토씨 하나 틀리지 않고 완전히 같아야 하기 때문에 만들기가 까다로운 것으로 알려져 있는데, 파이썬에서는 문자열 포매팅 기호를 이용해 좀 더 간단하게 만들 수 있습니다.
우선 아래 소스 코드를 봅시다.
print("안녕하세요. 저는 %s입니다." % "홍길동") print("안녕하세요. 저는 %r입니다." % "홍길동")
이 코드의 실행 결과는 다음과 같습니다.
안녕하세요. 저는 홍길동입니다. 안녕하세요. 저는 '홍길동'입니다.
이와 같이 %s는 주어지는 값을 그대로 문자열로 포매팅하며, %r는 주어지는 값 양쪽에 작은따옴표를 붙여 문자열로 포매팅합니다.
정확히 말하자면 %s는 str() 함수를 쓴 것과 같고 %r은 repr() 함수를 쓴 것과 같은데, str() 함수는 사용자가 보기 쉬운 형태의 문자열로 출력하여 이스케이프 문자(\)를 그대로 처리하지만, repr() 함수는 문자열을 객체화하여 출력하는 것으로써 이스케이프 문자를 무시하게 됩니다.
이를 이용하여, 다음과 같은 콰인을 만들 수 있습니다.
s='s=%r\nprint(s%%s)' print(s%s)
변수 s에 ‘s=%r\nprint(s%%s)’을 대입하고 s에 s를 객체화된 문자열로 포매팅해서 출력하는 소스입니다. 그러면 %r 자리에는 's=%r\nprint(s%%s)'
라는 문자열이 들어가게 되고 안쪽의 \n 문자는 무시되지만, 그 뒤의 \n 문자는 그대로 적용되어,
s='s=%r\nprint(s%%s)' print(s%s)
이와 같이 출력되는 문자열이 소스 코드와 정확히 일치하게 됩니다.