ex) 도서관의 도서 관리 프로그램을 개발
'책'이라는 자료형을 구현해야 함
책에 대한 함수를 구현해야 함
책은 책이고 책에 관한 함수는 따로 있기 때문에, 같은 소스코드 파일 내에 있더라도 이 둘의 연관 여부는 단 번에 알아차리기 어렵다
객체 지향 프로그래밍(OOP)이란 프로그래밍하려는 대상을 하나의 객체(사물)로 정의하는 설계 방법으로 객체의 관점에서 구조를 만들고 사용하는 방법이다. 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미한다. 단순한 자료 구조(변수)를 넘어서 기능(메서드)을 포함한 형태로 객체를 사용하는 프로그래밍이다.
캡슐화란 데이터(속성)와 기능(메서드)을 하나의 객체 안에 넣어 묶는 것이다. 이렇게 묶음으로 데이터와 기능이 느슨하게 결합된다. 느슨한 결합(Loose Coupling)은 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다.
더해서 캡슐화라는 개념에는 은닉화(Hiding)라는 특징도 포함하고 있다. 은닉화는 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것이다. 디테일한 구현은 숨기고, 객체 외부에서 필요한 동작만 노출시킨다.
추상화의 사전적 의미:
“사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것”
객체 지향 프로그래밍에서 의미하는 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 의미한다. 이렇게 추출한 기능은 매우 복잡할 수도 있다. 추상화는 내부 구현이 복잡해도, 실제로 노출되는 부분은 단순하게 만든다는 개념도 갖고 있다. 인터페이스(interface)를 단순화 하는 것이다.
상속은 부모 클래스의 특징을 자식 클래스가 물려 받는 것이다. 클래스 간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화시켜 해당 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 한다. 즉, 클래스들 간 공유하는 속성과 기능들을 반복적으로 정의할 필요 없이 딱 한 번만 정의해두고 간편하게 재사용할 수 있어 반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근하여 사용할 수 있다.
다형성(多形性)이란 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미한다. 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할수 있는 객체 지향의 특성이다. 대표적인 예로 우리가 앞서 본 메서드 오버라이딩(method overriding)과 메서드 오버로딩(method overloading)이 있다.
메서드 오버라이딩(method overriding)을 사용하면 맥락에 맞게 재정의를 할 수 있다. 같은 이름의 메서드가 상황에 따라 다른 역할을 수행하는 것이다.