top of page

파이썬 (Python)의 with는 무엇이고 어떻게 사용되는지 알아보자

오류의 처리는 프로그래밍의 아주 중요한 개념입니다. 오류 처리가 없다면 개발된 애플리케이션은 효율적으로 이상입력이나 컨디션을 처리하지 못하고 대부분이 런타임 오류로 실행되 되지 않을 것입니다. 파이썬 프로그램도 예외는 아니죠.


이전 포스팅에서 try catch를 사용한 예외처리에 관하여 설명을 하였는데 이번에는 with에 관하여 예제를 통해 알아보겠습니다.


우선 try/finally의 문법으로 test_file라는 파일에 Hello World를 출력하는 코드는 아래와 같습니다.



간단하게 설명하자면:

  • file = open(‘test_file’, ‘w’) – test_file이라는 이름의 파일을 생성하고 오픈하는 프로그램에게 write의 권한을 부여 합니다

  • try – 파이썬에게 try의 아래 코드 블럭을 테스트 실행을 한다고 명령을 합니다

  • file.write(‘Hello World’) – 파이썬에게 file의 변수에 Hello World라는 문구를 기록하라고 명령합니다

  • finally – 테스트 후에 finally의 아래 코드 블럭을 실행합니다

  • file.close() – test_file을 닫습니다


tyyfinally.py라는 파일로 이 코드를 저장하고 다음의 코드로 실행합니다



코드를 실행하면 출력은 보이지 않지만 test_file을 열어보면 Hello World가 저장되어 있는 것이 보입니다.


이번에는 with로 위의 예제를 다시 코딩하여 보겠습니다. 아래와 같이 두줄이면 되는 것을 알수 있습니다.



코드의 설명:

  • with open(“test_file”, “w”) as file: – 이 라인은 두가지를 합니다. 파일을 write 권한으로 오픈하고 write를 실행한 후 닫습니다.

  • file.write(“Hello World”) – test_file에 Hello World라는 문장을 기록합니다


이 두줄의 코딩은 위의 try/finally와 동일한 코드입니다. 다른점은 두번째가 훨씬더 간략하고 명료하다는 점입니다. 코드 라인의 수를 줄이는 것이 오류를 최소화 하는 한가지의 방법입니다.


with의 이점은 파일을 열고 닫는 일을 하나의 라인에서 다한다는 점 입니다. 보통 메모리에 어떤것을 로드하고 일을 마치면 자동으로 닫는 경우에 많이 사용됩니다. open()과 close()를 해주는 것이죠.


참고로 C# 언어에서는 with대신에 using을 사용하죠. 이렇게 각 언어마다 비슷한 코드가 존재합니다.


조금 더 나아가서 다음의 기능을 사용하면서 같은 예제를 만들어 보겠습니다:

  • class – 객체 (object)를 정의시에 사용됩니다

  • def – 함수를 정의합니다

  • __init__ – 새로운 객체를 초기화 합니다

  • __enter__– 메모리를 enter할 시에 실행이 됩니다

  • __exit__ – 메모리를 exit할 시에 실행이 됩니다


예제의 코드는 다음과 같습니다:



코드의 설명:

  • class TextWriter(object): – object의 파라미터를 가진 TextWrite라는 이름의 객체를 생성합니다

  • def __init__(self, file_name): – 객체의 초기화를 하면서 file_name이라는 property를 사용 가능하게 합니다

  • self.file_name = file_name이라는 property지정

  • def __enter__(self): – memory enter시에 실행

  • self.file = open(self.file_name, ‘w’) – file이라는 값에 file_name이라는 파일을 write권한으로 오픈하며 저장합니다

  • return self.file – file을 리턴합니다

  • def __exit__(self, *args): – memory exit시에 실행

  • self.file.close() – 오픈된 file을 닫음

  • with TextWriter(‘test_file’) as tfile: – TextWriter 객체로 부터 리턴되는 값을 tfile에 저장을 함 (저장시에 memory enter를 하므로 __enter__가 실행이됨)

  • tfile.write(‘Hello World’) – tfile에 Hello World를 기록함. 이 라인 실행후에 with가 끝이 나므로 memory exit을 함 (__exit__ 이 실행되므로 열려 있던 파일이 자동으로 닫힘)


이 코드를 실행하면 위 두번째 예제의 코드와 동일하게 실행이 됩니다.


try/finally같은 유용한 예외 처리도 알아야 하지만 같은 기능이라면 with의 예제같이 코드를 간단하고 읽기쉽게 작성하는것도 아주 중요합니다.


Comments


pngegg (11)_result.webp

<Raank:랑크 /> 구독 하기 : Subscribe

감사합니다! : Thanks for submitting!

bottom of page