객체지향적인 코드를 작성하려면 절차지향적으로 코드를 작성하지 않으면 된다.

1. 절차 지향과 객체 지향

1.1 절차 지향

데이터를 조작하는 코드를 별도로 분리해서 함수나 프로시저와 같은 형태로 만들고, 각 프로시저들이 데이터를 조작하는 방식으로 코드를 작성할 수 있다. 이렇게 프로시저(Procedure) 로 프로그램을 구성하는 기법을 절차 지향(Procedural Oriented) 프로그래밍 이라고 부른다.

다수의 프로시저들이 데이터를 공유하는 방식으로 만들어지기 때문에, 절차 지향 프로그램은 자연스럽게 데이터를 중심으로 구현하게 된다. 프로그램의 규모가 커져서 데이터 종류가 증가하고 이를 사용하는 프로시저가 증가하게 되면, 다음과 같은 문제들이 발생하게 된다.

이는 코드의 수정을 어렵게 만들며, 새로운 기능을 추가하는데 많은 구현시간(즉, 개발비용)을 투입하게 만든다.

1.2 객체 지향

절치 지향과 달리 객체 지향은 데이터 및 데이터와 관련된 프로시저를 객체(Object) 라고 불리는 단위로 묶는다. 객체는 프로시저를 실행하는데 필요한 만큼의 데이터를 가지며, 객체들이 모여 프로그램을 구성한다.

객체 지향적으로 만든 코드에서는 객체의 데이터를 변경하더라도 해당 객체로만 변화가 집중되고 다른 객체에는 영향을 주지 않기 때문에, 요구 사항의 변화가 발생했을 때 절차 지향 방식보다 프로그램을 더 쉽게 변경할 수 있는 장점을 갖는다. → 캡슐화

2. 객체(Object)

2.1 객체의 핵심은 기능을 제공하는 것

실제로 객체를 정의할 때 사용되는 것은 객체가 제공해야 할 기능 이며, 객체가 내부적으로 어떤 데이터를 갖고 있는 지로는 정의되지 않는다.

2.2 인터페이스와 클래스

객체가 제공하는 모든 오퍼레이션(기능) 집합을 객체의 인터페이스(interface) 라고 부른다. 인터페이스는 객체가 제공하는 기능에 대한 명세서일 뿐, 실제 객체가 기능을 어떻게 구현하는지에 대한 내용은 포함하고 있지 않다. 실제 객체의 구현을 정의하는 것은 클래스이다.

3. 객체의 책임과 크기

객체마다 자신만의 책임(responsibility) 이 있다. 객체에게 책임을 부여하는 것을 결정하는 것이 바로 객체 지향 설계의 출발점이다. 객체에게 어느 정도의 책임을 부여하느냐에 따라서 객체의 구성이 달라진다. 만약 한 객체에 주어진 책임이 많아진다면 하나의 객체 내부에서 데이터를 공유하는 프로시저들이 많아진다.

따라서 객체가 갖는 책임의 크기는 작아질수록 객체 지향의 장점인 변경의 유연함을 얻을 수 있게 된다. 객체의 크기와 관련된 원칙이 있는데 그 원칙은 바로 단일 책임 원칙(SRP: Single Responsibility Principle) 이다. 단일 책임 원칙은 객체는 단 한개의 책임만을 가져야 한다는 원칙이다.

4. 의존