캡슐화
, 다형성
, 클래스 상속
을 지원하는가?데이터 접근 제한
을 걸 수 있는가?만족하면 객체 지향적, 만족하지 않으면 절차 지향적이라고 한다.
개념적으로나 물리적으로나 객체 내부의 세부적인 사항을 감추는 것
정보 은닉, 변경하기 쉬운 객체 생성을 위해 캡슐화를 진행한다.
상위 클래스의 특징을 하위 클래스에서 물려받아 코드의 중복을 제거하고 재사용성을 증대시킴
특징에는 함수, 변수, 데이터 등이 있음
상속 관계로 체계화된 구조 파악이 쉬워짐
데이터나 메소드를 변경할 때 상위만 변경하여 일관성 유지 가능
객체에서 공통된 부분을 모아 상위 개념으로 새롭게 선언하는 것
불필요한 부분을 생략하고, 객체 속성 중 공통적이고 중요한 것에만 중점을 두어 모델화 하는 것
추상화 -> 추상 클래스 -> 인터페이스 로 모델링해서 향후 다형성
으로 확장할 수 있도록 설계
객체가 가지고 있는 고유한 특성이 다른 여러 형태로 재구성되는 것
즉, 동일한 메소드의 이름이지만 클래스마다 다르게 구현되는 것
Java의 오버로딩과 오버라이딩이 대표적인 예시
해당 객체들이 다른 객체를 의존하게 되는 정도
어떤 객체가 변경될 때 이 객체에 의존하는 다른 객체도 함께 변경될 수 있음
의존성의 정도
다른 모듈에 대해 얼마나 많은 의존성을 가지고 있는지 나타냄
객체 사이의 의존성이 높으면 '결합도가 높다'고 함
객체들이 합리적인 수준으로 의존할 경우 '결합도가 낮다'고 함
결합도가 높을수록 함께 변경될 확률이 높아지므로 변경이 어려워짐
객체 사이의 결합도가 낮아 수정이 용이한 설계가 이상적임
모듈에 포함된 내부 요소들이 각각 연관되어 있는 관계의 정도
밀접한 연관이 있는 작업만 수행하는 객체를 '응집도가 높다'고 함
1개의 메소드가 내부에서 변수를 많이 사용할수록 해당 메소드와 클래스는 응집도가 높아짐
응집도를 높이기 위해서 객체는 스스로 자신의 데이터를 책임져야 함
무엇을 해서는 안 되는지
구조적 프로그래밍 : 제어 흐름의 직접적 전환에 대한 규칙
객체 지향 프로그래밍
함수형 프로그래밍
데이터와 프로세스가 동일한 모듈 내부에 위치하도록 프로그래밍하는 방식
코드를 추상화하여 직관적으로 사고할 수 있음
자동차, 동물, 사람 등 현실 세계의 객체를 유연하게 표현할 수 있음
객체는 어떠한 특성
을 가지고 있으며 특정 기능
을 수행할 수 있음
예를 들어, 자동차는 객체이고, 출발, 정지, 운행 등과 같은 기능을 수행할 수 있음
동일한 코드를 여러 곳에 분산시켰을 떄, 해당 로직을 수정하려면 모든 부분을 찾아 수정해야 함
이러한 변경점이 발생하더라도 최대한 적은 코드를 수정하여 더 많은 시간을 확보해야 함
발생한 문제를 빠르게 인지하고, 어떤 코드에서 어떤 오류가 발생했는지 빠르게 찾고, 오류를 빠르게 수정하는 것을 목표로 삼아야 하는데,
객체지향 프로그래밍은 데이터와 프로세스를 하나의 단위로 처리하는 특성을 가지고 있기 때문에, 어떤 코드에서 문제가 발생했는지 직관적으로 인지할 수 있고, 해당 로직을 수행하는 코드만 수정하면 문제가 해결될 수 있음