객체지향 프로그래밍(OOP)은 컴퓨터 과학에서 전통적인 패러다임입니다.
우리가 알고 있는 OOP의 개념 중 일부는 1950년대부터 있었지만, 시뮬러 67(Simula 67)과 스몰토크(Smalltalk)가 등장하면서 OOP의 형태가 갖춰지기 시작했습니다.
OOP의 기본 아이디어는 단순하고 직관적입니다.
객체는 데이터와 기능을 논리적으로 묶어 놓은 겁니다.
OOP는 우리가 사물을 이해하는 자연스러운 방식을 반영하도록 설계됐습니다.
만약 자동차가 객체라면 그 데이터에는 제조사, 모델, 도어 숫자, 차량번호 등이 있을 겁니다.
그리고 그 기능으로는 가속, 변속, 문 열기, 헤드라이트 켜기 등이 있을 겁니다.
또한, OOP는 사물에 관해 추상적으로(어떤 자동차), 구체적으로(특정 자동차) 생각할 수 있게 합니다.
본격적으로 시작하기 전에 OOP의 기본 용어에 대해 알아봅시다.
클래스는 어떤 자동차처럼 추상적이고 범용적인 것입니다.
인스턴스 는 특정 자동차처럼 구체적이고 한정적인 것입니다.
기능은 메서드라고 부릅니다.
클래스 에 속하지만 특정 인스턴스 에 묶이지는 않는 기능을 클래스 메서드 라고 합니다.
예를 들어 ‘시동을 거는’ 기능은 클래스 메서드 라 할 수 있습니다.
인스턴스 를 처음 만들 때는 생성자(constructor) 가 실행됩니다.
생성자는 객체 인스턴스를 초기화합니다.
계층
OOP는 클래스를 계층적으로 분류하는 수단도 제공합니다.
예를 들어 자동차보다 더 범용적인 운송 수단(vehicle) 클래스가 있다고 합시다.
운송 수단 클래스에는 자동차와 마찬가지로 급유나 충전 없이 이동할 수 있는 거리인 범위 프로퍼티가 있겠지만, 자동차와 달리 바퀴는 없을 수도 있습니다.
예를 들어 보트는 바퀴가 없는 운송 수단입니다.
이때 운송 수단을 자동차의 슈퍼 클래스(superclass) 라 부르고, 자동차를 운송 수단의 서브 클래스(subclass) 라 부릅니다.
운송 수단 클래스에는 자동차, 보트, 비행기, 오토바이, 자전거 등 여러 가지 서브클래스가 있을 수 있습니다.
서브클래스 역시 서브클래스를 가질 수 있습니다.
예를 들어 보트 서브클래스에는 요트, 카누, 예인선, 모터보트 등의 서브클래스가 있을 수 있습니다.
이 장에서는 편의상 쭉 자동차를 예제로 사용하겠습니다.