[PythonBasic] 클래스 (Object Oriented Programming) 문제 풀어보기

Alex of the year 2020 & 2021·2020년 7월 2일
0

Python

목록 보기
11/18
post-thumbnail

클래스 문제 풀기

문제가 다소 길어서 아래 코드처럼 문제를 적어보았다

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값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.
그리고 특별한 리턴 값은 없습니다.

문제가 길어서 차근차근 보면서
조금씩 코드에 살을 붙여가보겠다

  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. 으로 시작)
  1. 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
    # 특별한 리턴값은 없다고 했으므로 이렇게 남기고 떠난다
    
  1. 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 리턴
  1. 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의 역이 아니라 대..우..? 뭐 그런거 아니던가 하는 생각이 들어서;; 망설이고 있었는데)
      # 위코드의 훌륭한 동료가 완전한 동치 문장으로 쓰는 위와 같은 방법을 알려주었다! ㅎㅎ
  1. Delete 메소드 구현
    Delete 메소드 전까지는 모두 멘토님, 동료님들의 도움을 무지하게 많이 받았지만 이 딜리트 메소드만은 내가 혼자(??과연 이게 혼자인가 싶지만) 구현했다!! ㅎㅎ 소소해도 너무 소소하지만 그냥.. del을 생각해 낸 것에 의의를 ~_~
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]

아기를 낳아본 적이 없고 앞으로도 아마 없겠지만
산통을 겪었다
ㅎㅎ.....

자... 모듈하러.. 가야지

profile
Backend 개발 학습 아카이빙 블로그입니다. (현재는 작성하지 않습니다.)

0개의 댓글