[C] 분식집 손님 관리 프로그램
저번 2학기를 시작하면서 C프로그래밍2 수업을 듣게 됐는데 강의계획서를 보니 종강 전까지 소형 프로젝트 개발이 강의평가 요소 중 하나였습니다. 어차피 저는 C 문법은 다 아는 상태여서 어느 정도 규모 있는 프로젝트를 진행해보고 싶었습니다. '규모 있는'이라는 표현을 사용했는데 저희 학과가 프로그래밍을 깊게 배우는 학과가 아니라 수강생 사이에서 상대적으로는 어느 정도 규모 있다 판단하여 사용해봤는데요, 누가 보면 코웃음 칠 만한 규모일 수도 있겠네요.
설레는 마음으로 슬금슬금 만들기 시작하다가 기본적인 기능들은 당일 날 마무리하게 됐습니다. 원래 당일치기를 할 생각은 없었지만, 오랜만에 C 문법을 접하게 되니 시간 가는 줄 모르고 했네요.
물론 기본적인 기능만 구현된 것이고 완성도 측면에서는 많이 떨어졌습니다. 그래서 시간을 더 두고 세부 기능들과 성능을 고려하여 약 1달 이상 동안 개발을 진행하였습니다.
기획
- 프로젝트명: 분식집 손님 관리 프로그램(Customer Management)
- 제작기간: 1~2달
아직 수업을 듣진 않았지만 대충 무엇을 배울 지, 그리고 교수님께서 무엇에 중점을 두실 지 어느 정도 짐작이 가서 관리 프로그램이 제일 적합하다고 생각했습니다. 결정하게 된 가장 큰 이유는 2학기 때 배우는 포인터와 구조체와 동적 할당(그 외 선행처리기, 파일 분할 등)을 모두 효율적으로 사용할 수 있기 때문이었습니다.
일단 관리 프로그램이 적합하다고 생각은 했는데 일반적으로 프로그래밍 언어 서적(예를 들어, 대표적으로 윤성우님의 열혈강의)에 예제로 나오는 관리 프로그램과는 차별성을 두고 싶었습니다. 그래서 생각해낸 것이 정렬이었습니다. 정렬을 잘 활용하면 제가 생각해낸 프로젝트 컨셉과 어울릴 거 같아서 기본적인 CRUD 기능에 정렬 기능을 추가한 관리 프로그램을 만들기로 결정하였습니다.
소개
분식집 손님 관리 프로그램은 분식집 사장님이 손님의 정보(첫방문 순서, 이름, 나이, 전화번호, 지출액 등)를 관리하고 손님들에게 판매하여 얻은 지출액 정보를 기준으로 가게의 매출의 동향을 살피는 프로그램입니다. 손님의 정보를 기준으로 정렬하면 사장님은 이 손님이 가게의 매출에 직결되는 단골 손님인지 아닌지를 쉽게 판단할 수 있습니다.
써 놓고 보니 별 거 없는 프로그램이네요.
개발 과정(당일)
추상화를 어떻게 해야 할까?
가장 먼저 든 생각은 "헤더 파일을 어떻게 정의해야 할까?" 다른 말로, "추상화를 어떻게 해야 할까?"였습니다. 구조체의 선언은 별로 어렵지 않았는데 함수의 선언이 문제였습니다. 저는 일단 리팩토링 관점에서 되도록 한 가지의 기능만 수행하는 함수를 만들기 위해 최대한 많은 헤더 파일과 c 파일들을 만들었습니다. 이렇게 만들어서인지 최종적으로는 코드도 깔끔해지고, 조립하는 재미도 있었습니다.
strcmp 너 진짜..
개발 중 저를 아주 힘들게 한 버그가 하나 있었습니다. 이거 때매 두 시간은 날려 먹었네요. strcmp라는 녀석이었는데요, 문자열 비교를 위해 어느 부분에서 사용하다가 다른 부분에서 복붙하여 조금만 수정해서 사용했는데 문제는 그 부분에는 형식 지정자가 문자열이 아니라 정수형이었던 것이었습니다. IDE가 이 에러를 잡아주지 못하더군요.
문제가 발생되는 곳에서 의심을 해보는 게 우선인데 당연히 문제가 없을 거라고 판단했던 게 문제였네요. 뭐, 어찌 됐든 저는 위에 동적 할당과 해제하는 코드에 문제가 있는 줄 알고 이것만 2시간 동안 구글링하고 있었습니다.
너무 난잡한 파일 구조
파일이 많아지다 보니 너무 헷갈리더군요. 그래도 계속 개발을 하다 보니 익숙해지긴 했는데 뭔가 계속 생각해보니 조금 이상하더라구요. 아무리 C라도 뭔가 체계적으로 파일을 저장하여 개발하는 방법론 같은 것이 있을 거 같은데 뭐, 아직은 제가 너무 초짜라 아직은 불편을 감수하고 할 수 밖에 없네요.
개발 과정(이후)
사실 시간이 많이 지나고 난 후에 글을 쓰는 것이라 잘 생각은 나지 않습니다. 대략 추가된 기능을 적어보자면
- 파일 입/출력
- txt 파일 기반 DBMS 개발
- 영업
- 메뉴 선택
- 결제
- 미니게임(화장실 가기)
- 정렬 기준 추가
- 더 있나? 기억 X
파일 입/출력을 구현하는 데 시간이 가장 오래 걸렸던 거 같고, 미니게임을 만들면서 저 스스로에게 참신하다고 생각했던 거 같습니다. 미니게임을 만들게 된 계기는 기능 구현이 다 끝난 후 시간이 아직도 많이 남아 무엇을 더 만들까 고민하던 중, 제가 저 때 한창 알고리즘을 공부하고 있던 때라 제가 자신 있었던 "BFS 알고리즘으로 뭔가 게임을 만들 수 없을까?" 하는 생각이 문득 들었습니다. 알고리즘 문제 중에 참신한 문제가 많더라구요? 거기서 영감을 많이 받았습니다. 미니게임 설명 파일을 첨부할테니 궁금하시면 한 번 확인해 보셔도 좋을 거 같습니다.
소감
재밌었습니다. 뭐랄까.. C는 단순하지만 어려운 언어잖아요? 하지만 이런 비교적 간단한 프로젝트를 만들 때는 뭔가 복잡한 요소를 생각하지 않고 자유롭게 개발할 수 있어서 단순함이라는 특징이 저에게는 더 크게 와닿았던 거 같습니다. 안드로이드나 스프링을 공부하다보면 생각해야 할 요소들이 참 많은데 C 프로젝트를 진행하던 동안에는 막힘 없이 개발했던 거 같습니다. 근데 한 가지 저를 괴롭혔던 건 네이밍이었습니다. 이건 C 프로젝트에만 해당되는 게 아니라 지금 말해봤자 크게 의미 없을 거 같습니다.
첨부
tentenacy/customer-managemnet
Contribute to tentenacy/customer-managemnet development by creating an account on GitHub.
github.com