클래스는 객체지향의 기반이고, 리스트, 딕셔너리는 객체지향 언어인 파이썬에서 미리 만들어 놓은 클래스 기반의 자료구조이다.
즉, 리스트와 딕셔너리도 사실은 파이썬 클래스의 객체이다.
클래스 | 객체지향의 핵심 | 틀(template) 혹은 설계도 (ex. 자동차 설계도) |
리스트 | 자료구조 (내장 자료형) | 순서를 가진 값들의 모음 (ex. [1, 2, 3]) |
딕셔너리 | 자료구조 (내장 자료형) | 키-값 쌍으로 구성된 데이터 (ex. {'name': 'Dain'}) |
하드코딩
# 일반적인 코딩
# 차량1
car_company_1 = 'Ferrari'
car_detail_1 = [
{'color' : 'White'},
{'horsepower': 400},
{'price': 8000}
]
# 차량2
car_company_2 = 'Bmw'
car_detail_2 = [
{'color' : 'Black'},
{'horsepower': 270},
{'price': 5000}
]
# 차량3
car_company_3 = 'Audi'
car_detail_3 = [
{'color' : 'Silver'},
{'horsepower': 300},
{'price': 6000}
]
위 코드처럼 작성하면 100번까지 쭉 나열해야 하기 때문에 비효율적이다.
리스트
# 리스트 구조
# 관리하기 불편
# 인덱스 접근 시 실수 가능성 증가, 삭제 불편
car_company_list = ['Ferrari', 'Bmw', 'Audi']
car_detail_list = [
{'color' : 'White', 'horsepower': 400, 'price': 8000},
{'color' : 'Black', 'horsepower': 270, 'price': 5000},
{'color' : 'Silver', 'horsepower': 300, 'price': 6000}
]
# 자동차 회사 삭제
del car_company_list[1]
del car_detail_list[1]
print(car_company_list)
print(car_detail_list)
print()
print()
리스트는 0, 1, 2, ... (숫자 인덱스)를 통해 데이터에 접근한다.
즉 리스트는 순서를 기준으로 요소를 다루기 때문에,
중간에 데이터를 삽입하거나 삭제하면 전체 인덱스가 밀리거나 당겨진다.
그래서 따라서 값의 위치를 항상 정확히 알아야한다.
반면 딕셔너리는 이름(키)으로 접근하므로, 순서에 덜 의존하고, 구조적으로 특정 데이터를 직접 찾는 게 더 쉽다.
리스트 선언과 반복
# 리스트 선언
car_list = []
car_list.append(car1)
car_list.append(car2)
car_list.append(car3)
print()
print(car_list)
print()
print()
# 반복(__str__)
for x in car_list:
print(repr(x))
print(x)
딕셔너리
# 딕셔너리 구조
# 코드 반복 지속, 중첩 문제, 키 조회 예외 처리 등
cars_dicts = [
{'car_company': 'Ferrari', '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}}
]
del cars_dicts[1]
print(cars_dicts)
print()
print()
실제로 딕셔너리로 많은 데이터들이 관리되고 있다
인덱스로 접근하지 않아도 키값으로 요소에 접근할 수 있기 때문이다.
하지만 키는 유일해야 하고, 중복을 허용하지 않기 때문에 딕셔너리를 사용하면 키 조회 예외처리 문제가 따라 온다.
딕셔너리 vs 리스트
키/인덱스 | 0, 1, 2, ... (숫자 인덱스) | 키를 직접 정함 (문자열, 숫자 등 가능) |
접근 방식 | list[0] | dict["key"] |
관리의 용이성 | 인덱스가 숫자이므로 순서 유지 쉬움 | 키가 의미 있으므로 내용 파악이 쉬움 |
수정/삭제 시 | 중간 요소 삭제 시 인덱스 재정렬 발생 | 키 기반으로 접근하므로 위치 영향 없음 |
클래스 구조
# 클래스 구조
# 구조 설계 후 재사용성 증가, 코드 반복 최소화, 메소드 활용
class Car():
def __init__(self, company, details):
self._company = company
self._details = details
def __str__(self):
return 'str : {} - {}'.format(self._company, self._details)
def __repr__(self):
return 'repr : {} - {}'.format(self._company, self._details)
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.__dict__)
print(car2.__dict__)
print(car3.__dict__)
🔍 __dict__란?
- 객체 내부에 저장된 인스턴스 변수들을 딕셔너리로 반환한다.
- 이 딕셔너리는 {속성명: 값} 구조를 가지고 있다.
- 클래스 자체의 설계와는 별개로, 실제로 객체가 어떤 데이터를 가지고 있는지 확인할 수 있는 도구이다.
- 그래서 __dict__는 디버깅이나 객체 상태 확인할 때 유용하다.
매직메서드
__dict__처럼 언더스코어 두 개로 감싼 이름은 파이썬에서 특별한 의미를 가진 '매직 메서드'(magic method)' 라고 한다
- (__init__, __str__, __repr__, __dict__ 등)
- 클래스 내부에서 특정 동작을 자동으로 실행해주는 메서드
- 직접 호출하지 않아도 파이썬이 특정 상황에서 자동으로 실행
- 객체의 행동(출력, 연산, 비교 등)을 커스터마이징할 수 있게 해줌
'Python' 카테고리의 다른 글
[Python] 로그 레벨별 필터링 & 파일로 로그 저장하는 방법 (3) | 2025.05.03 |
---|---|
[Python] __str__, __repr__ 자동 생성하는 파이썬 @dataclass와 로깅 활용법 (3) | 2025.05.03 |
[Python] VSCode에서 venv로 파이썬 가상환경설정 하는 법 for Window (27) | 2025.05.02 |
[Python] 파이썬으로 엑셀 데이터 나누기 split(), dict, pandas (3) | 2025.01.11 |
[Python] VSCode에서 파이썬 사용하는 법 (12) | 2024.12.28 |