객체지향 프로그래밍이 등장하기 이전에는 절차지향 프로그래밍라는 컨셉이 있었다. 이는 모든 데이터와 데이터의 프로세싱 과정을 단계별로 작성하는 것을 말한다. 단계간 이동은 고작 함수로 접근하는 것 밖에 없었다.
그러나 객체지향 프로그래밍에서는 데이터와 데이터의 프로세싱(기능)을 한꺼번에 묶어서 처리할 수 있다.
데이터와 기능은 객체로 묶이며, 메모리상에서 반환되기 전까지 객체 내의 모든 것이 유지된다.
메소드와 속성이 클래스라는 큰 틀로 감싸지는 것을 상상해 보면 이해가 쉽다.
객체지향 프로그래밍에는 캡슐화, 추상화, 상속, 다향성 이라는 4가지 특성이 있다. 각 특성이 무엇을 의미하는지 차례대로 알아보겠다.
캡슐화는 절차지향 프로그래밍에서 처럼 데이터와 기능을 코드 내 따로 정의하지 않고 한꺼번에 묶어서 클래스에 넣는 것이다.
각 객체별로 필요한 기능과 데이터가 모두 다른데, 이를 결합 시키는 것이다.
캡슐화는 "은닉화"라는 부차적인 특성도 포함하고 있는데, 이는 데이터나 기능의 구현이 외부로 노출되지 않게 하는 것이다.
추상화는 캡슐화의 "은닉화"와 겹치는 부분이 약간 있는데, 객체 내부에는 복잡한 데이터와 기능의 구현이 있을지라도, 외부에서 보았을 때 노출되는 부분은 간단하게 만든다는 개념이다. 그래야 객체를 사용하기 쉬워진다. 은닉화와 다른 점은 은닉화는 객체 안의 데이터와 데이터의 구현을 숨기는데 중심을 맞춘다면, 추상화는 객체를 사용하기 쉽게 단순화 한다는 데에 의의를 둔다.
상속은 부모 클래스가 가지는 특성을 부모 클래스에서 파생된 자식 클래스도 갖는다는 의미이다. 자식 클래스는 부모 클래스가 가지는 속성과 메소드를 모두 가지고 있으며, 이에 더하여 추가적인 속성과 메소드를 갖는다.
다향성은 같은 이름의 메소드일지라도 객체의 종류와 그 목적에 맞춰서 조금씩 다르게 작동하는 것을 의미한다. 예를들어 식물에 물을 주는 메소드, water()가 있다고 상상해 보자. 그리고 식물 클래스의 자식 클래스인 방울토마토와 선인장 클래스가 있다고 상상해 보자. 방울토마토를 키울때는 3일에 한번, 선인장을 키울때는 30일에 한번 물을 줘야 한다고 가정하자. 이 경우 water()메소드는 방울토마토이냐, 선인장이냐 여부에 따라 다르게 작동한다.