Python : 클래스 이해하기

Psj·2020년 10월 27일
1

Python

목록 보기
11/41
1 class Database:
2    
3    def __init__(self, name, size):
4        self.name = name  
5        self.size = size  
6        self.git = dict()
7
8    def insert(self, field, value):
9        if len(self.git) < self.size:
10           self.git[field] = value
11
12   def select(self, field):
13       if field in self.git:
14           return self.git[field]
15       else:
16           return None
17
18   def update(self, field, value):
19       if field in self.git:
20           if self.git[field]:
21               self.git[field] = value
22
23   def delete(self, field):
24       if field in self.git:
25           if self.git[field]:
26               del self.git[field]
27
28
29 oracle = Database("oracle", 500)
30
31 oracle.insert("name", "정우성")
32 oracle.select("name")
33 oracle.update("name","아이유")
34 oracle.delete("name")

-------------------------------------------------
이하는 위 코드를 프린트하는방법이다.

oracle.insert("name", "정우성")
print(oracle.git)
print(oracle.select("name"))
oracle.update("name","아이유")
print(oracle.git)

oracle.delete("name")
print(oracle.git)

해당 코드는 insert, select, update, delete 4가지 기능을 사용한것이다.

1 class Database:
2    
3    def __init__(self, name, size):
4        self.name = name  
5        self.size = size 
6        self.git = dict()
.
.
.
29 oracle = Database("oracle", 500)

먼저 해당 코드는 Database라는 클래스를 생성해줬다.
클래스 내부의 함수는 메소드라고 부르며 현재 def__init__메소드를 만들었으며 내부 속성에 name과 size를 기본속성으로 넣었다. __init__은 클래스의 기본속성을 만드는 초기화를 할때 필요한 스페셜메소드다.
self는 메소드를 만들때 앞에 꼭 들어가야하며 self가 나타내는것은 해당 클래스를 이용하는 인스턴스를 나타낸다.

oracle = Database("oracle", 500)

이것은 Database라는 클래스를 만들었으며 이 클래스라는 틀을 이용해 oracle이라는 인스턴스를 만든것이다.
우리는 이 Database 클래스를 이용하여 여러가지 인스턴스를 만들수가 있다.

1 class Database:
2    
3    def __init__(self, name, size):
4        self.name = name  
5        self.size = size  
6        self.git = dict()
.
.
.
29 oracle = Database("oracle", 500)

4,5 라인을 보면

self.name = name
self.size = size

= 의 좌측값은 해당 인스턴스(self)의.(속성명)인데 속성명은 변경이 가능하다.
= 의 우측값은 해당 속성이 가지고 있는 값을 말하는데
변수처럼 = 우측값을 좌측에 할당한다고 생각하면된다.
그러므로 =의 우측값은 def __init__(self, name, size)의 name과 size를 말하며
이것이 =의 우측 속성명인 self.name과 self.size에 할당되는것이다.

그 아랫줄 6번라인은

6        self.git = dict()

__init__(self, name, size)의 기본속성에 정해놓지 않았지만
인스턴스에 git이라는 이름을가진 딕셔너리 속성을 추가해서 만든것이다.
name, size처럼 기본속성으로 먼저 만들어놓지 않았더라도
메소드에 self.git 처럼 새롭게 추가할수가 있다

insert

1 class Database:
2    
3    def __init__(self, name, size):
4        self.name = name  
5        self.size = size  
6        self.git = dict()
7
8    def insert(self, field, value):
9        if len(self.git) < self.size:
10           self.git[field] = value
.
.
.
29 oracle = Database("oracle", 500) # Database클래스를 이용해 만든 oracle 인스턴스
30
31 oracle.insert("name", "정우성")

8,9,10 라인을 설명하자면
def insert에 field, value 속성이 있게 설정해 놓았고 self.git이라는 딕셔너리의 길이가 self.size(29번라인보면 size에 넣은 500)보다 작을때만 self.git[field]=value 가 실행된다는 것이다.
self.git[field]=value 는 31번 라인에 따라 field에 "name"이 들어가고 value에 "정우성"이 들어간다.

현재 위에서 self.git = dict() 해당 딕셔너리를 만들어 놓은상태이기때문에
self.git[field]=value는 git이라는 이름을 가진 딕셔너리에 field와 value를 키값:벨류값 으로 딕셔너리에 추가되는 방식으로 진행되고 {"name":"정우성"} 이렇게 self.git딕셔너리에 추가가 된다.

select

1 class Database:
2    
3    def __init__(self, name, size):
4        self.name = name  
5        self.size = size  
6        self.git = dict()
.
.
.
12   def select(self, field):
13       if field in self.git:
14           return self.git[field]
15       else:
16           return None
.
.
.
29 oracle = Database("oracle", 500) # Database클래스를 이용해 만든 oracle 인스턴스
30
.
32 oracle.select("name")

현재 self.git 딕셔너리에는 {"name":"정우성"}가 있는 상황이다.

12번라인의 def select(self, field)는 field라는 속성 하나만 가지고 있고
우리는 이것을 이용해 32번라인처럼 "name"을 대입하면 sel.git의 {"name":"정우성"}의 벨류값인 "정우성"이 나오게 해야한다.

13번~16번 라인을 보면 self.git이라는 딕셔너리에 field가 있으면 self.git[field]가 리턴되고 그밖에는 None이 리턴된다고 만들었다.
32번라인의 field값으로 oracle.select("name")을 주었으므로 self.git["name"]이 되고 이것은 {"name":"정우성"}의 밸류값인 "정우성"을 나타내므로 "정우성"이 나오게된다.

update

1 class Database:
2    
3    def __init__(self, name, size):
4        self.name = name  
5        self.size = size  
6        self.git = dict()
.
.
.
18   def update(self, field, value):
19       if field in self.git:
20           if self.git[field]:
21               self.git[field] = value
22
.
.
.
29 oracle = Database("oracle", 500)
30
31 oracle.insert("name", "정우성")
.
33 oracle.update("name","아이유")

위와같은 insert과정을 거쳐 현재 self.git이라는 딕셔너리에는 {"name":"정우성"} 인 상태이다.
그런데 이제 33번라인을 보면 oracle.update("name","아이유")을 넣었기때문에
18번라인의 def update(self, field, value) 메소드가 진행된다.

코드를 보면 self.git이라는 딕셔너리에 field가 있을때만 코드가 진행되게 만들었고 33번라인에 따라 update메소드의 field값에는 "name"이 들어간다. 그러면 20번라인의 if self.git["name"]이 되고 "name"의 벨류값인 "아이유"를 나타내므로 self.git["name"]="아이유" 가되어 self.git 딕셔너리는 update 메소드가 중첩되어 기존의 {"name":"정우성"}이 {"name":"아이유"}로 변하게 된다.

delete

1 class Database:
2    
3    def __init__(self, name, size):
4        self.name = name  
5        self.size = size  
6        self.git = dict()
.
.
.
23   def delete(self, field):
24       if field in self.git:
25           if self.git[field]:
26               del self.git[field][value]
27
28
29 oracle = Database("oracle", 500)
30
31 oracle.insert("name", "정우성")
.
33 oracle.update("name","아이유")
34 oracle.delete("name")

현재 self.git 딕셔너리는 {"name":"아이유"}인 상태이다.
그런데 def delete(self, field) 메소드가 실행되어
최종적으로 del self.git["name"]이 되고 이것은 self.git 딕셔너리의 {"name":"아이유"}의 벨류값인 "아이유"를 나타내는데 del 이라는 기능은 키값과 벨류값 쌍삭제가 되므로 결과는 {}가 나온다.

profile
Software Developer

0개의 댓글