일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 완전탐색
- #실생활 영어
- Convolution Neural Network
- tensorflow update
- opencv SURF
- #실생활영어
- #영어
- #opencv
- #영어 명언
- python __init__
- #1일1영어
- 이미지 생성
- python list
- object detection
- keras
- #English
- convexhull
- tokenizing
- c언어
- #Android
- #프로젝트
- text2img
- 영어명언
- python 알고리즘
- 영어
- TensorFlow
- findContours
- #일상영어
- 딥러닝
- word embedding
- Today
- Total
When will you grow up?
클래스&메소드(class&method)_01 본문
초심자는 왜(Why) 클래스를 사용할까라는 의문이 들 수 있다. (물론 나도... 항상 초심)
예시를 보자.
만약 우리가 자동차 회사의 정보를 저장하는 업무가 주어졌다고 가정해보자.
필요한 내용은 자동차 (종류, 차량색상, 가격, 마력) 을 저장해야 된다고 가정하고,
일반적인 코딩은 다음과 같이 작성할 것이다.
파이썬 코드로 작성하면 다음과 같이 list, dict, str를 이용하여 코드를 만든다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
car_company_1 = 'Ferrari'
car_detail_1 = [
{'color': 'White'},
{'horsepower': 400},
{'price: 8000'}
]
car_company_2 = 'Bmw'
car_detail_2 = [
{'color': 'Black'},
{'horsepower': 270},
{'price': 5000}
]
car_company_3 = 'Audi'
car_detail_3 = [
{'color': 'Silver'},
{'horsepower': 300},
{'price': 6000}
]
|
cs |
하지만 위 처럼 코드를 작성하여 리스트 구조로 관리하게 되면,
지금은 3개의 종류만 저장하지만 수억개 이상이 된다면 관리가 불편하고 index로 접근 시 실수 가능성 및 삭제가 불편할 수 있다.
1
2
3
4
5
|
# 삭제 불편 및 관리 힘듦의 예시
del car_company_list[1] # 2번째 인덱스 삭제 del car_detail_list[1]
print(car_company_list)
print(car_detail_list)
|
cs |
그렇다면 딕셔너리 구조로 만든다면 다음과 같이 코드를 작성할 수 있다.
1
2
3
4
5
6
7
8
9
|
car_dicts = [
{'car_company': 'Ferrai', 'car_detail': {'color': 'White', 'horsepower': 400, 'price': 8000}},
{'car_company': 'Bmw', 'car_detail': {'color': 'Black', 'horsepower': 270, 'price': 5000}},
{'car_company': 'Audi', 'car_detail': {'color': 'Silver', 'horsepower': 300, 'price': 6000}}
]
print(car_dicts)
# 역시 지울땐, del 메소드를 이용해서 ..
del car_dicts[1]
print(car_dicts)
|
cs |
하지만 딕셔너리 구조도 마찬가지로, 위와같이 작성하게 된다면,
코드 반복 지속, 중첩(키) 문제, 키 조회 예외 처리 등등 다양한 문제가 발생할 수 있다.
이제 클래스 구조로 만들어보자
만들기 전 클래스 구조로 코드를 작성한다면
구조 설계 재사용성 증가, 코드 반복 최소화, 다양한 데코레이터를 이용한 메소드 활용에 이점이 있다.
(물론 잘 설계했을시....)
python class는 명사명으로 만드는 습관을 갖자.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Car():
def __init__(self, company, details):
self._company = company
self._details = details
# 매직메소드
def __str__(self):
return 'str : {} - {}'.format(self._company, self._details)
# str메소드랑 비슷한데, 차이점은 쉽게말하면 representation인데
# 비공식적인 사용자 입장에서 사용시에 str 메소드를 사용하고 / 객체 자료형 엄격한 타입에 따라 객체를 그대로 표시해줄때 repr 메소드를 사용한다
def __repr__(self):
return 'repr : {} - {}'.format(self._company, self._details)
|
cs |
위와 같이 클래스를 만들게 된다면
우리는 필요할때마다 객체를 만들고 아래와 같이 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
car1 = Car('Ferrari', {'color': 'White', 'horsepower': 400, 'price': 8000})
car2 = Car('Bmw', {'color': 'Black', 'horsepower': 270, 'price': 5000})
car3 = Car('Audi', {'color': 'Silver', 'horsepower': 300, 'price': 6000})
print(car1) # str 메소드 구현시 자동 호출된다. / 기본적으로 str, repr 둘 다 구현되어 있을시 str이 호출된다.
print('__dict__',car1.__dict__) # dict로 접근하게되면 이 안에 속성(init의 attribute 값들을 볼 수 있다)
print(dir(car1)) # dir 메소드를 사용하면 객체안에 있는 모든 메타정보를 보여준다
# 리스트 선언
car_list = []
car_list.append(car1)
car_list.append(car2)
car_list.append(car3)
print(car_list) # list안에서 객체정보를 보여줄때는 str 메소드가 아니라 repr 메소드가 먼저 보여준다
for x in car_list:
print(x) # 프린트문을 사용할때는 또, str이 출력되는 걸 볼 수 있다..?
print(repr(x)) # 명시적으로 보여줄 수 있기도 한다.
|
cs |
마지막으로 위와 객체 지향 프로그래밍 (OOP) 형식으로 작성하게되면 코드의 재사용, 코드 중복 방지, 유지보수, 대형프로젝트 시 협업할때 아주 유용하며,
클래스 중심 -> 데이터 중심 -> 객체로 관리 형식으로 데이터들을 관리 할 수 있다.
우리를 위한 프로그래밍 : 파이썬 중급 를 기반으로 정리하였으며,
기본적인 내용보다는 실질적으로 Why? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.
'02. Study > Python' 카테고리의 다른 글
(class, instance, static) method_03 (0) | 2022.03.21 |
---|---|
클래스 변수 & 인스턴스 변수([Class,Instance] variable)_02 (0) | 2022.03.21 |
python break, pass, continue 차이점 (0) | 2019.10.15 |
Python을 이용한 정규표현식(regular expression) (0) | 2019.08.12 |
List Comprehension(리스트 컴프리헨션) (0) | 2018.01.12 |