[ 파이썬 언어 공부 ] 기본적인 코드 방식을 클래스 사용 체계로 전환하기 1) 파일의 입출력 예시 - Whitmem
[ 파이썬 언어 공부 ] 기본적인 코드 방식을 클래스 사용 체계로 전환하기 1) 파일의 입출력 예시
Python Programming
2023-08-08 03:10 게시 43af7d2a6201310ee35b

2
0
125
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
이 게시물은 클래스의 문법을 이해하였으나, 정확히 왜 사용하는지, 사용 원리에 대한 이해를 돕기 이해 작성한 게시물입니다. 다음 게시물 번호부터 실질적인 클래스 설계에 대한 내용이 시작됩니다.
챕터 1. 가계부 프로그램 - 기능 측면에서 보기
여러분들은 지금 메인 파일 하나만으로 가게부 프로그램을 완성했습니다.
임시적으로 구성한 가계부 프로그램
추가하고자 하는 물품명 그리고 소비한 을 입력하면 해당 물품에 대한 가격이 차곡 차곡 쌓이는 가계부 프로그램을 만들었습니다. 이 프로그램은 아무런 문제가 없고 아주 완벽한 프로그램입니다. 사용자가 요구하는 요청을 잘 처리하며, 파일에 잘 저장합니다.
가게부에 추가할 물품 명을 입력하십시오:고구마 소비한 돈을 입력하십시오:5000 고구마 물품을 5000 원으로 추가했습니다. 가게부에 추가할 물품 명을 입력하십시오:감자 소비한 돈을 입력하십시오:5000 감자 물품을 5000 원으로 추가했습니다. 가게부에 추가할 물품 명을 입력하십시오:
텍스트 파일 결과
하지만 프로그램을 사용하던 도중, 당신은 돈이라는 변수에 천 자리 마다 콤마를 붙이려고 합니다. 그러기 위해서는 메인에 작성한 file.write내 항목 부분을 변경해야 합니다.

콤마를 붙이도록 변경
이 방법을 활용하여 콤마가 잘 붙어진 사실을 알 수 있습니다. 하지만 이 방법은 단편적인 사용외에는 이상적이지 않습니다. 소스코드 아래 또는 다른 소스코드 파일에서도 해당 가계부 txt 파일에 돈을 작성하기 위해서는 똑같이 콤마를 붙이는 소스코드를 작성해야 합니다.
반복적으로 사용하는 예
위 예시 소스코드에서는 각각 다른 아이템을 입력받고 있지만 똑같이 file.write를 사용하고 있습니다. 똑같은 소스코드를 계속해서 작성한다는 것은, 추후 한 부분을 변경하게 된다면 다른 소스코드의 영역에서 동일한 부분을 책임지고 있는 부분을 변경해야 함을 의미합니다. 가령, file.write 를 할 때 끝 마다 "원"을 제거하려면 (추후 수정하려면) 모두 없애야 합니다.
끝 마다 "원"을 제거한 모습
우리는 보통 이러한 경우에 함수를 활용합니다.
똑같이 write를 처리하는 부분을 함수로 write()로 묶어내고, 함수 밖 전역에 정의된 file을 그대로 가져와 함수 안에서 파일에 직접 쓰고 있습니다. 이 함수 write()를 사용하면, file.write()에 직접 접근할 필요 없어 함수가 대리 해 줍니다. 메인에서 간단히 만들어 사용할 때는 효율적인 방법이라고 볼 수 있겠습니다. 하지만 문제는 이 다음부터 발생합니다.
여러 장부 파일
만약 파일을 여러개로 나누어서 처리하고자 하는 경우, write 함수는 하나의 file.write()에 의존적이기 때문에 그 외 file1~file6에 대해서는 처리 할 수 없습니다. 기왕 다시 만들려면 각 file1~6에 대한 함수를 별도로 만들어야 합니다.
각 file에 대한 함수
결과적으로 재활용을 하지 못한다는 원초적인 문제로 돌아왔으며, 하나의 file 객체에 대해 함수를 직접 만드는 것은 매우 비효율적입니다. 하지만 머리를 조금 쓰면, 하나의 함수 안에 file 객체를 받아 그 변수에 대해서 처리하는 방법이 있습니다.
함수 내에 file 인자를 전달합니다.
이 방법을 사용하면 하나의 함수를 활용해서 여러 파일을 쓸 수 있게 됩니다. 현재 상황에서는 write 하나 만으로 구현하기 때문에 큰 문제는 없습니다, 하지만 직접 file1, file2, file3을 관리 해 줘야 한다는 문제가 존재하며, 이러한 file 객체를 생성하거나 끝낼 때 필히 open, close() 등의 과정을 별개 처리 해 줘야한다는 문제가 존재합니다.
close()
물론, close()를 모아서 처리하는 함수를 만들어도 됩니다. 하지만 먼 미래, 단순히 file.close()가 아닌, 각 파일에 대한 close처리시 필요한 소스코드가 100줄이라고 가정한다면, 그러한 파일 닫는 소스 코드를 main 파일에 일일이 작성하거나 선언해야 합니다. main은 가계부 프로그램을 넣어야 하는데, 파일 처리에 소스코드가 더 길어지는 배보다 배꼽이 더 커지는문제가 존재합니다.
파일 객체를 관리
또한 먼 미래, 파일 객체의 개수가 1000개로 늘어나 리스트에 담아서 관리한다고 가정하겠습니다. 어떤 경우에는 그냥 전체 리스트에 담다가, 소스코드를 작성하다보면 필요에 따라 또 다른 리스트에 넣고, 때론 이중 리스트에 넣는 경우가 발생할 수도 있습니다. 결국 이러한 행위들이 중첩되고 쌓이다보면 이해하기 힘든 소스코드로, 가독성이 좋지 아니하고, 모듈화가 제대로 이루어지지 않는 즉 유지보수가 힘든 프로그램이 만들어집니다.
어떤 새로운 기능을 넣기 위해, 리스트 방식을 다 뜯어 고쳐야 하는 상황이 발생했을 때 기존 소스코드가 리스트에 의존하고 있다면 모두 변경해야 하는 작업이 발생합니다. 이러한 작업을 최소화하고 대주제의 기능 단위로 처리하기 위해 클래스를 사용합니다.
클래스 구현 예시
클래스 사용 예시
위 코드는 먼저 가계부 관리자라는 클래스를 선언했습니다. 이 클래스는 단순히 틀 그 자체를 의미합니다. 이 클래스가 실질적으로 어떤 데이터를 담는 객체가 되면 해당 객체에 대해 각각 독립적으로 동작합니다.
생성자
이 클래스는 최초로 파일 이름을 입력 받아서, 자기 자신의 file 이라는 변수에, 파일을 열고 그 파일을 연 file객체를 내부에 담습니다. 사실상 클래스의 객체가 생성되면 안에서 알아서 파일을 열고 관리할 수 있게 됩니다.
사용자 정의 메소드 write_money()
다음으로, 클래스 안에 write_money 메소드를 의미합니다. write_money 메소드 안에서는 자기 자신에 저장된 file 객체에 대하여 write()를 수행하고 있습니다.
close()
한편, close() 를 요청 받으면 내부에서 파일 객체에 대해 flush()close()를 동시에 묶어서 처리해주고 있습니다. 외부에서 이 클래스를 사용하는 입장에서는 파일을 닫는 소스코드가 100줄이라고 하더라도, 단순히 close()만 호출 해 주면 처리 해 줍니다.
클래스 사용 예시
위 껍데기 클래스를 제대로 구현 해 놓는다면, 해당 클래스를 인스턴스화(객체화)하여 각 독립적으로 똑같은 작업을 수행할 수 있습니다. 실제 데이터들은 다르지만 똑같은 클래스에서 파생되었기 때문에 동작에 대한 흐름, 패턴을 동일하게 부여할 수 있습니다. 파일은 각각 다르게 열어두고, 각 객체에 대해 write_money을 하면 해당 객체에 대해서 write_money()가 수행되고, 각 객체별로 close()를 해주면 각 객체에 대해서 close()가 내부적으로 수행됩니다.
즉 외부 사용하는 입장에서는 내부의 소스코드를 알 필요가 전혀 없게 되는게 최고 장점입니다.
배열
객체가 배열안에 담겨있더라도 마찬가지입니다. 이 객체가 무엇인지 판단할 필요도 없으며, 다른 함수의 인자로 전달하거나 할 것 없이, 단순히 해당 객체가 확실히 "가계부 관리자"라면, 해당 객체를 가져와서 존재하는 속성, 메소드를 수행해주면 됩니다. 가져온 하나의 변수 데이터가 결국 객체를 의미하기 때문에 이런식으로 사용할 수 있게 됩니다. 즉 기능 단위로 클래스를 잘 묶어두면 호출해서 사용할 때 매우 편리합니다.
한편, 위 예시는 서로간의 종속성의 거의 없는 클래스 예시를 보여주고 있습니다. 실제 구현되는 서비스에서는 클래스와 클래스간의 종속 관계, 기타 관계가 존재하며 이는 다음 게시물에서 설명합니다.
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.