문제가 다소 길어서 아래 코드처럼 문제를 적어보았다
Class 를 직접 구현해 보겠습니다.
Database 라는 이름의 class를 구현해 주세요.
Database 클래스는 다음의 속성(attribute)들을 가지고 있습니다.
name : database의 이름
size : 저장할 수 있는 데이터의 max 사이즈. Size를 넘어서는 데이터를 저장할 수 없다.
Database 클래스는 다음의 메소드들을 가지고 있습니다.
insert
select
update
delete
Insert
insert 메소드는 self 외에 2개의 parameter를 받습니다.
field와 value 입니다.
Field 는 저장하고자 하는 데이터의 필드명 이고 value는 값입니다.
Field 와 value는 내부적으로 dictionary에 저장되어야 합니다.
insert 메소드는 다음 처럼 호출 할 수 있습니다.
객체 이름이 db 라는 가정하에
db.insert("name", "정우성")
insert 메소드는 특별한 리턴값은 없습니다.
만일 내부 dictionary의 총 사이즈가 database 클래스의 size 속성보다 크면 더이상 새로운 값들을 저장하지 말아야 합니다.
Select
select 메소드는 self 외에 1개의 parameter를 받습니다.
field 입니다.
Field 는 읽고자 하는 데이터의 필드명 입니다.
내부적으로 데이터를 저장하고 있는 dictionary에서 해당 field에 해당하는 키와 연결되어 있는 값을 리턴해주어야 합니다.
예를 들어, 이미 name이라는 필드명으로 "정우성" 이라는 값을 저장했다고 한다면:
객체 이름이 db 라는 가정하에
db.select("name")
> "정우성"
이 되어야 합니다.
만일 해당 필드값으로 저정되어 있는 값이 없다면 None 을 리턴해주세요.
Update
Self 외에 2개의 parameter를 받습니다.
field와 value 입니다.
이름 그대로 이미 저장되어 있는 값을 수정하는 메소드 입니다.
객체 이름이 db 라는 가정하에
db.update("name", "아이유")
만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.
그리고 특별한 리턴 값은 없습니다.
Delete
delete 메소드는 self 외에 1개의 parameter를 받습니다.
field 입니다.
Field 는 지우고자 하는 데이터의 필드명 입니다.
객체 이름이 db 라는 가정하에
db.delete("name")
만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.
그리고 특별한 리턴 값은 없습니다.
문제가 길어서 차근차근 보면서
조금씩 코드에 살을 붙여가보겠다
class Database:
# 클래스 기본 선언의 시작
def __init__(self, name, size):
# def __init__: 클래스 처음 초기화 시에 반드시 필요한 def
# 문제에서 class는 name, size를 속성으로 가진다고 했음
# 하지만 문제에서 말해주지 않아도 self는 꼭 맨 앞에 인자로 써줘야 함
self.name = name
self.size = size
# 그리고 이부분들! 자바에서 MVC 모델 배울 때, value 클래스에
# getter/setter 선언하던 방식에서 setter 방식과 같다 (자바는 this. 으로 시작)
class Database:
def __init__(self, name, size):
self.name = name
self.size = size
self.data = {}
# 여기서 이 부분이 def __init__에 생기는 이유는 insert 메소드 구현 주의 사항 중에
# ""Field 와 value는 내부적으로 dictionary에 저장되어야 합니다.""
# 라는 조건이 있었기 때문에 선언해 주어야 한다
def insert(self, field, value):
if len(self.data) < self.size:
self.data[field] =value
# 만일 내부 dictionary의 총 사이즈가
# database 클래스의 size 속성보다 크면
# 더이상 새로운 값들을 저장하지 말아야 합니다. 조건을 명시
# 여기서, len() 함수를 쓰는 것까지는 생각이 바로 났는데,
# 오히려 생각해내기 어려웠던 점은 조건을 뒤집어서 식을 쓰는 사고였다
# ""더 크면 저장하지 말아야 한다 == 더 작으면 저장한다""
# 그리고, parameter로 받고 있는 데이터와 실제 데이터 속에 들어가있는 데이터를 구분하는 것도 헷갈렸지만, 그건 진짜 말그대로 찬찬히 읽어보면 뭐가 뭔지 구분지어 알 수 있다
return
# 특별한 리턴값은 없다고 했으므로 이렇게 남기고 떠난다
class Database:
def __init__(self, name, size):
self.name = name
self.size = size
self.data = {}
def insert(self, field, value): #setter
if len(self.data) < self.size:
self.data[field] =value
return
def select(self, field):
if field in self.data:
return self.data[field]
# 특정 필드명(parameter로서 내가 넣은 field)을 가진 데이터에 값이 있다면
# 그 값을 리턴한다
else:
# 그게 아니라면, (즉 특정 필드명에 해당하는 데이터 값이 없다면)
return None
# None 리턴
class Database:
def __init__(self, name, size):
self.name = name
self.size = size
self.data = {}
def insert(self, field, value): #setter
if len(self.data) < self.size:
self.data[field] =value
return
def select(self, field):
if field in self.data:
return self.data[field]
else:
return None
def update(self, field, value):
if field in self.data:
# == if field not in self.data: (field값에 해당하는 데이터가 저장되어 있지 않다면)
# 그런데 위에서 처럼 not in으로 쓰면,
# 요 아래에 '아무것도 하지 않습니다'를 구현할 방법을 모르겠는 것이다
# 그래서 in으로 썼고
self.data[field]=value
# 그 값이 없다면 '아무것도 하지 않'겠지만
# 그 값이 있다면 update 메소드의 고유 기능에 맞추어
# '내가 넣은 값으로 원래 값을 바꾸겠습니다'를 써주었다
# 처음에 이런 식으로 적으면, 문제의 요구 사항과 완전한 동치 문장이 아닐 것이라는 생각이 들어서
# (수학 배울 때 명제 A의 역이 아니라 대..우..? 뭐 그런거 아니던가 하는 생각이 들어서;; 망설이고 있었는데)
# 위코드의 훌륭한 동료가 완전한 동치 문장으로 쓰는 위와 같은 방법을 알려주었다! ㅎㅎ
class Database:
def __init__(self, name, size):
self.name = name
self.size = size
self.data = {}
def insert(self, field, value): #setter
if len(self.data) < self.size:
self.data[field] =value
return
def select(self, field):
if field in self.data:
return self.data[field]
else:
return None
def update(self, field, value):
if field in self.data:
self.data[field]=value
def delete(self, field):
if field in self.data:
del self.data[field]
아기를 낳아본 적이 없고 앞으로도 아마 없겠지만
산통을 겪었다
ㅎㅎ.....
자... 모듈하러.. 가야지