제로베이스 스쿨의 과정이 진행되면서 점차 코딩의 세계에 깊이 담그게 되었다. 얕게 알고 있던 것들을 좀 더 확실히 이해하게 되는 중이다. 특히 어제, 오늘은 클래스와 예외처리 문제를 다루면서 느낀 점들이 많았다.
요즘 코드를 작성하며 가장 신경 쓰는 부분은 객체를 별도로 분리하고, 모듈화를 위해 메서드를 나누는 과정이다. 이전에는 하나의 큰 덩어리로 코드를 작성하곤 했지만, 이번에는 개념적으로 정의되는 각각의 객체를 클래스로 구현하려고 노력했다.
"회원 계정 별로 파일을 생성하고 회원 본인 파일에 한줄 일기를 작성하는 프로그램을 만들라"
이 문제를 풀기 위해 Member
, Diary
, Management
라는 세 개의 클래스를 만들어 각각의 기능을 모듈화하여 구현했다.
첫 번째로 Member
클래스는 회원의 정보를 관리한다. set_info
와 get_info
메서드를 통해 회원 정보를 업데이트하고 조회할 수 있다.
두 번째로 Diary
클래스는 일기를 작성하고 읽는 기능을 제공한다. write_diary
메서드와 read_diary
메서드를 구현하여 사용자가 쉽게 일기를 관리할 수 있게 했다.
마지막으로 Management
클래스는 회원 관리와 일기 관리를 총괄한다. 사용자의 입력을 받아 회원가입, 로그인, 일기 쓰기, 일기 읽기 등의 기능을 제공한다.
이런 과정을 통해 코드의 모듈화와 객체지향 프로그래밍의 중요성을 체감했다. 각 클래스와 메서드가 명확한 역할을 수행함으로써 코드의 가독성과 유지 관리성이 크게 향상되었다는 것을 실감할 수 있었다.
아직도 개선해야 할 부분이 많다. 에러 처리와 입력값의 유효성 검사, 로그인과 로그아웃 기능의 구현, 그리고 전체 회원 정보 조회 기능 등이 눈에 띈다. 또한, 각 기능을 구현하는데 소요되는 시간도 줄여야 할 필요가 있다.
기능을 하나하나 구현하는 것 자체는 삐걱대면서도 해내고는 있지만, 예상보다 시간이 더 많이 걸리는 점이 만족스럽지 않다. 이를 위해 더 많은 연습과 코드 리뷰를 통해 스킬을 향상시켜야겠다.
import datetime
import os
class Member:
def __init__(self, **kwargs):
kwargs.setdefault('id', '')
kwargs.setdefault('pw', '')
kwargs.setdefault('name', '')
self._kwargs = kwargs
def set_info(self, **kwargs):
self._kwargs.update(kwargs)
def get_info(self, key):
return self._kwargs[key]
class Diary:
def __init__(self, **kwargs):
kwargs.setdefault('id', '')
kwargs.setdefault('path', '')
kwargs.setdefault('diary', '')
self._kwargs = kwargs
def make_diary(self, your_id):
directory = 'diary'
if not os.path.exists(directory):
os.makedirs(directory)
with open(f'{directory}/{your_id}_diary.txt', 'w', encoding='utf-8') as f:
f.write(f'{your_id}님의 일기\n')
f.write('='*50+'\n')
self._kwargs['path'] = f'{directory}/{your_id}_diary.txt'
def write_diary(self):
now = datetime.datetime.now()
diary = input('오늘의 일기 :\t')
with open(self._kwargs['path'], 'a', encoding='utf-8') as f:
diary_add = f'[{now.strftime("%Y-%m-%d %I:%M:%S %p")}] {diary}\n'
f.write(diary_add)
self._kwargs['diary'] += diary_add
def read_diary(self):
with open(self._kwargs['path'], 'r', encoding='utf-8') as f:
line = f.readline()
while line != '':
print(line.rstrip())
line = f.readline()
class Management:
def __init__(self):
self._members = {}
self._diarys = {}
self._auth = ''
def join_membership(self):
member = Member()
your_id = input('아이디 입력 : ')
pw = input('비밀번호 입력 : ')
name = input('이름 입력 : ')
member.set_info(id=your_id)
member.set_info(pw=pw)
member.set_info(name=name)
self.add_member(member)
self.make_diary(your_id)
def add_member(self, member):
if member.get_info('id') in self._members.keys():
print('아이디가 이미 존재합니다.')
else:
self._members[member.get_info('id')] = member
def log_in(self):
your_id = input('아이디를 입력하세요 : ')
pw = input('비밀번호를 입력하세요 : ')
try:
target = self._members[your_id]
if target.get_info('id') == your_id and target.get_info('pw') == pw:
print('로그인 성공')
self._auth = your_id
else:
print('로그인 실패. 아이디와 비밀번호가 맞는지 확인하세요')
except KeyError:
print('아이디를 확인하세요. 없는 회원입니다.')
def menu(self):
while True:
action = input('1.회원가입 2.로그인 3.한줄일기 쓰기 4.한줄일기 읽기 5.종료\t')
if action == '1':
self.join_membership()
elif action == '2':
self.log_in()
elif action == '3':
if self._auth != '':
self.write_diary(self._auth) # 일기 쓰기
else:
print('권한이 없습니다. 먼저 로그인하세요')
elif action == '4':
if self._auth != '':
self.read_diary(self._auth)
else:
print('권한이 없습니다. 먼저 로그인하세요')
elif action == '5':
print('프로그램을 종료합니다.')
break
else:
print('잘못 입력하셨습니다. 메뉴를 확인하세요')
def make_diary(self, your_id):
diary = Diary(id=your_id)
diary.make_diary(your_id)
self.add_diary(your_id, diary)
return diary
def add_diary(self, your_id, diary):
self._diarys[your_id] = diary
def write_diary(self, your_id):
your_diary = self._diarys[your_id]
your_diary.write_diary()
def read_diary(self, your_id):
your_diary = self._diarys[your_id]
your_diary.read_diary()