When will you grow up?

클래스&메소드(class&method)_01 본문

02. Study/Python

클래스&메소드(class&method)_01

미카이 2022. 3. 21. 13:11

초심자는 왜(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? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.

 

Comments