Python - Class

황인용·2019년 12월 12일
0

Python

목록 보기
30/44

Class

Class는 많은 사전적의미 중 "부류"라는 의미에 가깝다.
"부류"는 영어로 "kind", "Category"의미를 갖고 있다.
국어사전에는 동일한 범주에 속하는 대상들을 일정한 기준에 따라 나우어 놓은 갈래라고 나온다.
즉, 공통점이 많은 사람들을 가리켜 "부류"라고 하는 것이다.

예를들어

image.png
여기서 Class는 'Comedian'이 된다.
'Comedian'은 개념일뿐 실체(instance)는 '이영자', '송영이', '양세형', '유병재'가 된다.
즉 이 실체들은 object(객체)라고 한다.

Class 정의하기

image.png
Car class와 object들을 파이썬으로 정의해보자
Class의 구문은 다음과 같다

## Class Syntax
class ClassName:
    ...class 내용 코드들

Class 이름은 각 단어의 앞글자를 대문자로 사용한다. (ex. comedian => Comedian, car => Car)
만약 두가지 이상 의미를 가진 Class명이라면, 밑줄(underscore)를 사용하지 않고, 각 단어의 앞글자만 대문자로 해서 단어를 구분해준다.
(ex. ScotchWishkey, SomeReallyLongClassName)

우선 Car 라는 class를 정의하면 다음과 같다

# class 
class Car:
  pass

Class가 정의되면, 실체화(instantiate)할 수 있다. 클래스를 실체화 하는 방법은 함수를 호출하듯 클래스를 호출하면된다.

# class instantiate
hyundai = Car()
bmw = Car()

Car class를 실체(instance)화 한것이 'hyundai'와 'bmw'라는 객체(Object)이다.

하지만 현재 Car Class내에는 아무것도 안하는 비어있는 class이다. 따라서 hyundai와 bmw의 공통점들을 가지고 있는 속성들을 정의하여야 한다.

Class의 attribute(속성) 정의하기

Class에 정의되는 공통 요소들을 전문용어로 class의 attribute(성질 혹은 속성)이라고 한다.

자동차의 속성을 예를 들면...

  • Maker (ex. 현대, BMW등등)
  • 모델명(BMW305, 제네시스 등)
  • 마력(horse power)

위와 같은 속성(attibute)을 갖기 위해서는 __init__이라는 함수를 통해서 정의해주어야 한다.(class내 함수는 Method라 한다)

## __init__
class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power

여기서 __init__이라는 메소드는 class가 실체화 될때 사용되는 함수이다.
그리고 __init__메소드는 위 속성3개의 parameter 외 'self'라는 parameter도 갖는다.
이 self parameter는 어떠한 실체(instance)를 가르키는 것으로 위 예시에서 말하자면 hyundai 또는 bmw가 된다

image.png

class와 class 속성을 정리하면 다음과 같다
*__init__ 메소드는 클래스가 실체화 될때 자동으로 호출이 된다.

  • __init__ 메소드의 self 파라미터는 클래스가 실체화된 객체를 넘겨주어야 하며, 파이썬이 자동으로 넘겨준다.
  • __init__ 메소드의 self 파라미터는 항상 정의되어야 있어야 하며 맨 처음 파라미터로 정의 되어야 한다 (그래야 파이썬이 알아서 넘겨줄 수 있으므로)

Class Method

Class내에는 __init__말고도 원하는 메소드들을 원하는 대로 추가할 수 있다.
attribute는 해당 객체(instance)의 이름등의 정해진 성질이고,
Method는 move, eat 등 객체가 행할 수 있는 어떤 action이다.

## class method & arritbute
class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power

    def honk(self):
        return "빠라바라빠라밤"

      
hyundai = Car("현대", "제네시스", 500)
hyundai.honk()
> "빠라바라빠라밤"

객체(instance)에서 메소드(method)를 사용할때에는 dot(.)을 사용하여 객체를 호출하면 된다
이를 dot notation 이라고한다


<객체>.<메소드>

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

## My Solution 
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]
## My Solution class 상속
class Base:
  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
    
class Database(Base):
  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]
  
profile
dev_pang의 pang.log

0개의 댓글