[Python] Class 정리

최창현·2022년 1월 3일
0

Class정의하기

class를 정의해야한다.
파이썬에서 class를 선언하기 위해서는 다음과 같이 class 키워드를 사용하면 된다.

class ClassName:
	#내용코드

참고로 class 이름은 각 단어의 앞글자를 대문자로 사용한다.
만일 한단어 이상으로 이루어져 있다면 밑줄(underscore) 없이 모든 단어를 붙이되
각 단어의 앞글자는 대문자로 해서 단어를 구분하게 된다. 아래는 예시이다.

  1. ScotchWishkey
  2. SomeReallyLongClassName

다음과 같이 Car class를 정의할 수 있다.

class Car:
pass

class가 정의되면, class로 부터 실체화(instantiate) 할 수 있다.
클래스를 실체화 하는 방법은 간단하다.
다음과 같이 함수를 호출 하듯이 클래스도 호출하면 된다.

hyundai = Car()
bmw = Car()

Car class를 실체(instance)화 한것이 hyundai와 bmw라는 객체(object)인 것이다.
하지만 Car class는 아직 아무것도 안하는 비어있는 class이다.

앞서 class는 부류 라고 배웠다. 그리고 부류란 어떠한 공통점들을 가지고 있는 것/사람 들을
이야기 한다고 배웠다. 즉 공통점이 중요한데, 자동차라면 브랜드, 엔진의 마력, 연비 등등이
공통 요소가 될 것이다. 이러한 공통 요소들을 class에서 정의 해주어야 한다.


Class의 attribute(속성)

class에 정의되는 공통 요소들을 전문어로 class의 attribute(성질 혹은 속성) 이라고 한다.
모든 자동차는 공통 요소를 가지고있다.

  1. Maker (현대, BMW 등)
  2. Model (BMW 435i, 제네시스 등)
  3. Horse Power - 마력

이 외에도 많겠지만 예제의 간단함을 위해서 위 3개만 고려한다.

위 3개의 속성들을 class에서 정의하기 위해서는 다음과 같이 init함수를 통해 정의한다.
(class 안에서 정의해주는 함수(function)는 function이라고 하지 않고 method 라고 한다)

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

먼저 init메소드의 이름을 자세히 살펴보면 , init이라는 단어의 앞 뒤에 밑줄 2개가 있다.
이렇게 앞뒤로 밑줄 2개가 있는 메소드들을 special methods라고 한다. 이들은 특별 취급을
받는다. 그 중 init메소드는 class가 실체화 될 때 사용하는 함수이다.

hyundai = Car("현대", "제네시스", 500)

여기서 이미 init 메소드가 호출 되었다. init이라고 메소드 이름을 명확하게 명시하지는 않았지만 클래스가 실체화 될 때 자동으로 init 메소드가 호출된다.

여기서 이상한점은 init 메소드의 parameter는 총 4개인데, 앞서 클래스를 실체화 할때는
3개만 넘겨주었다. self 를 빼먹었는데 self의 뜻은 바로 "자신"이다.
그래서 Myself하면 "나 자신"이고 yourself하면 "너 자신"을 이야기 한다.
그렇다면 class에서 self 는 누구를 말하는 것일까?(Class 자체를 말하는것은 아니다.)
왜냐하면 앞서 보았듯이 class 자체는 공통점이 있는 부류를 가리키는 개념 이기 때문이다.
반면에 self 는 어떠한 실체를 가르키는 단어이다. class에서 self는 class의 실체(instance)인 객체(object)를 가리킨다. 그러므로 Car class에서 self는 Car class의 객체인 hyundai나 bmw를 가리키는 것이다. 그리고 클래스를 실체화 할 때 파이썬이 해당 객체(self)를 자동으로 init함수에 넘겨준다.

간단하게 정리하자면 다음과 같다

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

Class Method

클래스에서 init 말고도 다른 메소드를 원하는 대로 추가할 수 있다.
Method와 attribute(속성)의 차이는 명사와 동사의 차이라고 생각하면 된다.
속성은 해당 객체의 이름 등의 정해진 성질인 반면에 메소드는 move, eat 등 객체가 행할 수 있는 어떠한 action같은 느낌이라고 생각할 수 있다.


Assignment

  1. Database 라는 이름의 class를 구현한다.
  2. Database 클래스 내부에 다음의 속성(attribute)들을 선언한다.
    2.1 name: database의 이름
    2.2 size: 저장할 수 있는 데이터의 max 사이즈, Size를 넘어서는 데이터를 저장할 수 없다,
class Database:
    def __init__(self, name, size):
        self.name = name
        self.size = size
        self.data = {}
  1. Database 클래스 내부에 다음의 메소드들을 구현한다.
    3.1 insert insert
    3.2 select
    3.3 update
    3.4 delete

각 메소드들에 대한 설명은 아래와 같다.


Insert

insert 메소드는 self 외에 2개의 parameter를 받는다.
field와 value이다.
field는 저장하고자 하는 데이터의 필드명이고 value는 값이다.
field와 value는 내부적으로 dictionary에 저장되어야 한다.
insert 메소드는 다음처럼 호출 할 수 있다.

#객체 이름이 db라는 가정하에
db.insert("name", "정우성")

insert 메소드는 특별한 return값은 없다.
단, 만일 내부 dictionary의 총 사이즈가 Database 클래스의 size속성보다 크면 더이상
새로운 값들을 저장하지 말아야 한다.

 def insert(self, field, value): # insert 메소드는 self 외에 2개의 parameter를 받는다. field와 value이다.
        if len(self.data) >= self.size: # dictionary(data)의 총 사이즈가 Database 클래스의 size속성보다 크면 더이상 새로운 값들 저장 X
            pass
        else: 
            self.data.update({field: value}) # dictionary(data)에 값들을 저장

Select

select 메소드는 self 외에 1개의 parameter를 받는다.

바로 field이다.
field는 읽고자 하는 데이터의 필드명이다.
내부적으로 데이터를 저장하고 있는 dictionary에서 해당field에 해당하는 키와 연결되어 있는
값을 return 해주어야 한다. 예를 들어, 이미 name이라는 필드명으로 "정우성" 이라는 값을
저장했다고 한다면

# 객체 이름이 db 라는 가정하에
db.select("name")
"정우성"

이 되어야 한다.
만약 해당 필드값으로 저장되어 있는 값이 없다면 None을 return 한다.

    def select(self, field): #select 메소드는 self 외에 1개의 parameter(field)를 받는다.
        if field not in self.data.keys(): #만약 해당 필드값으로 저장되어 있는 값이 없다면
            return None #None을 return한다.
        else:
            return self.data[field] #해당 field에 연관되는 키와 연결되어 있는 값을 return한다.

Update

self 외에 2개의 parameter를 받는다.
field와 value이다.
이름 그대로 이미 저장되어 있는 값을 수정하는 메소드이다.

#객체 이름이 db 라는 가정하에
db.update("name", "아이유")

만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않는다.
그리고 특별한 return 값은 없다.

   def update(self, field, value): #self 외에 2개의 parameter(field, value)를 받는다.
        if field not in self.data.keys() #만약 field값에 해당하는 데이터가 저장되어 있지 않다면 아무것도 하지 않는다. 그리고 특별한 return값은 없다.
            pass
        else:
            self.data.update({field: value}) #저장되어 있는 값을 수정한다.

Delete

delete 메소드는 self외에 1개의 parameter를 받는다.
field이다. field는 지우고자 하는 데이터의 필드명이다.

#객체 이름이 db라는 가정하에 
db.delete("name")

만일 field 값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않는다.
그리고 특별한 return 값은 없다.

    def delete(self, field): #self 외에 1개의 parameter(field)를 받는다
        if field not in self.data.keys(): 만약 field 값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않는다.
            pass
        else:
            del self.data[field] # 필드명을 가진 데이터를 지운다.
profile
chch_oi

0개의 댓글