Python은 객체지향 프로그래밍(OOP) 이며, Python 에서는 모든 것이 객체입니다.
객체는 데이터와 기능을 하나로 묶어 표현하는 개념을 말합니다
예를 들어 자동차 한 대가 있다고 해봅시다. 그럼 이 자동차 라는 '개념' 안에는
어떤 엔진을 쓰는지, 어떤 바퀴를 쓰는지, 좌석이 얼마나 있는지, 핸들이 어느정도 돌아갔는지 등의 수많은 '데이터'들과,
이동하고 멈추고 방향전환을 하고 짐을 싣는 등 수많은 '기능'들이 있을 수 있습니다.
이런 데이터와 기능을 하나로 묶어 '자동차'라고 표현하는 개념과 '객체'의 개념이 크게 다르지 않습니다.
우리가 사는 물리 세계에서 위의 데이터와 기능을 묶어 자동차라는 개념으로 인식하듯이,
소프트웨어 세계에서는 데이터와 기능을 묶어 하나의 '객체'라는 개념으로 인식하는 것이죠.
심지어 숫자 '1'이 달랑 있다고 해도
그 안에 정수 1 이라는 '데이터'가 저장되어 있고,
연산과 비교, 변환 등 다양한 '기능'을 내포하고 있기 때문에
'1' 도 객체지향 프로그래밍에서는 당연히 객체입니다.
위의 자동차 예시를 다시 가져와보면 자동차 안의 엔진과 바퀴, 핸들, 좌석 등 모두가 각각의 객체가 될 수도 있는 것이죠.
더욱 재밌는 사실을 심지어 Python 스스로도 클래스와 객체로 만들어져있다는 것입니다.
'클래스'는 이러한 객체를 만드는 틀이자 설계도라고 볼 수 있습니다.
객체의 '속성과 기능'을 '변수와 메서드'로 정의하고, 여러개의 객체를 만들어 낼 수 있습니다.
자동차라는 클래스에 여러 데이터(엔진,바퀴,헨들 등)와 기능(주행, 적재 등)을 정해두고,
실제 자동차라는 객체를 만들어 내는 거죠.
또한 "자동차"라는 상위 설계도를 가지고 기존의 속성과 기능들을 유지하면서 일부 기능만 수정하는것도 가능합니다.
예를 들어 좌석을 줄이고 적재공간을 넓혀 "트럭" 설계도를 만들 수 있고,
엔진의 출력을 높이고 공기저항을 줄여 "스포츠카" 설계도를 만들 수 있는 것처럼
기존 클래스의 변수와 메서드를 그대로 가져와 일부만 변경하여 재사용이 가능하며, 이를 "상속"이라고 합니다.
이때 상위 클래스를 "부모 클래스" 혹은 "super class" 라고 부르고,
하위 클래스를 "자식 클래스" 혹은 "sub class"라고 부릅니다