Python | Classes - Database insert, select, update, delete

celeste·2022년 4월 3일
0

Replit) Python Basic

목록 보기
7/10
post-thumbnail

#55 Classes

Assignment

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):
        self.name = name
        self.size = size
        self.db = db
        db = {}

def insert(self, field, value):
    # dictionary의 총 사이즈 <= database 클래스의 size 때만 저장
    if db.size <= size:
        db[field] = value
    else:
        pass

def select(self, field):
    # 아래에 코드를 작성해 주세요.
    if field in db:
        return db[field]
    else:
        return None

def update(self, field, value):
    if field in db:
        db[field] = value

def delete(self, field):
    if field in db:
        del db[field]
  • self. 지정해주는 건 init에만 해주면 된다.
    • def insert 아래에 self.field = field, self.value = value 해줄 필요 없다는 것이다.
  • parameter가 아니더라도 안에 variable 처럼 써줄 수 있다
    • 빈 dictionary를 init 안에 넣고

정답 코드

class Database:
  def __init__(self, name, size):
    self.name = name
    self.size = size
    self.db   = { }
    
  def insert(self, field, value):
    if len(self.db) < self.size:
      self.db[field] = value

  def select(self, field):
    if field in self.db:
      return self.db[field]
    else:
      return None
      
  def update(self, field, value):
    if field in self.db:
      self.db[field] = value
  
  def delete(self, field):
    if field in self.db:
      del self.db[field]

틀린 부분:

  • database size 비교하는 부분에서 그냥 비교했는데 len() 사용해줘야 한다.
  • init에서 self.size = size라고 해주었지만 select에서는 다시 self.size로 돌아온다
  • self.db = db 해줄 필요 없이 self.db = {} 지정해주면 된다
  • db말고 계속 self.db라고 지칭해주어야 한다. (왜?? init에서 define 해주어서 안해줘도 되는 줄 알았음..)
  • 내부 dictionary의 총 사이즈가 Database 클래스의 size 속성보다 크면 더이상 새로운 값들을 저장하지 말아야 합니다 ➞ 궁금증 2개
    • 크면 안된다 해서 작거나 같다 했는데 왜 안되는가?
    • self.db에는 len를 붙이는데 self.size에는 안붙이는가? ⇒ size가 이미 크기라서?

🔑 self.db, self.size 등의 개념을 정확히 알아야될것 같다.

풀이

1. 먼저 Class 선언부터

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. 으로 시작)

2. insert 메소드 구현

주의~! def가 클래스 밖에 있을 때는 그냥 함수(function)라 하지만, 클래스 안에 들어간 def는 메소드라고 부름!

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
    # 특별한 리턴값은 없다고 했으므로 이렇게 남기고 떠난다

3. select 메소드 구현

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 리턴

4. update 메소드 구현

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의 역이 아니라 대..우..? 뭐 그런거 아니던가 하는 생각이 들어서;; 망설이고 있었는데)
      # 위코드의 훌륭한 동료가 완전한 동치 문장으로 쓰는 위와 같은 방법을 알려주었다! ㅎㅎ

5. Delete 메소드 구현

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]

0개의 댓글